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, SyntaxStablePtr, SyntaxStablePtrId, Terminal, Token,
18 TypedStablePtr, TypedSyntaxNode,
19};
20#[path = "ast_ext.rs"]
21mod ast_ext;
22#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23pub struct Trivia<'db>(ElementList<'db, Trivium<'db>, 1>);
24impl<'db> Deref for Trivia<'db> {
25 type Target = ElementList<'db, Trivium<'db>, 1>;
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29}
30impl<'db> Trivia<'db> {
31 pub fn new_green(db: &'db dyn Database, children: &[TriviumGreen<'db>]) -> TriviaGreen<'db> {
32 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
33 TriviaGreen(
34 GreenNode {
35 kind: SyntaxKind::Trivia,
36 details: GreenNodeDetails::Node {
37 children: children.iter().map(|x| x.0).collect(),
38 width,
39 },
40 }
41 .intern(db),
42 )
43 }
44}
45#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
46pub struct TriviaPtr<'db>(pub SyntaxStablePtrId<'db>);
47impl<'db> TypedStablePtr<'db> for TriviaPtr<'db> {
48 type SyntaxNode = Trivia<'db>;
49 fn untyped(self) -> SyntaxStablePtrId<'db> {
50 self.0
51 }
52 fn lookup(&self, db: &'db dyn Database) -> Trivia<'db> {
53 Trivia::from_syntax_node(db, self.0.lookup(db))
54 }
55}
56impl<'db> From<TriviaPtr<'db>> for SyntaxStablePtrId<'db> {
57 fn from(ptr: TriviaPtr<'db>) -> Self {
58 ptr.untyped()
59 }
60}
61#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
62pub struct TriviaGreen<'db>(pub GreenId<'db>);
63impl<'db> TypedSyntaxNode<'db> for Trivia<'db> {
64 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
65 type StablePtr = TriviaPtr<'db>;
66 type Green = TriviaGreen<'db>;
67 fn missing(db: &'db dyn Database) -> Self::Green {
68 TriviaGreen(
69 GreenNode {
70 kind: SyntaxKind::Trivia,
71 details: GreenNodeDetails::Node {
72 children: [].into(),
73 width: TextWidth::default(),
74 },
75 }
76 .intern(db),
77 )
78 }
79 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
80 Self(ElementList::new(node))
81 }
82 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
83 if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
84 }
85 fn as_syntax_node(&self) -> SyntaxNode<'db> {
86 self.node
87 }
88 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
89 TriviaPtr(self.node.stable_ptr(db))
90 }
91}
92#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
93pub enum Trivium<'db> {
94 SingleLineComment(TokenSingleLineComment<'db>),
95 SingleLineDocComment(TokenSingleLineDocComment<'db>),
96 SingleLineInnerComment(TokenSingleLineInnerComment<'db>),
97 Whitespace(TokenWhitespace<'db>),
98 Newline(TokenNewline<'db>),
99 Skipped(TokenSkipped<'db>),
100 SkippedNode(TriviumSkippedNode<'db>),
101}
102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
103pub struct TriviumPtr<'db>(pub SyntaxStablePtrId<'db>);
104impl<'db> TypedStablePtr<'db> for TriviumPtr<'db> {
105 type SyntaxNode = Trivium<'db>;
106 fn untyped(self) -> SyntaxStablePtrId<'db> {
107 self.0
108 }
109 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
110 Trivium::from_syntax_node(db, self.0.lookup(db))
111 }
112}
113impl<'db> From<TriviumPtr<'db>> for SyntaxStablePtrId<'db> {
114 fn from(ptr: TriviumPtr<'db>) -> Self {
115 ptr.untyped()
116 }
117}
118impl<'db> From<TokenSingleLineCommentPtr<'db>> for TriviumPtr<'db> {
119 fn from(value: TokenSingleLineCommentPtr<'db>) -> Self {
120 Self(value.0)
121 }
122}
123impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for TriviumPtr<'db> {
124 fn from(value: TokenSingleLineDocCommentPtr<'db>) -> Self {
125 Self(value.0)
126 }
127}
128impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for TriviumPtr<'db> {
129 fn from(value: TokenSingleLineInnerCommentPtr<'db>) -> Self {
130 Self(value.0)
131 }
132}
133impl<'db> From<TokenWhitespacePtr<'db>> for TriviumPtr<'db> {
134 fn from(value: TokenWhitespacePtr<'db>) -> Self {
135 Self(value.0)
136 }
137}
138impl<'db> From<TokenNewlinePtr<'db>> for TriviumPtr<'db> {
139 fn from(value: TokenNewlinePtr<'db>) -> Self {
140 Self(value.0)
141 }
142}
143impl<'db> From<TokenSkippedPtr<'db>> for TriviumPtr<'db> {
144 fn from(value: TokenSkippedPtr<'db>) -> Self {
145 Self(value.0)
146 }
147}
148impl<'db> From<TriviumSkippedNodePtr<'db>> for TriviumPtr<'db> {
149 fn from(value: TriviumSkippedNodePtr<'db>) -> Self {
150 Self(value.0)
151 }
152}
153impl<'db> From<TokenSingleLineCommentGreen<'db>> for TriviumGreen<'db> {
154 fn from(value: TokenSingleLineCommentGreen<'db>) -> Self {
155 Self(value.0)
156 }
157}
158impl<'db> From<TokenSingleLineDocCommentGreen<'db>> for TriviumGreen<'db> {
159 fn from(value: TokenSingleLineDocCommentGreen<'db>) -> Self {
160 Self(value.0)
161 }
162}
163impl<'db> From<TokenSingleLineInnerCommentGreen<'db>> for TriviumGreen<'db> {
164 fn from(value: TokenSingleLineInnerCommentGreen<'db>) -> Self {
165 Self(value.0)
166 }
167}
168impl<'db> From<TokenWhitespaceGreen<'db>> for TriviumGreen<'db> {
169 fn from(value: TokenWhitespaceGreen<'db>) -> Self {
170 Self(value.0)
171 }
172}
173impl<'db> From<TokenNewlineGreen<'db>> for TriviumGreen<'db> {
174 fn from(value: TokenNewlineGreen<'db>) -> Self {
175 Self(value.0)
176 }
177}
178impl<'db> From<TokenSkippedGreen<'db>> for TriviumGreen<'db> {
179 fn from(value: TokenSkippedGreen<'db>) -> Self {
180 Self(value.0)
181 }
182}
183impl<'db> From<TriviumSkippedNodeGreen<'db>> for TriviumGreen<'db> {
184 fn from(value: TriviumSkippedNodeGreen<'db>) -> Self {
185 Self(value.0)
186 }
187}
188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
189pub struct TriviumGreen<'db>(pub GreenId<'db>);
190impl<'db> TypedSyntaxNode<'db> for Trivium<'db> {
191 const OPTIONAL_KIND: Option<SyntaxKind> = None;
192 type StablePtr = TriviumPtr<'db>;
193 type Green = TriviumGreen<'db>;
194 fn missing(db: &'db dyn Database) -> Self::Green {
195 panic!("No missing variant.");
196 }
197 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
198 let kind = node.kind(db);
199 match kind {
200 SyntaxKind::TokenSingleLineComment => {
201 Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
202 }
203 SyntaxKind::TokenSingleLineDocComment => {
204 Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
205 }
206 SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
207 TokenSingleLineInnerComment::from_syntax_node(db, node),
208 ),
209 SyntaxKind::TokenWhitespace => {
210 Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
211 }
212 SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
213 SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
214 SyntaxKind::TriviumSkippedNode => {
215 Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
216 }
217 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
218 }
219 }
220 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
221 let kind = node.kind(db);
222 match kind {
223 SyntaxKind::TokenSingleLineComment => {
224 Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
225 }
226 SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
227 TokenSingleLineDocComment::from_syntax_node(db, node),
228 )),
229 SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
230 TokenSingleLineInnerComment::from_syntax_node(db, node),
231 )),
232 SyntaxKind::TokenWhitespace => {
233 Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
234 }
235 SyntaxKind::TokenNewline => {
236 Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
237 }
238 SyntaxKind::TokenSkipped => {
239 Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
240 }
241 SyntaxKind::TriviumSkippedNode => {
242 Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
243 }
244 _ => None,
245 }
246 }
247 fn as_syntax_node(&self) -> SyntaxNode<'db> {
248 match self {
249 Trivium::SingleLineComment(x) => x.as_syntax_node(),
250 Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
251 Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
252 Trivium::Whitespace(x) => x.as_syntax_node(),
253 Trivium::Newline(x) => x.as_syntax_node(),
254 Trivium::Skipped(x) => x.as_syntax_node(),
255 Trivium::SkippedNode(x) => x.as_syntax_node(),
256 }
257 }
258 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
259 TriviumPtr(self.as_syntax_node().long(db).stable_ptr)
260 }
261}
262impl<'db> Trivium<'db> {
263 pub fn is_variant(kind: SyntaxKind) -> bool {
265 matches!(
266 kind,
267 SyntaxKind::TokenSingleLineComment
268 | SyntaxKind::TokenSingleLineDocComment
269 | SyntaxKind::TokenSingleLineInnerComment
270 | SyntaxKind::TokenWhitespace
271 | SyntaxKind::TokenNewline
272 | SyntaxKind::TokenSkipped
273 | SyntaxKind::TriviumSkippedNode
274 )
275 }
276}
277#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
278pub enum Expr<'db> {
279 Path(ExprPath<'db>),
280 Literal(TerminalLiteralNumber<'db>),
281 ShortString(TerminalShortString<'db>),
282 String(TerminalString<'db>),
283 False(TerminalFalse<'db>),
284 True(TerminalTrue<'db>),
285 Parenthesized(ExprParenthesized<'db>),
286 Unary(ExprUnary<'db>),
287 Binary(ExprBinary<'db>),
288 Tuple(ExprListParenthesized<'db>),
289 FunctionCall(ExprFunctionCall<'db>),
290 StructCtorCall(ExprStructCtorCall<'db>),
291 Block(ExprBlock<'db>),
292 Match(ExprMatch<'db>),
293 If(ExprIf<'db>),
294 Loop(ExprLoop<'db>),
295 While(ExprWhile<'db>),
296 For(ExprFor<'db>),
297 Closure(ExprClosure<'db>),
298 ErrorPropagate(ExprErrorPropagate<'db>),
299 FieldInitShorthand(ExprFieldInitShorthand<'db>),
300 Indexed(ExprIndexed<'db>),
301 InlineMacro(ExprInlineMacro<'db>),
302 FixedSizeArray(ExprFixedSizeArray<'db>),
303 Missing(ExprMissing<'db>),
304}
305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
306pub struct ExprPtr<'db>(pub SyntaxStablePtrId<'db>);
307impl<'db> TypedStablePtr<'db> for ExprPtr<'db> {
308 type SyntaxNode = Expr<'db>;
309 fn untyped(self) -> SyntaxStablePtrId<'db> {
310 self.0
311 }
312 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
313 Expr::from_syntax_node(db, self.0.lookup(db))
314 }
315}
316impl<'db> From<ExprPtr<'db>> for SyntaxStablePtrId<'db> {
317 fn from(ptr: ExprPtr<'db>) -> Self {
318 ptr.untyped()
319 }
320}
321impl<'db> From<ExprPathPtr<'db>> for ExprPtr<'db> {
322 fn from(value: ExprPathPtr<'db>) -> Self {
323 Self(value.0)
324 }
325}
326impl<'db> From<TerminalLiteralNumberPtr<'db>> for ExprPtr<'db> {
327 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
328 Self(value.0)
329 }
330}
331impl<'db> From<TerminalShortStringPtr<'db>> for ExprPtr<'db> {
332 fn from(value: TerminalShortStringPtr<'db>) -> Self {
333 Self(value.0)
334 }
335}
336impl<'db> From<TerminalStringPtr<'db>> for ExprPtr<'db> {
337 fn from(value: TerminalStringPtr<'db>) -> Self {
338 Self(value.0)
339 }
340}
341impl<'db> From<TerminalFalsePtr<'db>> for ExprPtr<'db> {
342 fn from(value: TerminalFalsePtr<'db>) -> Self {
343 Self(value.0)
344 }
345}
346impl<'db> From<TerminalTruePtr<'db>> for ExprPtr<'db> {
347 fn from(value: TerminalTruePtr<'db>) -> Self {
348 Self(value.0)
349 }
350}
351impl<'db> From<ExprParenthesizedPtr<'db>> for ExprPtr<'db> {
352 fn from(value: ExprParenthesizedPtr<'db>) -> Self {
353 Self(value.0)
354 }
355}
356impl<'db> From<ExprUnaryPtr<'db>> for ExprPtr<'db> {
357 fn from(value: ExprUnaryPtr<'db>) -> Self {
358 Self(value.0)
359 }
360}
361impl<'db> From<ExprBinaryPtr<'db>> for ExprPtr<'db> {
362 fn from(value: ExprBinaryPtr<'db>) -> Self {
363 Self(value.0)
364 }
365}
366impl<'db> From<ExprListParenthesizedPtr<'db>> for ExprPtr<'db> {
367 fn from(value: ExprListParenthesizedPtr<'db>) -> Self {
368 Self(value.0)
369 }
370}
371impl<'db> From<ExprFunctionCallPtr<'db>> for ExprPtr<'db> {
372 fn from(value: ExprFunctionCallPtr<'db>) -> Self {
373 Self(value.0)
374 }
375}
376impl<'db> From<ExprStructCtorCallPtr<'db>> for ExprPtr<'db> {
377 fn from(value: ExprStructCtorCallPtr<'db>) -> Self {
378 Self(value.0)
379 }
380}
381impl<'db> From<ExprBlockPtr<'db>> for ExprPtr<'db> {
382 fn from(value: ExprBlockPtr<'db>) -> Self {
383 Self(value.0)
384 }
385}
386impl<'db> From<ExprMatchPtr<'db>> for ExprPtr<'db> {
387 fn from(value: ExprMatchPtr<'db>) -> Self {
388 Self(value.0)
389 }
390}
391impl<'db> From<ExprIfPtr<'db>> for ExprPtr<'db> {
392 fn from(value: ExprIfPtr<'db>) -> Self {
393 Self(value.0)
394 }
395}
396impl<'db> From<ExprLoopPtr<'db>> for ExprPtr<'db> {
397 fn from(value: ExprLoopPtr<'db>) -> Self {
398 Self(value.0)
399 }
400}
401impl<'db> From<ExprWhilePtr<'db>> for ExprPtr<'db> {
402 fn from(value: ExprWhilePtr<'db>) -> Self {
403 Self(value.0)
404 }
405}
406impl<'db> From<ExprForPtr<'db>> for ExprPtr<'db> {
407 fn from(value: ExprForPtr<'db>) -> Self {
408 Self(value.0)
409 }
410}
411impl<'db> From<ExprClosurePtr<'db>> for ExprPtr<'db> {
412 fn from(value: ExprClosurePtr<'db>) -> Self {
413 Self(value.0)
414 }
415}
416impl<'db> From<ExprErrorPropagatePtr<'db>> for ExprPtr<'db> {
417 fn from(value: ExprErrorPropagatePtr<'db>) -> Self {
418 Self(value.0)
419 }
420}
421impl<'db> From<ExprFieldInitShorthandPtr<'db>> for ExprPtr<'db> {
422 fn from(value: ExprFieldInitShorthandPtr<'db>) -> Self {
423 Self(value.0)
424 }
425}
426impl<'db> From<ExprIndexedPtr<'db>> for ExprPtr<'db> {
427 fn from(value: ExprIndexedPtr<'db>) -> Self {
428 Self(value.0)
429 }
430}
431impl<'db> From<ExprInlineMacroPtr<'db>> for ExprPtr<'db> {
432 fn from(value: ExprInlineMacroPtr<'db>) -> Self {
433 Self(value.0)
434 }
435}
436impl<'db> From<ExprFixedSizeArrayPtr<'db>> for ExprPtr<'db> {
437 fn from(value: ExprFixedSizeArrayPtr<'db>) -> Self {
438 Self(value.0)
439 }
440}
441impl<'db> From<ExprMissingPtr<'db>> for ExprPtr<'db> {
442 fn from(value: ExprMissingPtr<'db>) -> Self {
443 Self(value.0)
444 }
445}
446impl<'db> From<ExprPathGreen<'db>> for ExprGreen<'db> {
447 fn from(value: ExprPathGreen<'db>) -> Self {
448 Self(value.0)
449 }
450}
451impl<'db> From<TerminalLiteralNumberGreen<'db>> for ExprGreen<'db> {
452 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
453 Self(value.0)
454 }
455}
456impl<'db> From<TerminalShortStringGreen<'db>> for ExprGreen<'db> {
457 fn from(value: TerminalShortStringGreen<'db>) -> Self {
458 Self(value.0)
459 }
460}
461impl<'db> From<TerminalStringGreen<'db>> for ExprGreen<'db> {
462 fn from(value: TerminalStringGreen<'db>) -> Self {
463 Self(value.0)
464 }
465}
466impl<'db> From<TerminalFalseGreen<'db>> for ExprGreen<'db> {
467 fn from(value: TerminalFalseGreen<'db>) -> Self {
468 Self(value.0)
469 }
470}
471impl<'db> From<TerminalTrueGreen<'db>> for ExprGreen<'db> {
472 fn from(value: TerminalTrueGreen<'db>) -> Self {
473 Self(value.0)
474 }
475}
476impl<'db> From<ExprParenthesizedGreen<'db>> for ExprGreen<'db> {
477 fn from(value: ExprParenthesizedGreen<'db>) -> Self {
478 Self(value.0)
479 }
480}
481impl<'db> From<ExprUnaryGreen<'db>> for ExprGreen<'db> {
482 fn from(value: ExprUnaryGreen<'db>) -> Self {
483 Self(value.0)
484 }
485}
486impl<'db> From<ExprBinaryGreen<'db>> for ExprGreen<'db> {
487 fn from(value: ExprBinaryGreen<'db>) -> Self {
488 Self(value.0)
489 }
490}
491impl<'db> From<ExprListParenthesizedGreen<'db>> for ExprGreen<'db> {
492 fn from(value: ExprListParenthesizedGreen<'db>) -> Self {
493 Self(value.0)
494 }
495}
496impl<'db> From<ExprFunctionCallGreen<'db>> for ExprGreen<'db> {
497 fn from(value: ExprFunctionCallGreen<'db>) -> Self {
498 Self(value.0)
499 }
500}
501impl<'db> From<ExprStructCtorCallGreen<'db>> for ExprGreen<'db> {
502 fn from(value: ExprStructCtorCallGreen<'db>) -> Self {
503 Self(value.0)
504 }
505}
506impl<'db> From<ExprBlockGreen<'db>> for ExprGreen<'db> {
507 fn from(value: ExprBlockGreen<'db>) -> Self {
508 Self(value.0)
509 }
510}
511impl<'db> From<ExprMatchGreen<'db>> for ExprGreen<'db> {
512 fn from(value: ExprMatchGreen<'db>) -> Self {
513 Self(value.0)
514 }
515}
516impl<'db> From<ExprIfGreen<'db>> for ExprGreen<'db> {
517 fn from(value: ExprIfGreen<'db>) -> Self {
518 Self(value.0)
519 }
520}
521impl<'db> From<ExprLoopGreen<'db>> for ExprGreen<'db> {
522 fn from(value: ExprLoopGreen<'db>) -> Self {
523 Self(value.0)
524 }
525}
526impl<'db> From<ExprWhileGreen<'db>> for ExprGreen<'db> {
527 fn from(value: ExprWhileGreen<'db>) -> Self {
528 Self(value.0)
529 }
530}
531impl<'db> From<ExprForGreen<'db>> for ExprGreen<'db> {
532 fn from(value: ExprForGreen<'db>) -> Self {
533 Self(value.0)
534 }
535}
536impl<'db> From<ExprClosureGreen<'db>> for ExprGreen<'db> {
537 fn from(value: ExprClosureGreen<'db>) -> Self {
538 Self(value.0)
539 }
540}
541impl<'db> From<ExprErrorPropagateGreen<'db>> for ExprGreen<'db> {
542 fn from(value: ExprErrorPropagateGreen<'db>) -> Self {
543 Self(value.0)
544 }
545}
546impl<'db> From<ExprFieldInitShorthandGreen<'db>> for ExprGreen<'db> {
547 fn from(value: ExprFieldInitShorthandGreen<'db>) -> Self {
548 Self(value.0)
549 }
550}
551impl<'db> From<ExprIndexedGreen<'db>> for ExprGreen<'db> {
552 fn from(value: ExprIndexedGreen<'db>) -> Self {
553 Self(value.0)
554 }
555}
556impl<'db> From<ExprInlineMacroGreen<'db>> for ExprGreen<'db> {
557 fn from(value: ExprInlineMacroGreen<'db>) -> Self {
558 Self(value.0)
559 }
560}
561impl<'db> From<ExprFixedSizeArrayGreen<'db>> for ExprGreen<'db> {
562 fn from(value: ExprFixedSizeArrayGreen<'db>) -> Self {
563 Self(value.0)
564 }
565}
566impl<'db> From<ExprMissingGreen<'db>> for ExprGreen<'db> {
567 fn from(value: ExprMissingGreen<'db>) -> Self {
568 Self(value.0)
569 }
570}
571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
572pub struct ExprGreen<'db>(pub GreenId<'db>);
573impl<'db> TypedSyntaxNode<'db> for Expr<'db> {
574 const OPTIONAL_KIND: Option<SyntaxKind> = None;
575 type StablePtr = ExprPtr<'db>;
576 type Green = ExprGreen<'db>;
577 fn missing(db: &'db dyn Database) -> Self::Green {
578 ExprGreen(ExprMissing::missing(db).0)
579 }
580 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
581 let kind = node.kind(db);
582 match kind {
583 SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
584 SyntaxKind::TerminalLiteralNumber => {
585 Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
586 }
587 SyntaxKind::TerminalShortString => {
588 Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
589 }
590 SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
591 SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
592 SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
593 SyntaxKind::ExprParenthesized => {
594 Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
595 }
596 SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
597 SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
598 SyntaxKind::ExprListParenthesized => {
599 Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
600 }
601 SyntaxKind::ExprFunctionCall => {
602 Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
603 }
604 SyntaxKind::ExprStructCtorCall => {
605 Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
606 }
607 SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
608 SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
609 SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
610 SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
611 SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
612 SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
613 SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
614 SyntaxKind::ExprErrorPropagate => {
615 Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
616 }
617 SyntaxKind::ExprFieldInitShorthand => {
618 Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
619 }
620 SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
621 SyntaxKind::ExprInlineMacro => {
622 Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
623 }
624 SyntaxKind::ExprFixedSizeArray => {
625 Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
626 }
627 SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
628 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
629 }
630 }
631 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
632 let kind = node.kind(db);
633 match kind {
634 SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
635 SyntaxKind::TerminalLiteralNumber => {
636 Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
637 }
638 SyntaxKind::TerminalShortString => {
639 Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
640 }
641 SyntaxKind::TerminalString => {
642 Some(Expr::String(TerminalString::from_syntax_node(db, node)))
643 }
644 SyntaxKind::TerminalFalse => {
645 Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
646 }
647 SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
648 SyntaxKind::ExprParenthesized => {
649 Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
650 }
651 SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
652 SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
653 SyntaxKind::ExprListParenthesized => {
654 Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
655 }
656 SyntaxKind::ExprFunctionCall => {
657 Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
658 }
659 SyntaxKind::ExprStructCtorCall => {
660 Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
661 }
662 SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
663 SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
664 SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
665 SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
666 SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
667 SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
668 SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
669 SyntaxKind::ExprErrorPropagate => {
670 Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
671 }
672 SyntaxKind::ExprFieldInitShorthand => {
673 Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
674 }
675 SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
676 SyntaxKind::ExprInlineMacro => {
677 Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
678 }
679 SyntaxKind::ExprFixedSizeArray => {
680 Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
681 }
682 SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
683 _ => None,
684 }
685 }
686 fn as_syntax_node(&self) -> SyntaxNode<'db> {
687 match self {
688 Expr::Path(x) => x.as_syntax_node(),
689 Expr::Literal(x) => x.as_syntax_node(),
690 Expr::ShortString(x) => x.as_syntax_node(),
691 Expr::String(x) => x.as_syntax_node(),
692 Expr::False(x) => x.as_syntax_node(),
693 Expr::True(x) => x.as_syntax_node(),
694 Expr::Parenthesized(x) => x.as_syntax_node(),
695 Expr::Unary(x) => x.as_syntax_node(),
696 Expr::Binary(x) => x.as_syntax_node(),
697 Expr::Tuple(x) => x.as_syntax_node(),
698 Expr::FunctionCall(x) => x.as_syntax_node(),
699 Expr::StructCtorCall(x) => x.as_syntax_node(),
700 Expr::Block(x) => x.as_syntax_node(),
701 Expr::Match(x) => x.as_syntax_node(),
702 Expr::If(x) => x.as_syntax_node(),
703 Expr::Loop(x) => x.as_syntax_node(),
704 Expr::While(x) => x.as_syntax_node(),
705 Expr::For(x) => x.as_syntax_node(),
706 Expr::Closure(x) => x.as_syntax_node(),
707 Expr::ErrorPropagate(x) => x.as_syntax_node(),
708 Expr::FieldInitShorthand(x) => x.as_syntax_node(),
709 Expr::Indexed(x) => x.as_syntax_node(),
710 Expr::InlineMacro(x) => x.as_syntax_node(),
711 Expr::FixedSizeArray(x) => x.as_syntax_node(),
712 Expr::Missing(x) => x.as_syntax_node(),
713 }
714 }
715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
716 ExprPtr(self.as_syntax_node().long(db).stable_ptr)
717 }
718}
719impl<'db> Expr<'db> {
720 pub fn is_variant(kind: SyntaxKind) -> bool {
722 matches!(
723 kind,
724 SyntaxKind::ExprPath
725 | SyntaxKind::TerminalLiteralNumber
726 | SyntaxKind::TerminalShortString
727 | SyntaxKind::TerminalString
728 | SyntaxKind::TerminalFalse
729 | SyntaxKind::TerminalTrue
730 | SyntaxKind::ExprParenthesized
731 | SyntaxKind::ExprUnary
732 | SyntaxKind::ExprBinary
733 | SyntaxKind::ExprListParenthesized
734 | SyntaxKind::ExprFunctionCall
735 | SyntaxKind::ExprStructCtorCall
736 | SyntaxKind::ExprBlock
737 | SyntaxKind::ExprMatch
738 | SyntaxKind::ExprIf
739 | SyntaxKind::ExprLoop
740 | SyntaxKind::ExprWhile
741 | SyntaxKind::ExprFor
742 | SyntaxKind::ExprClosure
743 | SyntaxKind::ExprErrorPropagate
744 | SyntaxKind::ExprFieldInitShorthand
745 | SyntaxKind::ExprIndexed
746 | SyntaxKind::ExprInlineMacro
747 | SyntaxKind::ExprFixedSizeArray
748 | SyntaxKind::ExprMissing
749 )
750 }
751}
752#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
753pub struct ExprList<'db>(ElementList<'db, Expr<'db>, 2>);
754impl<'db> Deref for ExprList<'db> {
755 type Target = ElementList<'db, Expr<'db>, 2>;
756 fn deref(&self) -> &Self::Target {
757 &self.0
758 }
759}
760impl<'db> ExprList<'db> {
761 pub fn new_green(
762 db: &'db dyn Database,
763 children: &[ExprListElementOrSeparatorGreen<'db>],
764 ) -> ExprListGreen<'db> {
765 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
766 ExprListGreen(
767 GreenNode {
768 kind: SyntaxKind::ExprList,
769 details: GreenNodeDetails::Node {
770 children: children.iter().map(|x| x.id()).collect(),
771 width,
772 },
773 }
774 .intern(db),
775 )
776 }
777}
778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
779pub struct ExprListPtr<'db>(pub SyntaxStablePtrId<'db>);
780impl<'db> TypedStablePtr<'db> for ExprListPtr<'db> {
781 type SyntaxNode = ExprList<'db>;
782 fn untyped(self) -> SyntaxStablePtrId<'db> {
783 self.0
784 }
785 fn lookup(&self, db: &'db dyn Database) -> ExprList<'db> {
786 ExprList::from_syntax_node(db, self.0.lookup(db))
787 }
788}
789impl<'db> From<ExprListPtr<'db>> for SyntaxStablePtrId<'db> {
790 fn from(ptr: ExprListPtr<'db>) -> Self {
791 ptr.untyped()
792 }
793}
794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
795pub enum ExprListElementOrSeparatorGreen<'db> {
796 Separator(TerminalCommaGreen<'db>),
797 Element(ExprGreen<'db>),
798}
799impl<'db> From<TerminalCommaGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
800 fn from(value: TerminalCommaGreen<'db>) -> Self {
801 ExprListElementOrSeparatorGreen::Separator(value)
802 }
803}
804impl<'db> From<ExprGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
805 fn from(value: ExprGreen<'db>) -> Self {
806 ExprListElementOrSeparatorGreen::Element(value)
807 }
808}
809impl<'db> ExprListElementOrSeparatorGreen<'db> {
810 fn id(&self) -> GreenId<'db> {
811 match self {
812 ExprListElementOrSeparatorGreen::Separator(green) => green.0,
813 ExprListElementOrSeparatorGreen::Element(green) => green.0,
814 }
815 }
816}
817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
818pub struct ExprListGreen<'db>(pub GreenId<'db>);
819impl<'db> TypedSyntaxNode<'db> for ExprList<'db> {
820 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
821 type StablePtr = ExprListPtr<'db>;
822 type Green = ExprListGreen<'db>;
823 fn missing(db: &'db dyn Database) -> Self::Green {
824 ExprListGreen(
825 GreenNode {
826 kind: SyntaxKind::ExprList,
827 details: GreenNodeDetails::Node {
828 children: [].into(),
829 width: TextWidth::default(),
830 },
831 }
832 .intern(db),
833 )
834 }
835 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
836 Self(ElementList::new(node))
837 }
838 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
839 if node.kind(db) == SyntaxKind::ExprList {
840 Some(Self(ElementList::new(node)))
841 } else {
842 None
843 }
844 }
845 fn as_syntax_node(&self) -> SyntaxNode<'db> {
846 self.node
847 }
848 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
849 ExprListPtr(self.node.stable_ptr(db))
850 }
851}
852#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
853pub struct Arg<'db> {
854 node: SyntaxNode<'db>,
855}
856impl<'db> Arg<'db> {
857 pub const INDEX_MODIFIERS: usize = 0;
858 pub const INDEX_ARG_CLAUSE: usize = 1;
859 pub fn new_green(
860 db: &'db dyn Database,
861 modifiers: ModifierListGreen<'db>,
862 arg_clause: ArgClauseGreen<'db>,
863 ) -> ArgGreen<'db> {
864 let children = [modifiers.0, arg_clause.0];
865 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
866 ArgGreen(
867 GreenNode {
868 kind: SyntaxKind::Arg,
869 details: GreenNodeDetails::Node { children: children.into(), width },
870 }
871 .intern(db),
872 )
873 }
874}
875impl<'db> Arg<'db> {
876 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
877 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
878 }
879 pub fn arg_clause(&self, db: &'db dyn Database) -> ArgClause<'db> {
880 ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
881 }
882}
883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
884pub struct ArgPtr<'db>(pub SyntaxStablePtrId<'db>);
885impl<'db> ArgPtr<'db> {}
886impl<'db> TypedStablePtr<'db> for ArgPtr<'db> {
887 type SyntaxNode = Arg<'db>;
888 fn untyped(self) -> SyntaxStablePtrId<'db> {
889 self.0
890 }
891 fn lookup(&self, db: &'db dyn Database) -> Arg<'db> {
892 Arg::from_syntax_node(db, self.0.lookup(db))
893 }
894}
895impl<'db> From<ArgPtr<'db>> for SyntaxStablePtrId<'db> {
896 fn from(ptr: ArgPtr<'db>) -> Self {
897 ptr.untyped()
898 }
899}
900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
901pub struct ArgGreen<'db>(pub GreenId<'db>);
902impl<'db> TypedSyntaxNode<'db> for Arg<'db> {
903 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
904 type StablePtr = ArgPtr<'db>;
905 type Green = ArgGreen<'db>;
906 fn missing(db: &'db dyn Database) -> Self::Green {
907 ArgGreen(
908 GreenNode {
909 kind: SyntaxKind::Arg,
910 details: GreenNodeDetails::Node {
911 children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
912 width: TextWidth::default(),
913 },
914 }
915 .intern(db),
916 )
917 }
918 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
919 let kind = node.kind(db);
920 assert_eq!(
921 kind,
922 SyntaxKind::Arg,
923 "Unexpected SyntaxKind {:?}. Expected {:?}.",
924 kind,
925 SyntaxKind::Arg
926 );
927 Self { node }
928 }
929 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
930 let kind = node.kind(db);
931 if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
932 }
933 fn as_syntax_node(&self) -> SyntaxNode<'db> {
934 self.node
935 }
936 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
937 ArgPtr(self.node.stable_ptr(db))
938 }
939}
940#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
941pub enum ArgClause<'db> {
942 Unnamed(ArgClauseUnnamed<'db>),
943 Named(ArgClauseNamed<'db>),
944 FieldInitShorthand(ArgClauseFieldInitShorthand<'db>),
945}
946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
947pub struct ArgClausePtr<'db>(pub SyntaxStablePtrId<'db>);
948impl<'db> TypedStablePtr<'db> for ArgClausePtr<'db> {
949 type SyntaxNode = ArgClause<'db>;
950 fn untyped(self) -> SyntaxStablePtrId<'db> {
951 self.0
952 }
953 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
954 ArgClause::from_syntax_node(db, self.0.lookup(db))
955 }
956}
957impl<'db> From<ArgClausePtr<'db>> for SyntaxStablePtrId<'db> {
958 fn from(ptr: ArgClausePtr<'db>) -> Self {
959 ptr.untyped()
960 }
961}
962impl<'db> From<ArgClauseUnnamedPtr<'db>> for ArgClausePtr<'db> {
963 fn from(value: ArgClauseUnnamedPtr<'db>) -> Self {
964 Self(value.0)
965 }
966}
967impl<'db> From<ArgClauseNamedPtr<'db>> for ArgClausePtr<'db> {
968 fn from(value: ArgClauseNamedPtr<'db>) -> Self {
969 Self(value.0)
970 }
971}
972impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for ArgClausePtr<'db> {
973 fn from(value: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
974 Self(value.0)
975 }
976}
977impl<'db> From<ArgClauseUnnamedGreen<'db>> for ArgClauseGreen<'db> {
978 fn from(value: ArgClauseUnnamedGreen<'db>) -> Self {
979 Self(value.0)
980 }
981}
982impl<'db> From<ArgClauseNamedGreen<'db>> for ArgClauseGreen<'db> {
983 fn from(value: ArgClauseNamedGreen<'db>) -> Self {
984 Self(value.0)
985 }
986}
987impl<'db> From<ArgClauseFieldInitShorthandGreen<'db>> for ArgClauseGreen<'db> {
988 fn from(value: ArgClauseFieldInitShorthandGreen<'db>) -> Self {
989 Self(value.0)
990 }
991}
992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
993pub struct ArgClauseGreen<'db>(pub GreenId<'db>);
994impl<'db> TypedSyntaxNode<'db> for ArgClause<'db> {
995 const OPTIONAL_KIND: Option<SyntaxKind> = None;
996 type StablePtr = ArgClausePtr<'db>;
997 type Green = ArgClauseGreen<'db>;
998 fn missing(db: &'db dyn Database) -> Self::Green {
999 panic!("No missing variant.");
1000 }
1001 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1002 let kind = node.kind(db);
1003 match kind {
1004 SyntaxKind::ArgClauseUnnamed => {
1005 ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1006 }
1007 SyntaxKind::ArgClauseNamed => {
1008 ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1009 }
1010 SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1011 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1012 ),
1013 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1014 }
1015 }
1016 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1017 let kind = node.kind(db);
1018 match kind {
1019 SyntaxKind::ArgClauseUnnamed => {
1020 Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1021 }
1022 SyntaxKind::ArgClauseNamed => {
1023 Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1024 }
1025 SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1026 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1027 )),
1028 _ => None,
1029 }
1030 }
1031 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1032 match self {
1033 ArgClause::Unnamed(x) => x.as_syntax_node(),
1034 ArgClause::Named(x) => x.as_syntax_node(),
1035 ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1036 }
1037 }
1038 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1039 ArgClausePtr(self.as_syntax_node().long(db).stable_ptr)
1040 }
1041}
1042impl<'db> ArgClause<'db> {
1043 pub fn is_variant(kind: SyntaxKind) -> bool {
1045 matches!(
1046 kind,
1047 SyntaxKind::ArgClauseUnnamed
1048 | SyntaxKind::ArgClauseNamed
1049 | SyntaxKind::ArgClauseFieldInitShorthand
1050 )
1051 }
1052}
1053#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1054pub struct ArgClauseNamed<'db> {
1055 node: SyntaxNode<'db>,
1056}
1057impl<'db> ArgClauseNamed<'db> {
1058 pub const INDEX_NAME: usize = 0;
1059 pub const INDEX_COLON: usize = 1;
1060 pub const INDEX_VALUE: usize = 2;
1061 pub fn new_green(
1062 db: &'db dyn Database,
1063 name: TerminalIdentifierGreen<'db>,
1064 colon: TerminalColonGreen<'db>,
1065 value: ExprGreen<'db>,
1066 ) -> ArgClauseNamedGreen<'db> {
1067 let children = [name.0, colon.0, value.0];
1068 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1069 ArgClauseNamedGreen(
1070 GreenNode {
1071 kind: SyntaxKind::ArgClauseNamed,
1072 details: GreenNodeDetails::Node { children: children.into(), width },
1073 }
1074 .intern(db),
1075 )
1076 }
1077}
1078impl<'db> ArgClauseNamed<'db> {
1079 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1080 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1081 }
1082 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1083 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1084 }
1085 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1086 Expr::from_syntax_node(db, self.node.get_children(db)[2])
1087 }
1088}
1089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1090pub struct ArgClauseNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1091impl<'db> ArgClauseNamedPtr<'db> {}
1092impl<'db> TypedStablePtr<'db> for ArgClauseNamedPtr<'db> {
1093 type SyntaxNode = ArgClauseNamed<'db>;
1094 fn untyped(self) -> SyntaxStablePtrId<'db> {
1095 self.0
1096 }
1097 fn lookup(&self, db: &'db dyn Database) -> ArgClauseNamed<'db> {
1098 ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1099 }
1100}
1101impl<'db> From<ArgClauseNamedPtr<'db>> for SyntaxStablePtrId<'db> {
1102 fn from(ptr: ArgClauseNamedPtr<'db>) -> Self {
1103 ptr.untyped()
1104 }
1105}
1106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1107pub struct ArgClauseNamedGreen<'db>(pub GreenId<'db>);
1108impl<'db> TypedSyntaxNode<'db> for ArgClauseNamed<'db> {
1109 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1110 type StablePtr = ArgClauseNamedPtr<'db>;
1111 type Green = ArgClauseNamedGreen<'db>;
1112 fn missing(db: &'db dyn Database) -> Self::Green {
1113 ArgClauseNamedGreen(
1114 GreenNode {
1115 kind: SyntaxKind::ArgClauseNamed,
1116 details: GreenNodeDetails::Node {
1117 children: [
1118 TerminalIdentifier::missing(db).0,
1119 TerminalColon::missing(db).0,
1120 Expr::missing(db).0,
1121 ]
1122 .into(),
1123 width: TextWidth::default(),
1124 },
1125 }
1126 .intern(db),
1127 )
1128 }
1129 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1130 let kind = node.kind(db);
1131 assert_eq!(
1132 kind,
1133 SyntaxKind::ArgClauseNamed,
1134 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1135 kind,
1136 SyntaxKind::ArgClauseNamed
1137 );
1138 Self { node }
1139 }
1140 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1141 let kind = node.kind(db);
1142 if kind == SyntaxKind::ArgClauseNamed {
1143 Some(Self::from_syntax_node(db, node))
1144 } else {
1145 None
1146 }
1147 }
1148 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1149 self.node
1150 }
1151 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1152 ArgClauseNamedPtr(self.node.stable_ptr(db))
1153 }
1154}
1155#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1156pub struct ArgClauseUnnamed<'db> {
1157 node: SyntaxNode<'db>,
1158}
1159impl<'db> ArgClauseUnnamed<'db> {
1160 pub const INDEX_VALUE: usize = 0;
1161 pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> ArgClauseUnnamedGreen<'db> {
1162 let children = [value.0];
1163 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1164 ArgClauseUnnamedGreen(
1165 GreenNode {
1166 kind: SyntaxKind::ArgClauseUnnamed,
1167 details: GreenNodeDetails::Node { children: children.into(), width },
1168 }
1169 .intern(db),
1170 )
1171 }
1172}
1173impl<'db> ArgClauseUnnamed<'db> {
1174 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1175 Expr::from_syntax_node(db, self.node.get_children(db)[0])
1176 }
1177}
1178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1179pub struct ArgClauseUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1180impl<'db> ArgClauseUnnamedPtr<'db> {}
1181impl<'db> TypedStablePtr<'db> for ArgClauseUnnamedPtr<'db> {
1182 type SyntaxNode = ArgClauseUnnamed<'db>;
1183 fn untyped(self) -> SyntaxStablePtrId<'db> {
1184 self.0
1185 }
1186 fn lookup(&self, db: &'db dyn Database) -> ArgClauseUnnamed<'db> {
1187 ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1188 }
1189}
1190impl<'db> From<ArgClauseUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
1191 fn from(ptr: ArgClauseUnnamedPtr<'db>) -> Self {
1192 ptr.untyped()
1193 }
1194}
1195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1196pub struct ArgClauseUnnamedGreen<'db>(pub GreenId<'db>);
1197impl<'db> TypedSyntaxNode<'db> for ArgClauseUnnamed<'db> {
1198 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1199 type StablePtr = ArgClauseUnnamedPtr<'db>;
1200 type Green = ArgClauseUnnamedGreen<'db>;
1201 fn missing(db: &'db dyn Database) -> Self::Green {
1202 ArgClauseUnnamedGreen(
1203 GreenNode {
1204 kind: SyntaxKind::ArgClauseUnnamed,
1205 details: GreenNodeDetails::Node {
1206 children: [Expr::missing(db).0].into(),
1207 width: TextWidth::default(),
1208 },
1209 }
1210 .intern(db),
1211 )
1212 }
1213 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1214 let kind = node.kind(db);
1215 assert_eq!(
1216 kind,
1217 SyntaxKind::ArgClauseUnnamed,
1218 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1219 kind,
1220 SyntaxKind::ArgClauseUnnamed
1221 );
1222 Self { node }
1223 }
1224 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1225 let kind = node.kind(db);
1226 if kind == SyntaxKind::ArgClauseUnnamed {
1227 Some(Self::from_syntax_node(db, node))
1228 } else {
1229 None
1230 }
1231 }
1232 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1233 self.node
1234 }
1235 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1236 ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1237 }
1238}
1239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1240pub struct ArgClauseFieldInitShorthand<'db> {
1241 node: SyntaxNode<'db>,
1242}
1243impl<'db> ArgClauseFieldInitShorthand<'db> {
1244 pub const INDEX_COLON: usize = 0;
1245 pub const INDEX_NAME: usize = 1;
1246 pub fn new_green(
1247 db: &'db dyn Database,
1248 colon: TerminalColonGreen<'db>,
1249 name: ExprFieldInitShorthandGreen<'db>,
1250 ) -> ArgClauseFieldInitShorthandGreen<'db> {
1251 let children = [colon.0, name.0];
1252 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1253 ArgClauseFieldInitShorthandGreen(
1254 GreenNode {
1255 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1256 details: GreenNodeDetails::Node { children: children.into(), width },
1257 }
1258 .intern(db),
1259 )
1260 }
1261}
1262impl<'db> ArgClauseFieldInitShorthand<'db> {
1263 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1264 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1265 }
1266 pub fn name(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1267 ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1268 }
1269}
1270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1271pub struct ArgClauseFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1272impl<'db> ArgClauseFieldInitShorthandPtr<'db> {}
1273impl<'db> TypedStablePtr<'db> for ArgClauseFieldInitShorthandPtr<'db> {
1274 type SyntaxNode = ArgClauseFieldInitShorthand<'db>;
1275 fn untyped(self) -> SyntaxStablePtrId<'db> {
1276 self.0
1277 }
1278 fn lookup(&self, db: &'db dyn Database) -> ArgClauseFieldInitShorthand<'db> {
1279 ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1280 }
1281}
1282impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1283 fn from(ptr: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
1284 ptr.untyped()
1285 }
1286}
1287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1288pub struct ArgClauseFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1289impl<'db> TypedSyntaxNode<'db> for ArgClauseFieldInitShorthand<'db> {
1290 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1291 type StablePtr = ArgClauseFieldInitShorthandPtr<'db>;
1292 type Green = ArgClauseFieldInitShorthandGreen<'db>;
1293 fn missing(db: &'db dyn Database) -> Self::Green {
1294 ArgClauseFieldInitShorthandGreen(
1295 GreenNode {
1296 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1297 details: GreenNodeDetails::Node {
1298 children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1299 .into(),
1300 width: TextWidth::default(),
1301 },
1302 }
1303 .intern(db),
1304 )
1305 }
1306 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1307 let kind = node.kind(db);
1308 assert_eq!(
1309 kind,
1310 SyntaxKind::ArgClauseFieldInitShorthand,
1311 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1312 kind,
1313 SyntaxKind::ArgClauseFieldInitShorthand
1314 );
1315 Self { node }
1316 }
1317 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1318 let kind = node.kind(db);
1319 if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1320 Some(Self::from_syntax_node(db, node))
1321 } else {
1322 None
1323 }
1324 }
1325 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1326 self.node
1327 }
1328 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1329 ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1330 }
1331}
1332#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1333pub struct ExprFieldInitShorthand<'db> {
1334 node: SyntaxNode<'db>,
1335}
1336impl<'db> ExprFieldInitShorthand<'db> {
1337 pub const INDEX_NAME: usize = 0;
1338 pub fn new_green(
1339 db: &'db dyn Database,
1340 name: TerminalIdentifierGreen<'db>,
1341 ) -> ExprFieldInitShorthandGreen<'db> {
1342 let children = [name.0];
1343 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1344 ExprFieldInitShorthandGreen(
1345 GreenNode {
1346 kind: SyntaxKind::ExprFieldInitShorthand,
1347 details: GreenNodeDetails::Node { children: children.into(), width },
1348 }
1349 .intern(db),
1350 )
1351 }
1352}
1353impl<'db> ExprFieldInitShorthand<'db> {
1354 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1355 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1356 }
1357}
1358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1359pub struct ExprFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1360impl<'db> ExprFieldInitShorthandPtr<'db> {}
1361impl<'db> TypedStablePtr<'db> for ExprFieldInitShorthandPtr<'db> {
1362 type SyntaxNode = ExprFieldInitShorthand<'db>;
1363 fn untyped(self) -> SyntaxStablePtrId<'db> {
1364 self.0
1365 }
1366 fn lookup(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1367 ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1368 }
1369}
1370impl<'db> From<ExprFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1371 fn from(ptr: ExprFieldInitShorthandPtr<'db>) -> Self {
1372 ptr.untyped()
1373 }
1374}
1375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1376pub struct ExprFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1377impl<'db> TypedSyntaxNode<'db> for ExprFieldInitShorthand<'db> {
1378 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1379 type StablePtr = ExprFieldInitShorthandPtr<'db>;
1380 type Green = ExprFieldInitShorthandGreen<'db>;
1381 fn missing(db: &'db dyn Database) -> Self::Green {
1382 ExprFieldInitShorthandGreen(
1383 GreenNode {
1384 kind: SyntaxKind::ExprFieldInitShorthand,
1385 details: GreenNodeDetails::Node {
1386 children: [TerminalIdentifier::missing(db).0].into(),
1387 width: TextWidth::default(),
1388 },
1389 }
1390 .intern(db),
1391 )
1392 }
1393 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1394 let kind = node.kind(db);
1395 assert_eq!(
1396 kind,
1397 SyntaxKind::ExprFieldInitShorthand,
1398 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1399 kind,
1400 SyntaxKind::ExprFieldInitShorthand
1401 );
1402 Self { node }
1403 }
1404 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1405 let kind = node.kind(db);
1406 if kind == SyntaxKind::ExprFieldInitShorthand {
1407 Some(Self::from_syntax_node(db, node))
1408 } else {
1409 None
1410 }
1411 }
1412 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1413 self.node
1414 }
1415 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1416 ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1417 }
1418}
1419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1420pub struct ArgList<'db>(ElementList<'db, Arg<'db>, 2>);
1421impl<'db> Deref for ArgList<'db> {
1422 type Target = ElementList<'db, Arg<'db>, 2>;
1423 fn deref(&self) -> &Self::Target {
1424 &self.0
1425 }
1426}
1427impl<'db> ArgList<'db> {
1428 pub fn new_green(
1429 db: &'db dyn Database,
1430 children: &[ArgListElementOrSeparatorGreen<'db>],
1431 ) -> ArgListGreen<'db> {
1432 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
1433 ArgListGreen(
1434 GreenNode {
1435 kind: SyntaxKind::ArgList,
1436 details: GreenNodeDetails::Node {
1437 children: children.iter().map(|x| x.id()).collect(),
1438 width,
1439 },
1440 }
1441 .intern(db),
1442 )
1443 }
1444}
1445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1446pub struct ArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
1447impl<'db> TypedStablePtr<'db> for ArgListPtr<'db> {
1448 type SyntaxNode = ArgList<'db>;
1449 fn untyped(self) -> SyntaxStablePtrId<'db> {
1450 self.0
1451 }
1452 fn lookup(&self, db: &'db dyn Database) -> ArgList<'db> {
1453 ArgList::from_syntax_node(db, self.0.lookup(db))
1454 }
1455}
1456impl<'db> From<ArgListPtr<'db>> for SyntaxStablePtrId<'db> {
1457 fn from(ptr: ArgListPtr<'db>) -> Self {
1458 ptr.untyped()
1459 }
1460}
1461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1462pub enum ArgListElementOrSeparatorGreen<'db> {
1463 Separator(TerminalCommaGreen<'db>),
1464 Element(ArgGreen<'db>),
1465}
1466impl<'db> From<TerminalCommaGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1467 fn from(value: TerminalCommaGreen<'db>) -> Self {
1468 ArgListElementOrSeparatorGreen::Separator(value)
1469 }
1470}
1471impl<'db> From<ArgGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1472 fn from(value: ArgGreen<'db>) -> Self {
1473 ArgListElementOrSeparatorGreen::Element(value)
1474 }
1475}
1476impl<'db> ArgListElementOrSeparatorGreen<'db> {
1477 fn id(&self) -> GreenId<'db> {
1478 match self {
1479 ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1480 ArgListElementOrSeparatorGreen::Element(green) => green.0,
1481 }
1482 }
1483}
1484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1485pub struct ArgListGreen<'db>(pub GreenId<'db>);
1486impl<'db> TypedSyntaxNode<'db> for ArgList<'db> {
1487 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1488 type StablePtr = ArgListPtr<'db>;
1489 type Green = ArgListGreen<'db>;
1490 fn missing(db: &'db dyn Database) -> Self::Green {
1491 ArgListGreen(
1492 GreenNode {
1493 kind: SyntaxKind::ArgList,
1494 details: GreenNodeDetails::Node {
1495 children: [].into(),
1496 width: TextWidth::default(),
1497 },
1498 }
1499 .intern(db),
1500 )
1501 }
1502 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1503 Self(ElementList::new(node))
1504 }
1505 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1506 if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1507 }
1508 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1509 self.node
1510 }
1511 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1512 ArgListPtr(self.node.stable_ptr(db))
1513 }
1514}
1515#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1516pub struct ExprMissing<'db> {
1517 node: SyntaxNode<'db>,
1518}
1519impl<'db> ExprMissing<'db> {
1520 pub fn new_green(db: &'db dyn Database) -> ExprMissingGreen<'db> {
1521 let children = [];
1522 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1523 ExprMissingGreen(
1524 GreenNode {
1525 kind: SyntaxKind::ExprMissing,
1526 details: GreenNodeDetails::Node { children: children.into(), width },
1527 }
1528 .intern(db),
1529 )
1530 }
1531}
1532impl<'db> ExprMissing<'db> {}
1533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1534pub struct ExprMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
1535impl<'db> ExprMissingPtr<'db> {}
1536impl<'db> TypedStablePtr<'db> for ExprMissingPtr<'db> {
1537 type SyntaxNode = ExprMissing<'db>;
1538 fn untyped(self) -> SyntaxStablePtrId<'db> {
1539 self.0
1540 }
1541 fn lookup(&self, db: &'db dyn Database) -> ExprMissing<'db> {
1542 ExprMissing::from_syntax_node(db, self.0.lookup(db))
1543 }
1544}
1545impl<'db> From<ExprMissingPtr<'db>> for SyntaxStablePtrId<'db> {
1546 fn from(ptr: ExprMissingPtr<'db>) -> Self {
1547 ptr.untyped()
1548 }
1549}
1550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1551pub struct ExprMissingGreen<'db>(pub GreenId<'db>);
1552impl<'db> TypedSyntaxNode<'db> for ExprMissing<'db> {
1553 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1554 type StablePtr = ExprMissingPtr<'db>;
1555 type Green = ExprMissingGreen<'db>;
1556 fn missing(db: &'db dyn Database) -> Self::Green {
1557 ExprMissingGreen(
1558 GreenNode {
1559 kind: SyntaxKind::ExprMissing,
1560 details: GreenNodeDetails::Node {
1561 children: [].into(),
1562 width: TextWidth::default(),
1563 },
1564 }
1565 .intern(db),
1566 )
1567 }
1568 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1569 let kind = node.kind(db);
1570 assert_eq!(
1571 kind,
1572 SyntaxKind::ExprMissing,
1573 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1574 kind,
1575 SyntaxKind::ExprMissing
1576 );
1577 Self { node }
1578 }
1579 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1580 let kind = node.kind(db);
1581 if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1582 }
1583 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1584 self.node
1585 }
1586 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1587 ExprMissingPtr(self.node.stable_ptr(db))
1588 }
1589}
1590#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1591pub enum PathSegment<'db> {
1592 Simple(PathSegmentSimple<'db>),
1593 WithGenericArgs(PathSegmentWithGenericArgs<'db>),
1594 Missing(PathSegmentMissing<'db>),
1595}
1596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1597pub struct PathSegmentPtr<'db>(pub SyntaxStablePtrId<'db>);
1598impl<'db> TypedStablePtr<'db> for PathSegmentPtr<'db> {
1599 type SyntaxNode = PathSegment<'db>;
1600 fn untyped(self) -> SyntaxStablePtrId<'db> {
1601 self.0
1602 }
1603 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1604 PathSegment::from_syntax_node(db, self.0.lookup(db))
1605 }
1606}
1607impl<'db> From<PathSegmentPtr<'db>> for SyntaxStablePtrId<'db> {
1608 fn from(ptr: PathSegmentPtr<'db>) -> Self {
1609 ptr.untyped()
1610 }
1611}
1612impl<'db> From<PathSegmentSimplePtr<'db>> for PathSegmentPtr<'db> {
1613 fn from(value: PathSegmentSimplePtr<'db>) -> Self {
1614 Self(value.0)
1615 }
1616}
1617impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for PathSegmentPtr<'db> {
1618 fn from(value: PathSegmentWithGenericArgsPtr<'db>) -> Self {
1619 Self(value.0)
1620 }
1621}
1622impl<'db> From<PathSegmentMissingPtr<'db>> for PathSegmentPtr<'db> {
1623 fn from(value: PathSegmentMissingPtr<'db>) -> Self {
1624 Self(value.0)
1625 }
1626}
1627impl<'db> From<PathSegmentSimpleGreen<'db>> for PathSegmentGreen<'db> {
1628 fn from(value: PathSegmentSimpleGreen<'db>) -> Self {
1629 Self(value.0)
1630 }
1631}
1632impl<'db> From<PathSegmentWithGenericArgsGreen<'db>> for PathSegmentGreen<'db> {
1633 fn from(value: PathSegmentWithGenericArgsGreen<'db>) -> Self {
1634 Self(value.0)
1635 }
1636}
1637impl<'db> From<PathSegmentMissingGreen<'db>> for PathSegmentGreen<'db> {
1638 fn from(value: PathSegmentMissingGreen<'db>) -> Self {
1639 Self(value.0)
1640 }
1641}
1642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1643pub struct PathSegmentGreen<'db>(pub GreenId<'db>);
1644impl<'db> TypedSyntaxNode<'db> for PathSegment<'db> {
1645 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1646 type StablePtr = PathSegmentPtr<'db>;
1647 type Green = PathSegmentGreen<'db>;
1648 fn missing(db: &'db dyn Database) -> Self::Green {
1649 PathSegmentGreen(PathSegmentMissing::missing(db).0)
1650 }
1651 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1652 let kind = node.kind(db);
1653 match kind {
1654 SyntaxKind::PathSegmentSimple => {
1655 PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1656 }
1657 SyntaxKind::PathSegmentWithGenericArgs => {
1658 PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1659 }
1660 SyntaxKind::PathSegmentMissing => {
1661 PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1662 }
1663 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1664 }
1665 }
1666 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1667 let kind = node.kind(db);
1668 match kind {
1669 SyntaxKind::PathSegmentSimple => {
1670 Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1671 }
1672 SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1673 PathSegmentWithGenericArgs::from_syntax_node(db, node),
1674 )),
1675 SyntaxKind::PathSegmentMissing => {
1676 Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1677 }
1678 _ => None,
1679 }
1680 }
1681 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1682 match self {
1683 PathSegment::Simple(x) => x.as_syntax_node(),
1684 PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1685 PathSegment::Missing(x) => x.as_syntax_node(),
1686 }
1687 }
1688 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1689 PathSegmentPtr(self.as_syntax_node().long(db).stable_ptr)
1690 }
1691}
1692impl<'db> PathSegment<'db> {
1693 pub fn is_variant(kind: SyntaxKind) -> bool {
1695 matches!(
1696 kind,
1697 SyntaxKind::PathSegmentSimple
1698 | SyntaxKind::PathSegmentWithGenericArgs
1699 | SyntaxKind::PathSegmentMissing
1700 )
1701 }
1702}
1703#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1704pub struct PathSegmentSimple<'db> {
1705 node: SyntaxNode<'db>,
1706}
1707impl<'db> PathSegmentSimple<'db> {
1708 pub const INDEX_IDENT: usize = 0;
1709 pub fn new_green(
1710 db: &'db dyn Database,
1711 ident: TerminalIdentifierGreen<'db>,
1712 ) -> PathSegmentSimpleGreen<'db> {
1713 let children = [ident.0];
1714 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1715 PathSegmentSimpleGreen(
1716 GreenNode {
1717 kind: SyntaxKind::PathSegmentSimple,
1718 details: GreenNodeDetails::Node { children: children.into(), width },
1719 }
1720 .intern(db),
1721 )
1722 }
1723}
1724impl<'db> PathSegmentSimple<'db> {
1725 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1726 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1727 }
1728}
1729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1730pub struct PathSegmentSimplePtr<'db>(pub SyntaxStablePtrId<'db>);
1731impl<'db> PathSegmentSimplePtr<'db> {}
1732impl<'db> TypedStablePtr<'db> for PathSegmentSimplePtr<'db> {
1733 type SyntaxNode = PathSegmentSimple<'db>;
1734 fn untyped(self) -> SyntaxStablePtrId<'db> {
1735 self.0
1736 }
1737 fn lookup(&self, db: &'db dyn Database) -> PathSegmentSimple<'db> {
1738 PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1739 }
1740}
1741impl<'db> From<PathSegmentSimplePtr<'db>> for SyntaxStablePtrId<'db> {
1742 fn from(ptr: PathSegmentSimplePtr<'db>) -> Self {
1743 ptr.untyped()
1744 }
1745}
1746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1747pub struct PathSegmentSimpleGreen<'db>(pub GreenId<'db>);
1748impl<'db> TypedSyntaxNode<'db> for PathSegmentSimple<'db> {
1749 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1750 type StablePtr = PathSegmentSimplePtr<'db>;
1751 type Green = PathSegmentSimpleGreen<'db>;
1752 fn missing(db: &'db dyn Database) -> Self::Green {
1753 PathSegmentSimpleGreen(
1754 GreenNode {
1755 kind: SyntaxKind::PathSegmentSimple,
1756 details: GreenNodeDetails::Node {
1757 children: [TerminalIdentifier::missing(db).0].into(),
1758 width: TextWidth::default(),
1759 },
1760 }
1761 .intern(db),
1762 )
1763 }
1764 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1765 let kind = node.kind(db);
1766 assert_eq!(
1767 kind,
1768 SyntaxKind::PathSegmentSimple,
1769 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1770 kind,
1771 SyntaxKind::PathSegmentSimple
1772 );
1773 Self { node }
1774 }
1775 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1776 let kind = node.kind(db);
1777 if kind == SyntaxKind::PathSegmentSimple {
1778 Some(Self::from_syntax_node(db, node))
1779 } else {
1780 None
1781 }
1782 }
1783 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1784 self.node
1785 }
1786 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1787 PathSegmentSimplePtr(self.node.stable_ptr(db))
1788 }
1789}
1790#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1791pub enum OptionTerminalColonColon<'db> {
1792 Empty(OptionTerminalColonColonEmpty<'db>),
1793 TerminalColonColon(TerminalColonColon<'db>),
1794}
1795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1796pub struct OptionTerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
1797impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonPtr<'db> {
1798 type SyntaxNode = OptionTerminalColonColon<'db>;
1799 fn untyped(self) -> SyntaxStablePtrId<'db> {
1800 self.0
1801 }
1802 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1803 OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1804 }
1805}
1806impl<'db> From<OptionTerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
1807 fn from(ptr: OptionTerminalColonColonPtr<'db>) -> Self {
1808 ptr.untyped()
1809 }
1810}
1811impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1812 fn from(value: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1813 Self(value.0)
1814 }
1815}
1816impl<'db> From<TerminalColonColonPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1817 fn from(value: TerminalColonColonPtr<'db>) -> Self {
1818 Self(value.0)
1819 }
1820}
1821impl<'db> From<OptionTerminalColonColonEmptyGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1822 fn from(value: OptionTerminalColonColonEmptyGreen<'db>) -> Self {
1823 Self(value.0)
1824 }
1825}
1826impl<'db> From<TerminalColonColonGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1827 fn from(value: TerminalColonColonGreen<'db>) -> Self {
1828 Self(value.0)
1829 }
1830}
1831#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1832pub struct OptionTerminalColonColonGreen<'db>(pub GreenId<'db>);
1833impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColon<'db> {
1834 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1835 type StablePtr = OptionTerminalColonColonPtr<'db>;
1836 type Green = OptionTerminalColonColonGreen<'db>;
1837 fn missing(db: &'db dyn Database) -> Self::Green {
1838 panic!("No missing variant.");
1839 }
1840 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1841 let kind = node.kind(db);
1842 match kind {
1843 SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1844 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1845 ),
1846 SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1847 TerminalColonColon::from_syntax_node(db, node),
1848 ),
1849 _ => panic!(
1850 "Unexpected syntax kind {:?} when constructing {}.",
1851 kind, "OptionTerminalColonColon"
1852 ),
1853 }
1854 }
1855 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1856 let kind = node.kind(db);
1857 match kind {
1858 SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1859 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1860 )),
1861 SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1862 TerminalColonColon::from_syntax_node(db, node),
1863 )),
1864 _ => None,
1865 }
1866 }
1867 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1868 match self {
1869 OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1870 OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1871 }
1872 }
1873 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1874 OptionTerminalColonColonPtr(self.as_syntax_node().long(db).stable_ptr)
1875 }
1876}
1877impl<'db> OptionTerminalColonColon<'db> {
1878 pub fn is_variant(kind: SyntaxKind) -> bool {
1880 matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1881 }
1882}
1883#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1884pub struct OptionTerminalColonColonEmpty<'db> {
1885 node: SyntaxNode<'db>,
1886}
1887impl<'db> OptionTerminalColonColonEmpty<'db> {
1888 pub fn new_green(db: &'db dyn Database) -> OptionTerminalColonColonEmptyGreen<'db> {
1889 let children = [];
1890 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1891 OptionTerminalColonColonEmptyGreen(
1892 GreenNode {
1893 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1894 details: GreenNodeDetails::Node { children: children.into(), width },
1895 }
1896 .intern(db),
1897 )
1898 }
1899}
1900impl<'db> OptionTerminalColonColonEmpty<'db> {}
1901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1902pub struct OptionTerminalColonColonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
1903impl<'db> OptionTerminalColonColonEmptyPtr<'db> {}
1904impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonEmptyPtr<'db> {
1905 type SyntaxNode = OptionTerminalColonColonEmpty<'db>;
1906 fn untyped(self) -> SyntaxStablePtrId<'db> {
1907 self.0
1908 }
1909 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalColonColonEmpty<'db> {
1910 OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1911 }
1912}
1913impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
1914 fn from(ptr: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1915 ptr.untyped()
1916 }
1917}
1918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1919pub struct OptionTerminalColonColonEmptyGreen<'db>(pub GreenId<'db>);
1920impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColonEmpty<'db> {
1921 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1922 type StablePtr = OptionTerminalColonColonEmptyPtr<'db>;
1923 type Green = OptionTerminalColonColonEmptyGreen<'db>;
1924 fn missing(db: &'db dyn Database) -> Self::Green {
1925 OptionTerminalColonColonEmptyGreen(
1926 GreenNode {
1927 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1928 details: GreenNodeDetails::Node {
1929 children: [].into(),
1930 width: TextWidth::default(),
1931 },
1932 }
1933 .intern(db),
1934 )
1935 }
1936 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1937 let kind = node.kind(db);
1938 assert_eq!(
1939 kind,
1940 SyntaxKind::OptionTerminalColonColonEmpty,
1941 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1942 kind,
1943 SyntaxKind::OptionTerminalColonColonEmpty
1944 );
1945 Self { node }
1946 }
1947 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1948 let kind = node.kind(db);
1949 if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1950 Some(Self::from_syntax_node(db, node))
1951 } else {
1952 None
1953 }
1954 }
1955 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1956 self.node
1957 }
1958 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1959 OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1960 }
1961}
1962#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1963pub struct PathSegmentWithGenericArgs<'db> {
1964 node: SyntaxNode<'db>,
1965}
1966impl<'db> PathSegmentWithGenericArgs<'db> {
1967 pub const INDEX_IDENT: usize = 0;
1968 pub const INDEX_SEPARATOR: usize = 1;
1969 pub const INDEX_GENERIC_ARGS: usize = 2;
1970 pub fn new_green(
1971 db: &'db dyn Database,
1972 ident: TerminalIdentifierGreen<'db>,
1973 separator: OptionTerminalColonColonGreen<'db>,
1974 generic_args: GenericArgsGreen<'db>,
1975 ) -> PathSegmentWithGenericArgsGreen<'db> {
1976 let children = [ident.0, separator.0, generic_args.0];
1977 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1978 PathSegmentWithGenericArgsGreen(
1979 GreenNode {
1980 kind: SyntaxKind::PathSegmentWithGenericArgs,
1981 details: GreenNodeDetails::Node { children: children.into(), width },
1982 }
1983 .intern(db),
1984 )
1985 }
1986}
1987impl<'db> PathSegmentWithGenericArgs<'db> {
1988 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1989 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1990 }
1991 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalColonColon<'db> {
1992 OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
1993 }
1994 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgs<'db> {
1995 GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
1996 }
1997}
1998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1999pub struct PathSegmentWithGenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
2000impl<'db> PathSegmentWithGenericArgsPtr<'db> {}
2001impl<'db> TypedStablePtr<'db> for PathSegmentWithGenericArgsPtr<'db> {
2002 type SyntaxNode = PathSegmentWithGenericArgs<'db>;
2003 fn untyped(self) -> SyntaxStablePtrId<'db> {
2004 self.0
2005 }
2006 fn lookup(&self, db: &'db dyn Database) -> PathSegmentWithGenericArgs<'db> {
2007 PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2008 }
2009}
2010impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
2011 fn from(ptr: PathSegmentWithGenericArgsPtr<'db>) -> Self {
2012 ptr.untyped()
2013 }
2014}
2015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2016pub struct PathSegmentWithGenericArgsGreen<'db>(pub GreenId<'db>);
2017impl<'db> TypedSyntaxNode<'db> for PathSegmentWithGenericArgs<'db> {
2018 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2019 type StablePtr = PathSegmentWithGenericArgsPtr<'db>;
2020 type Green = PathSegmentWithGenericArgsGreen<'db>;
2021 fn missing(db: &'db dyn Database) -> Self::Green {
2022 PathSegmentWithGenericArgsGreen(
2023 GreenNode {
2024 kind: SyntaxKind::PathSegmentWithGenericArgs,
2025 details: GreenNodeDetails::Node {
2026 children: [
2027 TerminalIdentifier::missing(db).0,
2028 OptionTerminalColonColon::missing(db).0,
2029 GenericArgs::missing(db).0,
2030 ]
2031 .into(),
2032 width: TextWidth::default(),
2033 },
2034 }
2035 .intern(db),
2036 )
2037 }
2038 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2039 let kind = node.kind(db);
2040 assert_eq!(
2041 kind,
2042 SyntaxKind::PathSegmentWithGenericArgs,
2043 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2044 kind,
2045 SyntaxKind::PathSegmentWithGenericArgs
2046 );
2047 Self { node }
2048 }
2049 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2050 let kind = node.kind(db);
2051 if kind == SyntaxKind::PathSegmentWithGenericArgs {
2052 Some(Self::from_syntax_node(db, node))
2053 } else {
2054 None
2055 }
2056 }
2057 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2058 self.node
2059 }
2060 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2061 PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2062 }
2063}
2064#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2065pub struct ExprPath<'db> {
2066 node: SyntaxNode<'db>,
2067}
2068impl<'db> ExprPath<'db> {
2069 pub const INDEX_DOLLAR: usize = 0;
2070 pub const INDEX_SEGMENTS: usize = 1;
2071 pub fn new_green(
2072 db: &'db dyn Database,
2073 dollar: OptionTerminalDollarGreen<'db>,
2074 segments: ExprPathInnerGreen<'db>,
2075 ) -> ExprPathGreen<'db> {
2076 let children = [dollar.0, segments.0];
2077 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2078 ExprPathGreen(
2079 GreenNode {
2080 kind: SyntaxKind::ExprPath,
2081 details: GreenNodeDetails::Node { children: children.into(), width },
2082 }
2083 .intern(db),
2084 )
2085 }
2086}
2087impl<'db> ExprPath<'db> {
2088 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
2089 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2090 }
2091 pub fn segments(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2092 ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2093 }
2094}
2095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2096pub struct ExprPathPtr<'db>(pub SyntaxStablePtrId<'db>);
2097impl<'db> ExprPathPtr<'db> {}
2098impl<'db> TypedStablePtr<'db> for ExprPathPtr<'db> {
2099 type SyntaxNode = ExprPath<'db>;
2100 fn untyped(self) -> SyntaxStablePtrId<'db> {
2101 self.0
2102 }
2103 fn lookup(&self, db: &'db dyn Database) -> ExprPath<'db> {
2104 ExprPath::from_syntax_node(db, self.0.lookup(db))
2105 }
2106}
2107impl<'db> From<ExprPathPtr<'db>> for SyntaxStablePtrId<'db> {
2108 fn from(ptr: ExprPathPtr<'db>) -> Self {
2109 ptr.untyped()
2110 }
2111}
2112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2113pub struct ExprPathGreen<'db>(pub GreenId<'db>);
2114impl<'db> TypedSyntaxNode<'db> for ExprPath<'db> {
2115 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2116 type StablePtr = ExprPathPtr<'db>;
2117 type Green = ExprPathGreen<'db>;
2118 fn missing(db: &'db dyn Database) -> Self::Green {
2119 ExprPathGreen(
2120 GreenNode {
2121 kind: SyntaxKind::ExprPath,
2122 details: GreenNodeDetails::Node {
2123 children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2124 .into(),
2125 width: TextWidth::default(),
2126 },
2127 }
2128 .intern(db),
2129 )
2130 }
2131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2132 let kind = node.kind(db);
2133 assert_eq!(
2134 kind,
2135 SyntaxKind::ExprPath,
2136 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2137 kind,
2138 SyntaxKind::ExprPath
2139 );
2140 Self { node }
2141 }
2142 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2143 let kind = node.kind(db);
2144 if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2145 }
2146 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2147 self.node
2148 }
2149 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2150 ExprPathPtr(self.node.stable_ptr(db))
2151 }
2152}
2153#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2154pub enum OptionTerminalDollar<'db> {
2155 Empty(OptionTerminalDollarEmpty<'db>),
2156 TerminalDollar(TerminalDollar<'db>),
2157}
2158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2159pub struct OptionTerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
2160impl<'db> TypedStablePtr<'db> for OptionTerminalDollarPtr<'db> {
2161 type SyntaxNode = OptionTerminalDollar<'db>;
2162 fn untyped(self) -> SyntaxStablePtrId<'db> {
2163 self.0
2164 }
2165 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2166 OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2167 }
2168}
2169impl<'db> From<OptionTerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
2170 fn from(ptr: OptionTerminalDollarPtr<'db>) -> Self {
2171 ptr.untyped()
2172 }
2173}
2174impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for OptionTerminalDollarPtr<'db> {
2175 fn from(value: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2176 Self(value.0)
2177 }
2178}
2179impl<'db> From<TerminalDollarPtr<'db>> for OptionTerminalDollarPtr<'db> {
2180 fn from(value: TerminalDollarPtr<'db>) -> Self {
2181 Self(value.0)
2182 }
2183}
2184impl<'db> From<OptionTerminalDollarEmptyGreen<'db>> for OptionTerminalDollarGreen<'db> {
2185 fn from(value: OptionTerminalDollarEmptyGreen<'db>) -> Self {
2186 Self(value.0)
2187 }
2188}
2189impl<'db> From<TerminalDollarGreen<'db>> for OptionTerminalDollarGreen<'db> {
2190 fn from(value: TerminalDollarGreen<'db>) -> Self {
2191 Self(value.0)
2192 }
2193}
2194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2195pub struct OptionTerminalDollarGreen<'db>(pub GreenId<'db>);
2196impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollar<'db> {
2197 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2198 type StablePtr = OptionTerminalDollarPtr<'db>;
2199 type Green = OptionTerminalDollarGreen<'db>;
2200 fn missing(db: &'db dyn Database) -> Self::Green {
2201 panic!("No missing variant.");
2202 }
2203 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2204 let kind = node.kind(db);
2205 match kind {
2206 SyntaxKind::OptionTerminalDollarEmpty => {
2207 OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2208 }
2209 SyntaxKind::TerminalDollar => {
2210 OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2211 }
2212 _ => panic!(
2213 "Unexpected syntax kind {:?} when constructing {}.",
2214 kind, "OptionTerminalDollar"
2215 ),
2216 }
2217 }
2218 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2219 let kind = node.kind(db);
2220 match kind {
2221 SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2222 OptionTerminalDollarEmpty::from_syntax_node(db, node),
2223 )),
2224 SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2225 TerminalDollar::from_syntax_node(db, node),
2226 )),
2227 _ => None,
2228 }
2229 }
2230 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2231 match self {
2232 OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2233 OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2234 }
2235 }
2236 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2237 OptionTerminalDollarPtr(self.as_syntax_node().long(db).stable_ptr)
2238 }
2239}
2240impl<'db> OptionTerminalDollar<'db> {
2241 pub fn is_variant(kind: SyntaxKind) -> bool {
2243 matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2244 }
2245}
2246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2247pub struct OptionTerminalDollarEmpty<'db> {
2248 node: SyntaxNode<'db>,
2249}
2250impl<'db> OptionTerminalDollarEmpty<'db> {
2251 pub fn new_green(db: &'db dyn Database) -> OptionTerminalDollarEmptyGreen<'db> {
2252 let children = [];
2253 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2254 OptionTerminalDollarEmptyGreen(
2255 GreenNode {
2256 kind: SyntaxKind::OptionTerminalDollarEmpty,
2257 details: GreenNodeDetails::Node { children: children.into(), width },
2258 }
2259 .intern(db),
2260 )
2261 }
2262}
2263impl<'db> OptionTerminalDollarEmpty<'db> {}
2264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2265pub struct OptionTerminalDollarEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
2266impl<'db> OptionTerminalDollarEmptyPtr<'db> {}
2267impl<'db> TypedStablePtr<'db> for OptionTerminalDollarEmptyPtr<'db> {
2268 type SyntaxNode = OptionTerminalDollarEmpty<'db>;
2269 fn untyped(self) -> SyntaxStablePtrId<'db> {
2270 self.0
2271 }
2272 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalDollarEmpty<'db> {
2273 OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2274 }
2275}
2276impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
2277 fn from(ptr: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2278 ptr.untyped()
2279 }
2280}
2281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2282pub struct OptionTerminalDollarEmptyGreen<'db>(pub GreenId<'db>);
2283impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollarEmpty<'db> {
2284 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2285 type StablePtr = OptionTerminalDollarEmptyPtr<'db>;
2286 type Green = OptionTerminalDollarEmptyGreen<'db>;
2287 fn missing(db: &'db dyn Database) -> Self::Green {
2288 OptionTerminalDollarEmptyGreen(
2289 GreenNode {
2290 kind: SyntaxKind::OptionTerminalDollarEmpty,
2291 details: GreenNodeDetails::Node {
2292 children: [].into(),
2293 width: TextWidth::default(),
2294 },
2295 }
2296 .intern(db),
2297 )
2298 }
2299 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2300 let kind = node.kind(db);
2301 assert_eq!(
2302 kind,
2303 SyntaxKind::OptionTerminalDollarEmpty,
2304 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2305 kind,
2306 SyntaxKind::OptionTerminalDollarEmpty
2307 );
2308 Self { node }
2309 }
2310 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2311 let kind = node.kind(db);
2312 if kind == SyntaxKind::OptionTerminalDollarEmpty {
2313 Some(Self::from_syntax_node(db, node))
2314 } else {
2315 None
2316 }
2317 }
2318 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2319 self.node
2320 }
2321 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2322 OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2323 }
2324}
2325#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2326pub struct PathSegmentMissing<'db> {
2327 node: SyntaxNode<'db>,
2328}
2329impl<'db> PathSegmentMissing<'db> {
2330 pub const INDEX_IDENT: usize = 0;
2331 pub fn new_green(
2332 db: &'db dyn Database,
2333 ident: TerminalIdentifierGreen<'db>,
2334 ) -> PathSegmentMissingGreen<'db> {
2335 let children = [ident.0];
2336 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2337 PathSegmentMissingGreen(
2338 GreenNode {
2339 kind: SyntaxKind::PathSegmentMissing,
2340 details: GreenNodeDetails::Node { children: children.into(), width },
2341 }
2342 .intern(db),
2343 )
2344 }
2345}
2346impl<'db> PathSegmentMissing<'db> {
2347 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2348 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2349 }
2350}
2351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2352pub struct PathSegmentMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
2353impl<'db> PathSegmentMissingPtr<'db> {}
2354impl<'db> TypedStablePtr<'db> for PathSegmentMissingPtr<'db> {
2355 type SyntaxNode = PathSegmentMissing<'db>;
2356 fn untyped(self) -> SyntaxStablePtrId<'db> {
2357 self.0
2358 }
2359 fn lookup(&self, db: &'db dyn Database) -> PathSegmentMissing<'db> {
2360 PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2361 }
2362}
2363impl<'db> From<PathSegmentMissingPtr<'db>> for SyntaxStablePtrId<'db> {
2364 fn from(ptr: PathSegmentMissingPtr<'db>) -> Self {
2365 ptr.untyped()
2366 }
2367}
2368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2369pub struct PathSegmentMissingGreen<'db>(pub GreenId<'db>);
2370impl<'db> TypedSyntaxNode<'db> for PathSegmentMissing<'db> {
2371 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2372 type StablePtr = PathSegmentMissingPtr<'db>;
2373 type Green = PathSegmentMissingGreen<'db>;
2374 fn missing(db: &'db dyn Database) -> Self::Green {
2375 PathSegmentMissingGreen(
2376 GreenNode {
2377 kind: SyntaxKind::PathSegmentMissing,
2378 details: GreenNodeDetails::Node {
2379 children: [TerminalIdentifier::missing(db).0].into(),
2380 width: TextWidth::default(),
2381 },
2382 }
2383 .intern(db),
2384 )
2385 }
2386 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2387 let kind = node.kind(db);
2388 assert_eq!(
2389 kind,
2390 SyntaxKind::PathSegmentMissing,
2391 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2392 kind,
2393 SyntaxKind::PathSegmentMissing
2394 );
2395 Self { node }
2396 }
2397 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2398 let kind = node.kind(db);
2399 if kind == SyntaxKind::PathSegmentMissing {
2400 Some(Self::from_syntax_node(db, node))
2401 } else {
2402 None
2403 }
2404 }
2405 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2406 self.node
2407 }
2408 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2409 PathSegmentMissingPtr(self.node.stable_ptr(db))
2410 }
2411}
2412#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2413pub struct ExprPathInner<'db>(ElementList<'db, PathSegment<'db>, 2>);
2414impl<'db> Deref for ExprPathInner<'db> {
2415 type Target = ElementList<'db, PathSegment<'db>, 2>;
2416 fn deref(&self) -> &Self::Target {
2417 &self.0
2418 }
2419}
2420impl<'db> ExprPathInner<'db> {
2421 pub fn new_green(
2422 db: &'db dyn Database,
2423 children: &[ExprPathInnerElementOrSeparatorGreen<'db>],
2424 ) -> ExprPathInnerGreen<'db> {
2425 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
2426 ExprPathInnerGreen(
2427 GreenNode {
2428 kind: SyntaxKind::ExprPathInner,
2429 details: GreenNodeDetails::Node {
2430 children: children.iter().map(|x| x.id()).collect(),
2431 width,
2432 },
2433 }
2434 .intern(db),
2435 )
2436 }
2437}
2438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2439pub struct ExprPathInnerPtr<'db>(pub SyntaxStablePtrId<'db>);
2440impl<'db> TypedStablePtr<'db> for ExprPathInnerPtr<'db> {
2441 type SyntaxNode = ExprPathInner<'db>;
2442 fn untyped(self) -> SyntaxStablePtrId<'db> {
2443 self.0
2444 }
2445 fn lookup(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2446 ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2447 }
2448}
2449impl<'db> From<ExprPathInnerPtr<'db>> for SyntaxStablePtrId<'db> {
2450 fn from(ptr: ExprPathInnerPtr<'db>) -> Self {
2451 ptr.untyped()
2452 }
2453}
2454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2455pub enum ExprPathInnerElementOrSeparatorGreen<'db> {
2456 Separator(TerminalColonColonGreen<'db>),
2457 Element(PathSegmentGreen<'db>),
2458}
2459impl<'db> From<TerminalColonColonGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2460 fn from(value: TerminalColonColonGreen<'db>) -> Self {
2461 ExprPathInnerElementOrSeparatorGreen::Separator(value)
2462 }
2463}
2464impl<'db> From<PathSegmentGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2465 fn from(value: PathSegmentGreen<'db>) -> Self {
2466 ExprPathInnerElementOrSeparatorGreen::Element(value)
2467 }
2468}
2469impl<'db> ExprPathInnerElementOrSeparatorGreen<'db> {
2470 fn id(&self) -> GreenId<'db> {
2471 match self {
2472 ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2473 ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2474 }
2475 }
2476}
2477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2478pub struct ExprPathInnerGreen<'db>(pub GreenId<'db>);
2479impl<'db> TypedSyntaxNode<'db> for ExprPathInner<'db> {
2480 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2481 type StablePtr = ExprPathInnerPtr<'db>;
2482 type Green = ExprPathInnerGreen<'db>;
2483 fn missing(db: &'db dyn Database) -> Self::Green {
2484 ExprPathInnerGreen(
2485 GreenNode {
2486 kind: SyntaxKind::ExprPathInner,
2487 details: GreenNodeDetails::Node {
2488 children: [].into(),
2489 width: TextWidth::default(),
2490 },
2491 }
2492 .intern(db),
2493 )
2494 }
2495 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2496 Self(ElementList::new(node))
2497 }
2498 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2499 if node.kind(db) == SyntaxKind::ExprPathInner {
2500 Some(Self(ElementList::new(node)))
2501 } else {
2502 None
2503 }
2504 }
2505 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2506 self.node
2507 }
2508 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2509 ExprPathInnerPtr(self.node.stable_ptr(db))
2510 }
2511}
2512#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2513pub struct ExprParenthesized<'db> {
2514 node: SyntaxNode<'db>,
2515}
2516impl<'db> ExprParenthesized<'db> {
2517 pub const INDEX_LPAREN: usize = 0;
2518 pub const INDEX_EXPR: usize = 1;
2519 pub const INDEX_RPAREN: usize = 2;
2520 pub fn new_green(
2521 db: &'db dyn Database,
2522 lparen: TerminalLParenGreen<'db>,
2523 expr: ExprGreen<'db>,
2524 rparen: TerminalRParenGreen<'db>,
2525 ) -> ExprParenthesizedGreen<'db> {
2526 let children = [lparen.0, expr.0, rparen.0];
2527 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2528 ExprParenthesizedGreen(
2529 GreenNode {
2530 kind: SyntaxKind::ExprParenthesized,
2531 details: GreenNodeDetails::Node { children: children.into(), width },
2532 }
2533 .intern(db),
2534 )
2535 }
2536}
2537impl<'db> ExprParenthesized<'db> {
2538 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
2539 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2540 }
2541 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2542 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2543 }
2544 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
2545 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2546 }
2547}
2548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2549pub struct ExprParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
2550impl<'db> ExprParenthesizedPtr<'db> {}
2551impl<'db> TypedStablePtr<'db> for ExprParenthesizedPtr<'db> {
2552 type SyntaxNode = ExprParenthesized<'db>;
2553 fn untyped(self) -> SyntaxStablePtrId<'db> {
2554 self.0
2555 }
2556 fn lookup(&self, db: &'db dyn Database) -> ExprParenthesized<'db> {
2557 ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2558 }
2559}
2560impl<'db> From<ExprParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
2561 fn from(ptr: ExprParenthesizedPtr<'db>) -> Self {
2562 ptr.untyped()
2563 }
2564}
2565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2566pub struct ExprParenthesizedGreen<'db>(pub GreenId<'db>);
2567impl<'db> TypedSyntaxNode<'db> for ExprParenthesized<'db> {
2568 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2569 type StablePtr = ExprParenthesizedPtr<'db>;
2570 type Green = ExprParenthesizedGreen<'db>;
2571 fn missing(db: &'db dyn Database) -> Self::Green {
2572 ExprParenthesizedGreen(
2573 GreenNode {
2574 kind: SyntaxKind::ExprParenthesized,
2575 details: GreenNodeDetails::Node {
2576 children: [
2577 TerminalLParen::missing(db).0,
2578 Expr::missing(db).0,
2579 TerminalRParen::missing(db).0,
2580 ]
2581 .into(),
2582 width: TextWidth::default(),
2583 },
2584 }
2585 .intern(db),
2586 )
2587 }
2588 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2589 let kind = node.kind(db);
2590 assert_eq!(
2591 kind,
2592 SyntaxKind::ExprParenthesized,
2593 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2594 kind,
2595 SyntaxKind::ExprParenthesized
2596 );
2597 Self { node }
2598 }
2599 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2600 let kind = node.kind(db);
2601 if kind == SyntaxKind::ExprParenthesized {
2602 Some(Self::from_syntax_node(db, node))
2603 } else {
2604 None
2605 }
2606 }
2607 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2608 self.node
2609 }
2610 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2611 ExprParenthesizedPtr(self.node.stable_ptr(db))
2612 }
2613}
2614#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2615pub struct ExprUnary<'db> {
2616 node: SyntaxNode<'db>,
2617}
2618impl<'db> ExprUnary<'db> {
2619 pub const INDEX_OP: usize = 0;
2620 pub const INDEX_EXPR: usize = 1;
2621 pub fn new_green(
2622 db: &'db dyn Database,
2623 op: UnaryOperatorGreen<'db>,
2624 expr: ExprGreen<'db>,
2625 ) -> ExprUnaryGreen<'db> {
2626 let children = [op.0, expr.0];
2627 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2628 ExprUnaryGreen(
2629 GreenNode {
2630 kind: SyntaxKind::ExprUnary,
2631 details: GreenNodeDetails::Node { children: children.into(), width },
2632 }
2633 .intern(db),
2634 )
2635 }
2636}
2637impl<'db> ExprUnary<'db> {
2638 pub fn op(&self, db: &'db dyn Database) -> UnaryOperator<'db> {
2639 UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2640 }
2641 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2642 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2643 }
2644}
2645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2646pub struct ExprUnaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2647impl<'db> ExprUnaryPtr<'db> {}
2648impl<'db> TypedStablePtr<'db> for ExprUnaryPtr<'db> {
2649 type SyntaxNode = ExprUnary<'db>;
2650 fn untyped(self) -> SyntaxStablePtrId<'db> {
2651 self.0
2652 }
2653 fn lookup(&self, db: &'db dyn Database) -> ExprUnary<'db> {
2654 ExprUnary::from_syntax_node(db, self.0.lookup(db))
2655 }
2656}
2657impl<'db> From<ExprUnaryPtr<'db>> for SyntaxStablePtrId<'db> {
2658 fn from(ptr: ExprUnaryPtr<'db>) -> Self {
2659 ptr.untyped()
2660 }
2661}
2662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2663pub struct ExprUnaryGreen<'db>(pub GreenId<'db>);
2664impl<'db> TypedSyntaxNode<'db> for ExprUnary<'db> {
2665 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2666 type StablePtr = ExprUnaryPtr<'db>;
2667 type Green = ExprUnaryGreen<'db>;
2668 fn missing(db: &'db dyn Database) -> Self::Green {
2669 ExprUnaryGreen(
2670 GreenNode {
2671 kind: SyntaxKind::ExprUnary,
2672 details: GreenNodeDetails::Node {
2673 children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2674 width: TextWidth::default(),
2675 },
2676 }
2677 .intern(db),
2678 )
2679 }
2680 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2681 let kind = node.kind(db);
2682 assert_eq!(
2683 kind,
2684 SyntaxKind::ExprUnary,
2685 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2686 kind,
2687 SyntaxKind::ExprUnary
2688 );
2689 Self { node }
2690 }
2691 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2692 let kind = node.kind(db);
2693 if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2694 }
2695 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2696 self.node
2697 }
2698 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2699 ExprUnaryPtr(self.node.stable_ptr(db))
2700 }
2701}
2702#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2703pub enum UnaryOperator<'db> {
2704 Not(TerminalNot<'db>),
2705 BitNot(TerminalBitNot<'db>),
2706 Minus(TerminalMinus<'db>),
2707 At(TerminalAt<'db>),
2708 Desnap(TerminalMul<'db>),
2709}
2710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2711pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2712impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2713 type SyntaxNode = UnaryOperator<'db>;
2714 fn untyped(self) -> SyntaxStablePtrId<'db> {
2715 self.0
2716 }
2717 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2718 UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2719 }
2720}
2721impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2722 fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2723 ptr.untyped()
2724 }
2725}
2726impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2727 fn from(value: TerminalNotPtr<'db>) -> Self {
2728 Self(value.0)
2729 }
2730}
2731impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2732 fn from(value: TerminalBitNotPtr<'db>) -> Self {
2733 Self(value.0)
2734 }
2735}
2736impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2737 fn from(value: TerminalMinusPtr<'db>) -> Self {
2738 Self(value.0)
2739 }
2740}
2741impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2742 fn from(value: TerminalAtPtr<'db>) -> Self {
2743 Self(value.0)
2744 }
2745}
2746impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2747 fn from(value: TerminalMulPtr<'db>) -> Self {
2748 Self(value.0)
2749 }
2750}
2751impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2752 fn from(value: TerminalNotGreen<'db>) -> Self {
2753 Self(value.0)
2754 }
2755}
2756impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2757 fn from(value: TerminalBitNotGreen<'db>) -> Self {
2758 Self(value.0)
2759 }
2760}
2761impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2762 fn from(value: TerminalMinusGreen<'db>) -> Self {
2763 Self(value.0)
2764 }
2765}
2766impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2767 fn from(value: TerminalAtGreen<'db>) -> Self {
2768 Self(value.0)
2769 }
2770}
2771impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2772 fn from(value: TerminalMulGreen<'db>) -> Self {
2773 Self(value.0)
2774 }
2775}
2776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2777pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2778impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2779 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2780 type StablePtr = UnaryOperatorPtr<'db>;
2781 type Green = UnaryOperatorGreen<'db>;
2782 fn missing(db: &'db dyn Database) -> Self::Green {
2783 panic!("No missing variant.");
2784 }
2785 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2786 let kind = node.kind(db);
2787 match kind {
2788 SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2789 SyntaxKind::TerminalBitNot => {
2790 UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2791 }
2792 SyntaxKind::TerminalMinus => {
2793 UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2794 }
2795 SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2796 SyntaxKind::TerminalMul => {
2797 UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2798 }
2799 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2800 }
2801 }
2802 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2803 let kind = node.kind(db);
2804 match kind {
2805 SyntaxKind::TerminalNot => {
2806 Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2807 }
2808 SyntaxKind::TerminalBitNot => {
2809 Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2810 }
2811 SyntaxKind::TerminalMinus => {
2812 Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2813 }
2814 SyntaxKind::TerminalAt => {
2815 Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2816 }
2817 SyntaxKind::TerminalMul => {
2818 Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2819 }
2820 _ => None,
2821 }
2822 }
2823 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2824 match self {
2825 UnaryOperator::Not(x) => x.as_syntax_node(),
2826 UnaryOperator::BitNot(x) => x.as_syntax_node(),
2827 UnaryOperator::Minus(x) => x.as_syntax_node(),
2828 UnaryOperator::At(x) => x.as_syntax_node(),
2829 UnaryOperator::Desnap(x) => x.as_syntax_node(),
2830 }
2831 }
2832 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2833 UnaryOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
2834 }
2835}
2836impl<'db> UnaryOperator<'db> {
2837 pub fn is_variant(kind: SyntaxKind) -> bool {
2839 matches!(
2840 kind,
2841 SyntaxKind::TerminalNot
2842 | SyntaxKind::TerminalBitNot
2843 | SyntaxKind::TerminalMinus
2844 | SyntaxKind::TerminalAt
2845 | SyntaxKind::TerminalMul
2846 )
2847 }
2848}
2849#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2850pub struct ExprBinary<'db> {
2851 node: SyntaxNode<'db>,
2852}
2853impl<'db> ExprBinary<'db> {
2854 pub const INDEX_LHS: usize = 0;
2855 pub const INDEX_OP: usize = 1;
2856 pub const INDEX_RHS: usize = 2;
2857 pub fn new_green(
2858 db: &'db dyn Database,
2859 lhs: ExprGreen<'db>,
2860 op: BinaryOperatorGreen<'db>,
2861 rhs: ExprGreen<'db>,
2862 ) -> ExprBinaryGreen<'db> {
2863 let children = [lhs.0, op.0, rhs.0];
2864 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2865 ExprBinaryGreen(
2866 GreenNode {
2867 kind: SyntaxKind::ExprBinary,
2868 details: GreenNodeDetails::Node { children: children.into(), width },
2869 }
2870 .intern(db),
2871 )
2872 }
2873}
2874impl<'db> ExprBinary<'db> {
2875 pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2876 Expr::from_syntax_node(db, self.node.get_children(db)[0])
2877 }
2878 pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2879 BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2880 }
2881 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2882 Expr::from_syntax_node(db, self.node.get_children(db)[2])
2883 }
2884}
2885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2886pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2887impl<'db> ExprBinaryPtr<'db> {}
2888impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2889 type SyntaxNode = ExprBinary<'db>;
2890 fn untyped(self) -> SyntaxStablePtrId<'db> {
2891 self.0
2892 }
2893 fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2894 ExprBinary::from_syntax_node(db, self.0.lookup(db))
2895 }
2896}
2897impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2898 fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2899 ptr.untyped()
2900 }
2901}
2902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2903pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2904impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2905 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2906 type StablePtr = ExprBinaryPtr<'db>;
2907 type Green = ExprBinaryGreen<'db>;
2908 fn missing(db: &'db dyn Database) -> Self::Green {
2909 ExprBinaryGreen(
2910 GreenNode {
2911 kind: SyntaxKind::ExprBinary,
2912 details: GreenNodeDetails::Node {
2913 children: [
2914 Expr::missing(db).0,
2915 BinaryOperator::missing(db).0,
2916 Expr::missing(db).0,
2917 ]
2918 .into(),
2919 width: TextWidth::default(),
2920 },
2921 }
2922 .intern(db),
2923 )
2924 }
2925 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2926 let kind = node.kind(db);
2927 assert_eq!(
2928 kind,
2929 SyntaxKind::ExprBinary,
2930 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2931 kind,
2932 SyntaxKind::ExprBinary
2933 );
2934 Self { node }
2935 }
2936 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2937 let kind = node.kind(db);
2938 if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2939 }
2940 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2941 self.node
2942 }
2943 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2944 ExprBinaryPtr(self.node.stable_ptr(db))
2945 }
2946}
2947#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2948pub enum BinaryOperator<'db> {
2949 Dot(TerminalDot<'db>),
2950 Not(TerminalNot<'db>),
2951 Mul(TerminalMul<'db>),
2952 MulEq(TerminalMulEq<'db>),
2953 Div(TerminalDiv<'db>),
2954 DivEq(TerminalDivEq<'db>),
2955 Mod(TerminalMod<'db>),
2956 ModEq(TerminalModEq<'db>),
2957 Plus(TerminalPlus<'db>),
2958 PlusEq(TerminalPlusEq<'db>),
2959 Minus(TerminalMinus<'db>),
2960 MinusEq(TerminalMinusEq<'db>),
2961 EqEq(TerminalEqEq<'db>),
2962 Neq(TerminalNeq<'db>),
2963 Eq(TerminalEq<'db>),
2964 And(TerminalAnd<'db>),
2965 AndAnd(TerminalAndAnd<'db>),
2966 Or(TerminalOr<'db>),
2967 OrOr(TerminalOrOr<'db>),
2968 Xor(TerminalXor<'db>),
2969 LE(TerminalLE<'db>),
2970 GE(TerminalGE<'db>),
2971 LT(TerminalLT<'db>),
2972 GT(TerminalGT<'db>),
2973 DotDot(TerminalDotDot<'db>),
2974 DotDotEq(TerminalDotDotEq<'db>),
2975}
2976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2977pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2978impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
2979 type SyntaxNode = BinaryOperator<'db>;
2980 fn untyped(self) -> SyntaxStablePtrId<'db> {
2981 self.0
2982 }
2983 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2984 BinaryOperator::from_syntax_node(db, self.0.lookup(db))
2985 }
2986}
2987impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2988 fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
2989 ptr.untyped()
2990 }
2991}
2992impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
2993 fn from(value: TerminalDotPtr<'db>) -> Self {
2994 Self(value.0)
2995 }
2996}
2997impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
2998 fn from(value: TerminalNotPtr<'db>) -> Self {
2999 Self(value.0)
3000 }
3001}
3002impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3003 fn from(value: TerminalMulPtr<'db>) -> Self {
3004 Self(value.0)
3005 }
3006}
3007impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3008 fn from(value: TerminalMulEqPtr<'db>) -> Self {
3009 Self(value.0)
3010 }
3011}
3012impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3013 fn from(value: TerminalDivPtr<'db>) -> Self {
3014 Self(value.0)
3015 }
3016}
3017impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3018 fn from(value: TerminalDivEqPtr<'db>) -> Self {
3019 Self(value.0)
3020 }
3021}
3022impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3023 fn from(value: TerminalModPtr<'db>) -> Self {
3024 Self(value.0)
3025 }
3026}
3027impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3028 fn from(value: TerminalModEqPtr<'db>) -> Self {
3029 Self(value.0)
3030 }
3031}
3032impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3033 fn from(value: TerminalPlusPtr<'db>) -> Self {
3034 Self(value.0)
3035 }
3036}
3037impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3038 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3039 Self(value.0)
3040 }
3041}
3042impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3043 fn from(value: TerminalMinusPtr<'db>) -> Self {
3044 Self(value.0)
3045 }
3046}
3047impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3048 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3049 Self(value.0)
3050 }
3051}
3052impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3053 fn from(value: TerminalEqEqPtr<'db>) -> Self {
3054 Self(value.0)
3055 }
3056}
3057impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3058 fn from(value: TerminalNeqPtr<'db>) -> Self {
3059 Self(value.0)
3060 }
3061}
3062impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3063 fn from(value: TerminalEqPtr<'db>) -> Self {
3064 Self(value.0)
3065 }
3066}
3067impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3068 fn from(value: TerminalAndPtr<'db>) -> Self {
3069 Self(value.0)
3070 }
3071}
3072impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3073 fn from(value: TerminalAndAndPtr<'db>) -> Self {
3074 Self(value.0)
3075 }
3076}
3077impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3078 fn from(value: TerminalOrPtr<'db>) -> Self {
3079 Self(value.0)
3080 }
3081}
3082impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3083 fn from(value: TerminalOrOrPtr<'db>) -> Self {
3084 Self(value.0)
3085 }
3086}
3087impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3088 fn from(value: TerminalXorPtr<'db>) -> Self {
3089 Self(value.0)
3090 }
3091}
3092impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3093 fn from(value: TerminalLEPtr<'db>) -> Self {
3094 Self(value.0)
3095 }
3096}
3097impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3098 fn from(value: TerminalGEPtr<'db>) -> Self {
3099 Self(value.0)
3100 }
3101}
3102impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3103 fn from(value: TerminalLTPtr<'db>) -> Self {
3104 Self(value.0)
3105 }
3106}
3107impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3108 fn from(value: TerminalGTPtr<'db>) -> Self {
3109 Self(value.0)
3110 }
3111}
3112impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3113 fn from(value: TerminalDotDotPtr<'db>) -> Self {
3114 Self(value.0)
3115 }
3116}
3117impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3118 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3119 Self(value.0)
3120 }
3121}
3122impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3123 fn from(value: TerminalDotGreen<'db>) -> Self {
3124 Self(value.0)
3125 }
3126}
3127impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3128 fn from(value: TerminalNotGreen<'db>) -> Self {
3129 Self(value.0)
3130 }
3131}
3132impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3133 fn from(value: TerminalMulGreen<'db>) -> Self {
3134 Self(value.0)
3135 }
3136}
3137impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3138 fn from(value: TerminalMulEqGreen<'db>) -> Self {
3139 Self(value.0)
3140 }
3141}
3142impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3143 fn from(value: TerminalDivGreen<'db>) -> Self {
3144 Self(value.0)
3145 }
3146}
3147impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3148 fn from(value: TerminalDivEqGreen<'db>) -> Self {
3149 Self(value.0)
3150 }
3151}
3152impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3153 fn from(value: TerminalModGreen<'db>) -> Self {
3154 Self(value.0)
3155 }
3156}
3157impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3158 fn from(value: TerminalModEqGreen<'db>) -> Self {
3159 Self(value.0)
3160 }
3161}
3162impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3163 fn from(value: TerminalPlusGreen<'db>) -> Self {
3164 Self(value.0)
3165 }
3166}
3167impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3168 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3169 Self(value.0)
3170 }
3171}
3172impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3173 fn from(value: TerminalMinusGreen<'db>) -> Self {
3174 Self(value.0)
3175 }
3176}
3177impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3178 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3179 Self(value.0)
3180 }
3181}
3182impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3183 fn from(value: TerminalEqEqGreen<'db>) -> Self {
3184 Self(value.0)
3185 }
3186}
3187impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3188 fn from(value: TerminalNeqGreen<'db>) -> Self {
3189 Self(value.0)
3190 }
3191}
3192impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3193 fn from(value: TerminalEqGreen<'db>) -> Self {
3194 Self(value.0)
3195 }
3196}
3197impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3198 fn from(value: TerminalAndGreen<'db>) -> Self {
3199 Self(value.0)
3200 }
3201}
3202impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3203 fn from(value: TerminalAndAndGreen<'db>) -> Self {
3204 Self(value.0)
3205 }
3206}
3207impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3208 fn from(value: TerminalOrGreen<'db>) -> Self {
3209 Self(value.0)
3210 }
3211}
3212impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3213 fn from(value: TerminalOrOrGreen<'db>) -> Self {
3214 Self(value.0)
3215 }
3216}
3217impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3218 fn from(value: TerminalXorGreen<'db>) -> Self {
3219 Self(value.0)
3220 }
3221}
3222impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3223 fn from(value: TerminalLEGreen<'db>) -> Self {
3224 Self(value.0)
3225 }
3226}
3227impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3228 fn from(value: TerminalGEGreen<'db>) -> Self {
3229 Self(value.0)
3230 }
3231}
3232impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3233 fn from(value: TerminalLTGreen<'db>) -> Self {
3234 Self(value.0)
3235 }
3236}
3237impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3238 fn from(value: TerminalGTGreen<'db>) -> Self {
3239 Self(value.0)
3240 }
3241}
3242impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3243 fn from(value: TerminalDotDotGreen<'db>) -> Self {
3244 Self(value.0)
3245 }
3246}
3247impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3248 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3249 Self(value.0)
3250 }
3251}
3252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3253pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3254impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3255 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3256 type StablePtr = BinaryOperatorPtr<'db>;
3257 type Green = BinaryOperatorGreen<'db>;
3258 fn missing(db: &'db dyn Database) -> Self::Green {
3259 panic!("No missing variant.");
3260 }
3261 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3262 let kind = node.kind(db);
3263 match kind {
3264 SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3265 SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3266 SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3267 SyntaxKind::TerminalMulEq => {
3268 BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3269 }
3270 SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3271 SyntaxKind::TerminalDivEq => {
3272 BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3273 }
3274 SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3275 SyntaxKind::TerminalModEq => {
3276 BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3277 }
3278 SyntaxKind::TerminalPlus => {
3279 BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3280 }
3281 SyntaxKind::TerminalPlusEq => {
3282 BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3283 }
3284 SyntaxKind::TerminalMinus => {
3285 BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3286 }
3287 SyntaxKind::TerminalMinusEq => {
3288 BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3289 }
3290 SyntaxKind::TerminalEqEq => {
3291 BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3292 }
3293 SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3294 SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3295 SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3296 SyntaxKind::TerminalAndAnd => {
3297 BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3298 }
3299 SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3300 SyntaxKind::TerminalOrOr => {
3301 BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3302 }
3303 SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3304 SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3305 SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3306 SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3307 SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3308 SyntaxKind::TerminalDotDot => {
3309 BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3310 }
3311 SyntaxKind::TerminalDotDotEq => {
3312 BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3313 }
3314 _ => {
3315 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3316 }
3317 }
3318 }
3319 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3320 let kind = node.kind(db);
3321 match kind {
3322 SyntaxKind::TerminalDot => {
3323 Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3324 }
3325 SyntaxKind::TerminalNot => {
3326 Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3327 }
3328 SyntaxKind::TerminalMul => {
3329 Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3330 }
3331 SyntaxKind::TerminalMulEq => {
3332 Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3333 }
3334 SyntaxKind::TerminalDiv => {
3335 Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3336 }
3337 SyntaxKind::TerminalDivEq => {
3338 Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3339 }
3340 SyntaxKind::TerminalMod => {
3341 Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3342 }
3343 SyntaxKind::TerminalModEq => {
3344 Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3345 }
3346 SyntaxKind::TerminalPlus => {
3347 Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3348 }
3349 SyntaxKind::TerminalPlusEq => {
3350 Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3351 }
3352 SyntaxKind::TerminalMinus => {
3353 Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3354 }
3355 SyntaxKind::TerminalMinusEq => {
3356 Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3357 }
3358 SyntaxKind::TerminalEqEq => {
3359 Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3360 }
3361 SyntaxKind::TerminalNeq => {
3362 Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3363 }
3364 SyntaxKind::TerminalEq => {
3365 Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3366 }
3367 SyntaxKind::TerminalAnd => {
3368 Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3369 }
3370 SyntaxKind::TerminalAndAnd => {
3371 Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3372 }
3373 SyntaxKind::TerminalOr => {
3374 Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3375 }
3376 SyntaxKind::TerminalOrOr => {
3377 Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3378 }
3379 SyntaxKind::TerminalXor => {
3380 Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3381 }
3382 SyntaxKind::TerminalLE => {
3383 Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3384 }
3385 SyntaxKind::TerminalGE => {
3386 Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3387 }
3388 SyntaxKind::TerminalLT => {
3389 Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3390 }
3391 SyntaxKind::TerminalGT => {
3392 Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3393 }
3394 SyntaxKind::TerminalDotDot => {
3395 Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3396 }
3397 SyntaxKind::TerminalDotDotEq => {
3398 Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3399 }
3400 _ => None,
3401 }
3402 }
3403 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3404 match self {
3405 BinaryOperator::Dot(x) => x.as_syntax_node(),
3406 BinaryOperator::Not(x) => x.as_syntax_node(),
3407 BinaryOperator::Mul(x) => x.as_syntax_node(),
3408 BinaryOperator::MulEq(x) => x.as_syntax_node(),
3409 BinaryOperator::Div(x) => x.as_syntax_node(),
3410 BinaryOperator::DivEq(x) => x.as_syntax_node(),
3411 BinaryOperator::Mod(x) => x.as_syntax_node(),
3412 BinaryOperator::ModEq(x) => x.as_syntax_node(),
3413 BinaryOperator::Plus(x) => x.as_syntax_node(),
3414 BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3415 BinaryOperator::Minus(x) => x.as_syntax_node(),
3416 BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3417 BinaryOperator::EqEq(x) => x.as_syntax_node(),
3418 BinaryOperator::Neq(x) => x.as_syntax_node(),
3419 BinaryOperator::Eq(x) => x.as_syntax_node(),
3420 BinaryOperator::And(x) => x.as_syntax_node(),
3421 BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3422 BinaryOperator::Or(x) => x.as_syntax_node(),
3423 BinaryOperator::OrOr(x) => x.as_syntax_node(),
3424 BinaryOperator::Xor(x) => x.as_syntax_node(),
3425 BinaryOperator::LE(x) => x.as_syntax_node(),
3426 BinaryOperator::GE(x) => x.as_syntax_node(),
3427 BinaryOperator::LT(x) => x.as_syntax_node(),
3428 BinaryOperator::GT(x) => x.as_syntax_node(),
3429 BinaryOperator::DotDot(x) => x.as_syntax_node(),
3430 BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3431 }
3432 }
3433 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3434 BinaryOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
3435 }
3436}
3437impl<'db> BinaryOperator<'db> {
3438 pub fn is_variant(kind: SyntaxKind) -> bool {
3440 matches!(
3441 kind,
3442 SyntaxKind::TerminalDot
3443 | SyntaxKind::TerminalNot
3444 | SyntaxKind::TerminalMul
3445 | SyntaxKind::TerminalMulEq
3446 | SyntaxKind::TerminalDiv
3447 | SyntaxKind::TerminalDivEq
3448 | SyntaxKind::TerminalMod
3449 | SyntaxKind::TerminalModEq
3450 | SyntaxKind::TerminalPlus
3451 | SyntaxKind::TerminalPlusEq
3452 | SyntaxKind::TerminalMinus
3453 | SyntaxKind::TerminalMinusEq
3454 | SyntaxKind::TerminalEqEq
3455 | SyntaxKind::TerminalNeq
3456 | SyntaxKind::TerminalEq
3457 | SyntaxKind::TerminalAnd
3458 | SyntaxKind::TerminalAndAnd
3459 | SyntaxKind::TerminalOr
3460 | SyntaxKind::TerminalOrOr
3461 | SyntaxKind::TerminalXor
3462 | SyntaxKind::TerminalLE
3463 | SyntaxKind::TerminalGE
3464 | SyntaxKind::TerminalLT
3465 | SyntaxKind::TerminalGT
3466 | SyntaxKind::TerminalDotDot
3467 | SyntaxKind::TerminalDotDotEq
3468 )
3469 }
3470}
3471#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3472pub struct ExprListParenthesized<'db> {
3473 node: SyntaxNode<'db>,
3474}
3475impl<'db> ExprListParenthesized<'db> {
3476 pub const INDEX_LPAREN: usize = 0;
3477 pub const INDEX_EXPRESSIONS: usize = 1;
3478 pub const INDEX_RPAREN: usize = 2;
3479 pub fn new_green(
3480 db: &'db dyn Database,
3481 lparen: TerminalLParenGreen<'db>,
3482 expressions: ExprListGreen<'db>,
3483 rparen: TerminalRParenGreen<'db>,
3484 ) -> ExprListParenthesizedGreen<'db> {
3485 let children = [lparen.0, expressions.0, rparen.0];
3486 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3487 ExprListParenthesizedGreen(
3488 GreenNode {
3489 kind: SyntaxKind::ExprListParenthesized,
3490 details: GreenNodeDetails::Node { children: children.into(), width },
3491 }
3492 .intern(db),
3493 )
3494 }
3495}
3496impl<'db> ExprListParenthesized<'db> {
3497 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3498 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3499 }
3500 pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3501 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3502 }
3503 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3504 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3505 }
3506}
3507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3508pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3509impl<'db> ExprListParenthesizedPtr<'db> {}
3510impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3511 type SyntaxNode = ExprListParenthesized<'db>;
3512 fn untyped(self) -> SyntaxStablePtrId<'db> {
3513 self.0
3514 }
3515 fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3516 ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3517 }
3518}
3519impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3520 fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3521 ptr.untyped()
3522 }
3523}
3524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3525pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3526impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3527 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3528 type StablePtr = ExprListParenthesizedPtr<'db>;
3529 type Green = ExprListParenthesizedGreen<'db>;
3530 fn missing(db: &'db dyn Database) -> Self::Green {
3531 ExprListParenthesizedGreen(
3532 GreenNode {
3533 kind: SyntaxKind::ExprListParenthesized,
3534 details: GreenNodeDetails::Node {
3535 children: [
3536 TerminalLParen::missing(db).0,
3537 ExprList::missing(db).0,
3538 TerminalRParen::missing(db).0,
3539 ]
3540 .into(),
3541 width: TextWidth::default(),
3542 },
3543 }
3544 .intern(db),
3545 )
3546 }
3547 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3548 let kind = node.kind(db);
3549 assert_eq!(
3550 kind,
3551 SyntaxKind::ExprListParenthesized,
3552 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3553 kind,
3554 SyntaxKind::ExprListParenthesized
3555 );
3556 Self { node }
3557 }
3558 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3559 let kind = node.kind(db);
3560 if kind == SyntaxKind::ExprListParenthesized {
3561 Some(Self::from_syntax_node(db, node))
3562 } else {
3563 None
3564 }
3565 }
3566 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3567 self.node
3568 }
3569 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3570 ExprListParenthesizedPtr(self.node.stable_ptr(db))
3571 }
3572}
3573#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3574pub struct ExprFunctionCall<'db> {
3575 node: SyntaxNode<'db>,
3576}
3577impl<'db> ExprFunctionCall<'db> {
3578 pub const INDEX_PATH: usize = 0;
3579 pub const INDEX_ARGUMENTS: usize = 1;
3580 pub fn new_green(
3581 db: &'db dyn Database,
3582 path: ExprPathGreen<'db>,
3583 arguments: ArgListParenthesizedGreen<'db>,
3584 ) -> ExprFunctionCallGreen<'db> {
3585 let children = [path.0, arguments.0];
3586 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3587 ExprFunctionCallGreen(
3588 GreenNode {
3589 kind: SyntaxKind::ExprFunctionCall,
3590 details: GreenNodeDetails::Node { children: children.into(), width },
3591 }
3592 .intern(db),
3593 )
3594 }
3595}
3596impl<'db> ExprFunctionCall<'db> {
3597 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3598 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3599 }
3600 pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3601 ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3602 }
3603}
3604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3605pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3606impl<'db> ExprFunctionCallPtr<'db> {}
3607impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3608 type SyntaxNode = ExprFunctionCall<'db>;
3609 fn untyped(self) -> SyntaxStablePtrId<'db> {
3610 self.0
3611 }
3612 fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3613 ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3614 }
3615}
3616impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3617 fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3618 ptr.untyped()
3619 }
3620}
3621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3622pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3623impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3624 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3625 type StablePtr = ExprFunctionCallPtr<'db>;
3626 type Green = ExprFunctionCallGreen<'db>;
3627 fn missing(db: &'db dyn Database) -> Self::Green {
3628 ExprFunctionCallGreen(
3629 GreenNode {
3630 kind: SyntaxKind::ExprFunctionCall,
3631 details: GreenNodeDetails::Node {
3632 children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3633 width: TextWidth::default(),
3634 },
3635 }
3636 .intern(db),
3637 )
3638 }
3639 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3640 let kind = node.kind(db);
3641 assert_eq!(
3642 kind,
3643 SyntaxKind::ExprFunctionCall,
3644 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3645 kind,
3646 SyntaxKind::ExprFunctionCall
3647 );
3648 Self { node }
3649 }
3650 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3651 let kind = node.kind(db);
3652 if kind == SyntaxKind::ExprFunctionCall {
3653 Some(Self::from_syntax_node(db, node))
3654 } else {
3655 None
3656 }
3657 }
3658 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3659 self.node
3660 }
3661 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3662 ExprFunctionCallPtr(self.node.stable_ptr(db))
3663 }
3664}
3665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3666pub struct ArgListParenthesized<'db> {
3667 node: SyntaxNode<'db>,
3668}
3669impl<'db> ArgListParenthesized<'db> {
3670 pub const INDEX_LPAREN: usize = 0;
3671 pub const INDEX_ARGUMENTS: usize = 1;
3672 pub const INDEX_RPAREN: usize = 2;
3673 pub fn new_green(
3674 db: &'db dyn Database,
3675 lparen: TerminalLParenGreen<'db>,
3676 arguments: ArgListGreen<'db>,
3677 rparen: TerminalRParenGreen<'db>,
3678 ) -> ArgListParenthesizedGreen<'db> {
3679 let children = [lparen.0, arguments.0, rparen.0];
3680 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3681 ArgListParenthesizedGreen(
3682 GreenNode {
3683 kind: SyntaxKind::ArgListParenthesized,
3684 details: GreenNodeDetails::Node { children: children.into(), width },
3685 }
3686 .intern(db),
3687 )
3688 }
3689}
3690impl<'db> ArgListParenthesized<'db> {
3691 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3692 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3693 }
3694 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3695 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3696 }
3697 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3698 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3699 }
3700}
3701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3702pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3703impl<'db> ArgListParenthesizedPtr<'db> {}
3704impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3705 type SyntaxNode = ArgListParenthesized<'db>;
3706 fn untyped(self) -> SyntaxStablePtrId<'db> {
3707 self.0
3708 }
3709 fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3710 ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3711 }
3712}
3713impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3714 fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3715 ptr.untyped()
3716 }
3717}
3718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3719pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3720impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3721 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3722 type StablePtr = ArgListParenthesizedPtr<'db>;
3723 type Green = ArgListParenthesizedGreen<'db>;
3724 fn missing(db: &'db dyn Database) -> Self::Green {
3725 ArgListParenthesizedGreen(
3726 GreenNode {
3727 kind: SyntaxKind::ArgListParenthesized,
3728 details: GreenNodeDetails::Node {
3729 children: [
3730 TerminalLParen::missing(db).0,
3731 ArgList::missing(db).0,
3732 TerminalRParen::missing(db).0,
3733 ]
3734 .into(),
3735 width: TextWidth::default(),
3736 },
3737 }
3738 .intern(db),
3739 )
3740 }
3741 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3742 let kind = node.kind(db);
3743 assert_eq!(
3744 kind,
3745 SyntaxKind::ArgListParenthesized,
3746 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3747 kind,
3748 SyntaxKind::ArgListParenthesized
3749 );
3750 Self { node }
3751 }
3752 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3753 let kind = node.kind(db);
3754 if kind == SyntaxKind::ArgListParenthesized {
3755 Some(Self::from_syntax_node(db, node))
3756 } else {
3757 None
3758 }
3759 }
3760 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3761 self.node
3762 }
3763 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3764 ArgListParenthesizedPtr(self.node.stable_ptr(db))
3765 }
3766}
3767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3768pub enum OptionArgListParenthesized<'db> {
3769 Empty(OptionArgListParenthesizedEmpty<'db>),
3770 ArgListParenthesized(ArgListParenthesized<'db>),
3771}
3772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3773pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3774impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3775 type SyntaxNode = OptionArgListParenthesized<'db>;
3776 fn untyped(self) -> SyntaxStablePtrId<'db> {
3777 self.0
3778 }
3779 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3780 OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3781 }
3782}
3783impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3784 fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3785 ptr.untyped()
3786 }
3787}
3788impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3789 fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3790 Self(value.0)
3791 }
3792}
3793impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3794 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3795 Self(value.0)
3796 }
3797}
3798impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3799 fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3800 Self(value.0)
3801 }
3802}
3803impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3804 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3805 Self(value.0)
3806 }
3807}
3808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3809pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3810impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3811 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3812 type StablePtr = OptionArgListParenthesizedPtr<'db>;
3813 type Green = OptionArgListParenthesizedGreen<'db>;
3814 fn missing(db: &'db dyn Database) -> Self::Green {
3815 panic!("No missing variant.");
3816 }
3817 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3818 let kind = node.kind(db);
3819 match kind {
3820 SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3821 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3822 ),
3823 SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3824 ArgListParenthesized::from_syntax_node(db, node),
3825 ),
3826 _ => panic!(
3827 "Unexpected syntax kind {:?} when constructing {}.",
3828 kind, "OptionArgListParenthesized"
3829 ),
3830 }
3831 }
3832 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3833 let kind = node.kind(db);
3834 match kind {
3835 SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3836 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3837 )),
3838 SyntaxKind::ArgListParenthesized => {
3839 Some(OptionArgListParenthesized::ArgListParenthesized(
3840 ArgListParenthesized::from_syntax_node(db, node),
3841 ))
3842 }
3843 _ => None,
3844 }
3845 }
3846 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3847 match self {
3848 OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3849 OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3850 }
3851 }
3852 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3853 OptionArgListParenthesizedPtr(self.as_syntax_node().long(db).stable_ptr)
3854 }
3855}
3856impl<'db> OptionArgListParenthesized<'db> {
3857 pub fn is_variant(kind: SyntaxKind) -> bool {
3859 matches!(
3860 kind,
3861 SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3862 )
3863 }
3864}
3865#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3866pub struct OptionArgListParenthesizedEmpty<'db> {
3867 node: SyntaxNode<'db>,
3868}
3869impl<'db> OptionArgListParenthesizedEmpty<'db> {
3870 pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3871 let children = [];
3872 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3873 OptionArgListParenthesizedEmptyGreen(
3874 GreenNode {
3875 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3876 details: GreenNodeDetails::Node { children: children.into(), width },
3877 }
3878 .intern(db),
3879 )
3880 }
3881}
3882impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3884pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3885impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3886impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3887 type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3888 fn untyped(self) -> SyntaxStablePtrId<'db> {
3889 self.0
3890 }
3891 fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3892 OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3893 }
3894}
3895impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3896 fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3897 ptr.untyped()
3898 }
3899}
3900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3901pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3902impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3903 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3904 type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3905 type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3906 fn missing(db: &'db dyn Database) -> Self::Green {
3907 OptionArgListParenthesizedEmptyGreen(
3908 GreenNode {
3909 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3910 details: GreenNodeDetails::Node {
3911 children: [].into(),
3912 width: TextWidth::default(),
3913 },
3914 }
3915 .intern(db),
3916 )
3917 }
3918 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3919 let kind = node.kind(db);
3920 assert_eq!(
3921 kind,
3922 SyntaxKind::OptionArgListParenthesizedEmpty,
3923 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3924 kind,
3925 SyntaxKind::OptionArgListParenthesizedEmpty
3926 );
3927 Self { node }
3928 }
3929 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3930 let kind = node.kind(db);
3931 if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3932 Some(Self::from_syntax_node(db, node))
3933 } else {
3934 None
3935 }
3936 }
3937 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3938 self.node
3939 }
3940 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3941 OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3942 }
3943}
3944#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3945pub struct ExprStructCtorCall<'db> {
3946 node: SyntaxNode<'db>,
3947}
3948impl<'db> ExprStructCtorCall<'db> {
3949 pub const INDEX_PATH: usize = 0;
3950 pub const INDEX_ARGUMENTS: usize = 1;
3951 pub fn new_green(
3952 db: &'db dyn Database,
3953 path: ExprPathGreen<'db>,
3954 arguments: StructArgListBracedGreen<'db>,
3955 ) -> ExprStructCtorCallGreen<'db> {
3956 let children = [path.0, arguments.0];
3957 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3958 ExprStructCtorCallGreen(
3959 GreenNode {
3960 kind: SyntaxKind::ExprStructCtorCall,
3961 details: GreenNodeDetails::Node { children: children.into(), width },
3962 }
3963 .intern(db),
3964 )
3965 }
3966}
3967impl<'db> ExprStructCtorCall<'db> {
3968 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3969 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3970 }
3971 pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
3972 StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
3973 }
3974}
3975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3976pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3977impl<'db> ExprStructCtorCallPtr<'db> {}
3978impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
3979 type SyntaxNode = ExprStructCtorCall<'db>;
3980 fn untyped(self) -> SyntaxStablePtrId<'db> {
3981 self.0
3982 }
3983 fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
3984 ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
3985 }
3986}
3987impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
3988 fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
3989 ptr.untyped()
3990 }
3991}
3992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3993pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
3994impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
3995 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
3996 type StablePtr = ExprStructCtorCallPtr<'db>;
3997 type Green = ExprStructCtorCallGreen<'db>;
3998 fn missing(db: &'db dyn Database) -> Self::Green {
3999 ExprStructCtorCallGreen(
4000 GreenNode {
4001 kind: SyntaxKind::ExprStructCtorCall,
4002 details: GreenNodeDetails::Node {
4003 children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4004 width: TextWidth::default(),
4005 },
4006 }
4007 .intern(db),
4008 )
4009 }
4010 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4011 let kind = node.kind(db);
4012 assert_eq!(
4013 kind,
4014 SyntaxKind::ExprStructCtorCall,
4015 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4016 kind,
4017 SyntaxKind::ExprStructCtorCall
4018 );
4019 Self { node }
4020 }
4021 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4022 let kind = node.kind(db);
4023 if kind == SyntaxKind::ExprStructCtorCall {
4024 Some(Self::from_syntax_node(db, node))
4025 } else {
4026 None
4027 }
4028 }
4029 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4030 self.node
4031 }
4032 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4033 ExprStructCtorCallPtr(self.node.stable_ptr(db))
4034 }
4035}
4036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4037pub struct StructArgListBraced<'db> {
4038 node: SyntaxNode<'db>,
4039}
4040impl<'db> StructArgListBraced<'db> {
4041 pub const INDEX_LBRACE: usize = 0;
4042 pub const INDEX_ARGUMENTS: usize = 1;
4043 pub const INDEX_RBRACE: usize = 2;
4044 pub fn new_green(
4045 db: &'db dyn Database,
4046 lbrace: TerminalLBraceGreen<'db>,
4047 arguments: StructArgListGreen<'db>,
4048 rbrace: TerminalRBraceGreen<'db>,
4049 ) -> StructArgListBracedGreen<'db> {
4050 let children = [lbrace.0, arguments.0, rbrace.0];
4051 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4052 StructArgListBracedGreen(
4053 GreenNode {
4054 kind: SyntaxKind::StructArgListBraced,
4055 details: GreenNodeDetails::Node { children: children.into(), width },
4056 }
4057 .intern(db),
4058 )
4059 }
4060}
4061impl<'db> StructArgListBraced<'db> {
4062 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4063 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4064 }
4065 pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4066 StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4067 }
4068 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4069 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4070 }
4071}
4072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4073pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4074impl<'db> StructArgListBracedPtr<'db> {}
4075impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4076 type SyntaxNode = StructArgListBraced<'db>;
4077 fn untyped(self) -> SyntaxStablePtrId<'db> {
4078 self.0
4079 }
4080 fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4081 StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4082 }
4083}
4084impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4085 fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4086 ptr.untyped()
4087 }
4088}
4089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4090pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4091impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4092 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4093 type StablePtr = StructArgListBracedPtr<'db>;
4094 type Green = StructArgListBracedGreen<'db>;
4095 fn missing(db: &'db dyn Database) -> Self::Green {
4096 StructArgListBracedGreen(
4097 GreenNode {
4098 kind: SyntaxKind::StructArgListBraced,
4099 details: GreenNodeDetails::Node {
4100 children: [
4101 TerminalLBrace::missing(db).0,
4102 StructArgList::missing(db).0,
4103 TerminalRBrace::missing(db).0,
4104 ]
4105 .into(),
4106 width: TextWidth::default(),
4107 },
4108 }
4109 .intern(db),
4110 )
4111 }
4112 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4113 let kind = node.kind(db);
4114 assert_eq!(
4115 kind,
4116 SyntaxKind::StructArgListBraced,
4117 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4118 kind,
4119 SyntaxKind::StructArgListBraced
4120 );
4121 Self { node }
4122 }
4123 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4124 let kind = node.kind(db);
4125 if kind == SyntaxKind::StructArgListBraced {
4126 Some(Self::from_syntax_node(db, node))
4127 } else {
4128 None
4129 }
4130 }
4131 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4132 self.node
4133 }
4134 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4135 StructArgListBracedPtr(self.node.stable_ptr(db))
4136 }
4137}
4138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4139pub struct ExprBlock<'db> {
4140 node: SyntaxNode<'db>,
4141}
4142impl<'db> ExprBlock<'db> {
4143 pub const INDEX_LBRACE: usize = 0;
4144 pub const INDEX_STATEMENTS: usize = 1;
4145 pub const INDEX_RBRACE: usize = 2;
4146 pub fn new_green(
4147 db: &'db dyn Database,
4148 lbrace: TerminalLBraceGreen<'db>,
4149 statements: StatementListGreen<'db>,
4150 rbrace: TerminalRBraceGreen<'db>,
4151 ) -> ExprBlockGreen<'db> {
4152 let children = [lbrace.0, statements.0, rbrace.0];
4153 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4154 ExprBlockGreen(
4155 GreenNode {
4156 kind: SyntaxKind::ExprBlock,
4157 details: GreenNodeDetails::Node { children: children.into(), width },
4158 }
4159 .intern(db),
4160 )
4161 }
4162}
4163impl<'db> ExprBlock<'db> {
4164 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4165 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4166 }
4167 pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4168 StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4169 }
4170 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4171 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4172 }
4173}
4174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4175pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4176impl<'db> ExprBlockPtr<'db> {}
4177impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4178 type SyntaxNode = ExprBlock<'db>;
4179 fn untyped(self) -> SyntaxStablePtrId<'db> {
4180 self.0
4181 }
4182 fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4183 ExprBlock::from_syntax_node(db, self.0.lookup(db))
4184 }
4185}
4186impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4187 fn from(ptr: ExprBlockPtr<'db>) -> Self {
4188 ptr.untyped()
4189 }
4190}
4191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4192pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4193impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4194 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4195 type StablePtr = ExprBlockPtr<'db>;
4196 type Green = ExprBlockGreen<'db>;
4197 fn missing(db: &'db dyn Database) -> Self::Green {
4198 ExprBlockGreen(
4199 GreenNode {
4200 kind: SyntaxKind::ExprBlock,
4201 details: GreenNodeDetails::Node {
4202 children: [
4203 TerminalLBrace::missing(db).0,
4204 StatementList::missing(db).0,
4205 TerminalRBrace::missing(db).0,
4206 ]
4207 .into(),
4208 width: TextWidth::default(),
4209 },
4210 }
4211 .intern(db),
4212 )
4213 }
4214 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4215 let kind = node.kind(db);
4216 assert_eq!(
4217 kind,
4218 SyntaxKind::ExprBlock,
4219 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4220 kind,
4221 SyntaxKind::ExprBlock
4222 );
4223 Self { node }
4224 }
4225 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4226 let kind = node.kind(db);
4227 if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4228 }
4229 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4230 self.node
4231 }
4232 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4233 ExprBlockPtr(self.node.stable_ptr(db))
4234 }
4235}
4236#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4237pub struct ExprMatch<'db> {
4238 node: SyntaxNode<'db>,
4239}
4240impl<'db> ExprMatch<'db> {
4241 pub const INDEX_MATCH_KW: usize = 0;
4242 pub const INDEX_EXPR: usize = 1;
4243 pub const INDEX_LBRACE: usize = 2;
4244 pub const INDEX_ARMS: usize = 3;
4245 pub const INDEX_RBRACE: usize = 4;
4246 pub fn new_green(
4247 db: &'db dyn Database,
4248 match_kw: TerminalMatchGreen<'db>,
4249 expr: ExprGreen<'db>,
4250 lbrace: TerminalLBraceGreen<'db>,
4251 arms: MatchArmsGreen<'db>,
4252 rbrace: TerminalRBraceGreen<'db>,
4253 ) -> ExprMatchGreen<'db> {
4254 let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4255 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4256 ExprMatchGreen(
4257 GreenNode {
4258 kind: SyntaxKind::ExprMatch,
4259 details: GreenNodeDetails::Node { children: children.into(), width },
4260 }
4261 .intern(db),
4262 )
4263 }
4264}
4265impl<'db> ExprMatch<'db> {
4266 pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4267 TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4268 }
4269 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4270 Expr::from_syntax_node(db, self.node.get_children(db)[1])
4271 }
4272 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4273 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4274 }
4275 pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4276 MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4277 }
4278 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4279 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4280 }
4281}
4282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4283pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4284impl<'db> ExprMatchPtr<'db> {}
4285impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4286 type SyntaxNode = ExprMatch<'db>;
4287 fn untyped(self) -> SyntaxStablePtrId<'db> {
4288 self.0
4289 }
4290 fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4291 ExprMatch::from_syntax_node(db, self.0.lookup(db))
4292 }
4293}
4294impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4295 fn from(ptr: ExprMatchPtr<'db>) -> Self {
4296 ptr.untyped()
4297 }
4298}
4299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4300pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4301impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4302 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4303 type StablePtr = ExprMatchPtr<'db>;
4304 type Green = ExprMatchGreen<'db>;
4305 fn missing(db: &'db dyn Database) -> Self::Green {
4306 ExprMatchGreen(
4307 GreenNode {
4308 kind: SyntaxKind::ExprMatch,
4309 details: GreenNodeDetails::Node {
4310 children: [
4311 TerminalMatch::missing(db).0,
4312 Expr::missing(db).0,
4313 TerminalLBrace::missing(db).0,
4314 MatchArms::missing(db).0,
4315 TerminalRBrace::missing(db).0,
4316 ]
4317 .into(),
4318 width: TextWidth::default(),
4319 },
4320 }
4321 .intern(db),
4322 )
4323 }
4324 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4325 let kind = node.kind(db);
4326 assert_eq!(
4327 kind,
4328 SyntaxKind::ExprMatch,
4329 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4330 kind,
4331 SyntaxKind::ExprMatch
4332 );
4333 Self { node }
4334 }
4335 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4336 let kind = node.kind(db);
4337 if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4338 }
4339 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4340 self.node
4341 }
4342 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4343 ExprMatchPtr(self.node.stable_ptr(db))
4344 }
4345}
4346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4347pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4348impl<'db> Deref for MatchArms<'db> {
4349 type Target = ElementList<'db, MatchArm<'db>, 2>;
4350 fn deref(&self) -> &Self::Target {
4351 &self.0
4352 }
4353}
4354impl<'db> MatchArms<'db> {
4355 pub fn new_green(
4356 db: &'db dyn Database,
4357 children: &[MatchArmsElementOrSeparatorGreen<'db>],
4358 ) -> MatchArmsGreen<'db> {
4359 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4360 MatchArmsGreen(
4361 GreenNode {
4362 kind: SyntaxKind::MatchArms,
4363 details: GreenNodeDetails::Node {
4364 children: children.iter().map(|x| x.id()).collect(),
4365 width,
4366 },
4367 }
4368 .intern(db),
4369 )
4370 }
4371}
4372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4373pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4374impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4375 type SyntaxNode = MatchArms<'db>;
4376 fn untyped(self) -> SyntaxStablePtrId<'db> {
4377 self.0
4378 }
4379 fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4380 MatchArms::from_syntax_node(db, self.0.lookup(db))
4381 }
4382}
4383impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4384 fn from(ptr: MatchArmsPtr<'db>) -> Self {
4385 ptr.untyped()
4386 }
4387}
4388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4389pub enum MatchArmsElementOrSeparatorGreen<'db> {
4390 Separator(TerminalCommaGreen<'db>),
4391 Element(MatchArmGreen<'db>),
4392}
4393impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4394 fn from(value: TerminalCommaGreen<'db>) -> Self {
4395 MatchArmsElementOrSeparatorGreen::Separator(value)
4396 }
4397}
4398impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4399 fn from(value: MatchArmGreen<'db>) -> Self {
4400 MatchArmsElementOrSeparatorGreen::Element(value)
4401 }
4402}
4403impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4404 fn id(&self) -> GreenId<'db> {
4405 match self {
4406 MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4407 MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4408 }
4409 }
4410}
4411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4412pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4413impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4414 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4415 type StablePtr = MatchArmsPtr<'db>;
4416 type Green = MatchArmsGreen<'db>;
4417 fn missing(db: &'db dyn Database) -> Self::Green {
4418 MatchArmsGreen(
4419 GreenNode {
4420 kind: SyntaxKind::MatchArms,
4421 details: GreenNodeDetails::Node {
4422 children: [].into(),
4423 width: TextWidth::default(),
4424 },
4425 }
4426 .intern(db),
4427 )
4428 }
4429 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4430 Self(ElementList::new(node))
4431 }
4432 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4433 if node.kind(db) == SyntaxKind::MatchArms {
4434 Some(Self(ElementList::new(node)))
4435 } else {
4436 None
4437 }
4438 }
4439 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4440 self.node
4441 }
4442 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4443 MatchArmsPtr(self.node.stable_ptr(db))
4444 }
4445}
4446#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4447pub struct MatchArm<'db> {
4448 node: SyntaxNode<'db>,
4449}
4450impl<'db> MatchArm<'db> {
4451 pub const INDEX_PATTERNS: usize = 0;
4452 pub const INDEX_ARROW: usize = 1;
4453 pub const INDEX_EXPRESSION: usize = 2;
4454 pub fn new_green(
4455 db: &'db dyn Database,
4456 patterns: PatternListOrGreen<'db>,
4457 arrow: TerminalMatchArrowGreen<'db>,
4458 expression: ExprGreen<'db>,
4459 ) -> MatchArmGreen<'db> {
4460 let children = [patterns.0, arrow.0, expression.0];
4461 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4462 MatchArmGreen(
4463 GreenNode {
4464 kind: SyntaxKind::MatchArm,
4465 details: GreenNodeDetails::Node { children: children.into(), width },
4466 }
4467 .intern(db),
4468 )
4469 }
4470}
4471impl<'db> MatchArm<'db> {
4472 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4473 PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4474 }
4475 pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4476 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4477 }
4478 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4479 Expr::from_syntax_node(db, self.node.get_children(db)[2])
4480 }
4481}
4482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4483pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4484impl<'db> MatchArmPtr<'db> {}
4485impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4486 type SyntaxNode = MatchArm<'db>;
4487 fn untyped(self) -> SyntaxStablePtrId<'db> {
4488 self.0
4489 }
4490 fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4491 MatchArm::from_syntax_node(db, self.0.lookup(db))
4492 }
4493}
4494impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4495 fn from(ptr: MatchArmPtr<'db>) -> Self {
4496 ptr.untyped()
4497 }
4498}
4499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4500pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4501impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4502 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4503 type StablePtr = MatchArmPtr<'db>;
4504 type Green = MatchArmGreen<'db>;
4505 fn missing(db: &'db dyn Database) -> Self::Green {
4506 MatchArmGreen(
4507 GreenNode {
4508 kind: SyntaxKind::MatchArm,
4509 details: GreenNodeDetails::Node {
4510 children: [
4511 PatternListOr::missing(db).0,
4512 TerminalMatchArrow::missing(db).0,
4513 Expr::missing(db).0,
4514 ]
4515 .into(),
4516 width: TextWidth::default(),
4517 },
4518 }
4519 .intern(db),
4520 )
4521 }
4522 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4523 let kind = node.kind(db);
4524 assert_eq!(
4525 kind,
4526 SyntaxKind::MatchArm,
4527 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4528 kind,
4529 SyntaxKind::MatchArm
4530 );
4531 Self { node }
4532 }
4533 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4534 let kind = node.kind(db);
4535 if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4536 }
4537 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4538 self.node
4539 }
4540 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4541 MatchArmPtr(self.node.stable_ptr(db))
4542 }
4543}
4544#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4545pub struct ExprIf<'db> {
4546 node: SyntaxNode<'db>,
4547}
4548impl<'db> ExprIf<'db> {
4549 pub const INDEX_IF_KW: usize = 0;
4550 pub const INDEX_CONDITIONS: usize = 1;
4551 pub const INDEX_IF_BLOCK: usize = 2;
4552 pub const INDEX_ELSE_CLAUSE: usize = 3;
4553 pub fn new_green(
4554 db: &'db dyn Database,
4555 if_kw: TerminalIfGreen<'db>,
4556 conditions: ConditionListAndGreen<'db>,
4557 if_block: ExprBlockGreen<'db>,
4558 else_clause: OptionElseClauseGreen<'db>,
4559 ) -> ExprIfGreen<'db> {
4560 let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4561 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4562 ExprIfGreen(
4563 GreenNode {
4564 kind: SyntaxKind::ExprIf,
4565 details: GreenNodeDetails::Node { children: children.into(), width },
4566 }
4567 .intern(db),
4568 )
4569 }
4570}
4571impl<'db> ExprIf<'db> {
4572 pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4573 TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4574 }
4575 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4576 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4577 }
4578 pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4579 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4580 }
4581 pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4582 OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4583 }
4584}
4585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4586pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4587impl<'db> ExprIfPtr<'db> {}
4588impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4589 type SyntaxNode = ExprIf<'db>;
4590 fn untyped(self) -> SyntaxStablePtrId<'db> {
4591 self.0
4592 }
4593 fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4594 ExprIf::from_syntax_node(db, self.0.lookup(db))
4595 }
4596}
4597impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4598 fn from(ptr: ExprIfPtr<'db>) -> Self {
4599 ptr.untyped()
4600 }
4601}
4602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4603pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4604impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4605 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4606 type StablePtr = ExprIfPtr<'db>;
4607 type Green = ExprIfGreen<'db>;
4608 fn missing(db: &'db dyn Database) -> Self::Green {
4609 ExprIfGreen(
4610 GreenNode {
4611 kind: SyntaxKind::ExprIf,
4612 details: GreenNodeDetails::Node {
4613 children: [
4614 TerminalIf::missing(db).0,
4615 ConditionListAnd::missing(db).0,
4616 ExprBlock::missing(db).0,
4617 OptionElseClause::missing(db).0,
4618 ]
4619 .into(),
4620 width: TextWidth::default(),
4621 },
4622 }
4623 .intern(db),
4624 )
4625 }
4626 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4627 let kind = node.kind(db);
4628 assert_eq!(
4629 kind,
4630 SyntaxKind::ExprIf,
4631 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4632 kind,
4633 SyntaxKind::ExprIf
4634 );
4635 Self { node }
4636 }
4637 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4638 let kind = node.kind(db);
4639 if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4640 }
4641 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4642 self.node
4643 }
4644 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4645 ExprIfPtr(self.node.stable_ptr(db))
4646 }
4647}
4648#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4649pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4650impl<'db> Deref for ConditionListAnd<'db> {
4651 type Target = ElementList<'db, Condition<'db>, 2>;
4652 fn deref(&self) -> &Self::Target {
4653 &self.0
4654 }
4655}
4656impl<'db> ConditionListAnd<'db> {
4657 pub fn new_green(
4658 db: &'db dyn Database,
4659 children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4660 ) -> ConditionListAndGreen<'db> {
4661 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4662 ConditionListAndGreen(
4663 GreenNode {
4664 kind: SyntaxKind::ConditionListAnd,
4665 details: GreenNodeDetails::Node {
4666 children: children.iter().map(|x| x.id()).collect(),
4667 width,
4668 },
4669 }
4670 .intern(db),
4671 )
4672 }
4673}
4674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4675pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4676impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4677 type SyntaxNode = ConditionListAnd<'db>;
4678 fn untyped(self) -> SyntaxStablePtrId<'db> {
4679 self.0
4680 }
4681 fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4682 ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4683 }
4684}
4685impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4686 fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4687 ptr.untyped()
4688 }
4689}
4690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4691pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4692 Separator(TerminalAndAndGreen<'db>),
4693 Element(ConditionGreen<'db>),
4694}
4695impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4696 fn from(value: TerminalAndAndGreen<'db>) -> Self {
4697 ConditionListAndElementOrSeparatorGreen::Separator(value)
4698 }
4699}
4700impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4701 fn from(value: ConditionGreen<'db>) -> Self {
4702 ConditionListAndElementOrSeparatorGreen::Element(value)
4703 }
4704}
4705impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4706 fn id(&self) -> GreenId<'db> {
4707 match self {
4708 ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4709 ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4710 }
4711 }
4712}
4713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4714pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4715impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4716 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4717 type StablePtr = ConditionListAndPtr<'db>;
4718 type Green = ConditionListAndGreen<'db>;
4719 fn missing(db: &'db dyn Database) -> Self::Green {
4720 ConditionListAndGreen(
4721 GreenNode {
4722 kind: SyntaxKind::ConditionListAnd,
4723 details: GreenNodeDetails::Node {
4724 children: [].into(),
4725 width: TextWidth::default(),
4726 },
4727 }
4728 .intern(db),
4729 )
4730 }
4731 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4732 Self(ElementList::new(node))
4733 }
4734 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4735 if node.kind(db) == SyntaxKind::ConditionListAnd {
4736 Some(Self(ElementList::new(node)))
4737 } else {
4738 None
4739 }
4740 }
4741 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4742 self.node
4743 }
4744 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4745 ConditionListAndPtr(self.node.stable_ptr(db))
4746 }
4747}
4748#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4749pub enum Condition<'db> {
4750 Let(ConditionLet<'db>),
4751 Expr(ConditionExpr<'db>),
4752}
4753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4754pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4755impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4756 type SyntaxNode = Condition<'db>;
4757 fn untyped(self) -> SyntaxStablePtrId<'db> {
4758 self.0
4759 }
4760 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4761 Condition::from_syntax_node(db, self.0.lookup(db))
4762 }
4763}
4764impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4765 fn from(ptr: ConditionPtr<'db>) -> Self {
4766 ptr.untyped()
4767 }
4768}
4769impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4770 fn from(value: ConditionLetPtr<'db>) -> Self {
4771 Self(value.0)
4772 }
4773}
4774impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4775 fn from(value: ConditionExprPtr<'db>) -> Self {
4776 Self(value.0)
4777 }
4778}
4779impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4780 fn from(value: ConditionLetGreen<'db>) -> Self {
4781 Self(value.0)
4782 }
4783}
4784impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4785 fn from(value: ConditionExprGreen<'db>) -> Self {
4786 Self(value.0)
4787 }
4788}
4789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4790pub struct ConditionGreen<'db>(pub GreenId<'db>);
4791impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4792 const OPTIONAL_KIND: Option<SyntaxKind> = None;
4793 type StablePtr = ConditionPtr<'db>;
4794 type Green = ConditionGreen<'db>;
4795 fn missing(db: &'db dyn Database) -> Self::Green {
4796 panic!("No missing variant.");
4797 }
4798 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4799 let kind = node.kind(db);
4800 match kind {
4801 SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4802 SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4803 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4804 }
4805 }
4806 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4807 let kind = node.kind(db);
4808 match kind {
4809 SyntaxKind::ConditionLet => {
4810 Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4811 }
4812 SyntaxKind::ConditionExpr => {
4813 Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4814 }
4815 _ => None,
4816 }
4817 }
4818 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4819 match self {
4820 Condition::Let(x) => x.as_syntax_node(),
4821 Condition::Expr(x) => x.as_syntax_node(),
4822 }
4823 }
4824 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4825 ConditionPtr(self.as_syntax_node().long(db).stable_ptr)
4826 }
4827}
4828impl<'db> Condition<'db> {
4829 pub fn is_variant(kind: SyntaxKind) -> bool {
4831 matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4832 }
4833}
4834#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4835pub struct ConditionLet<'db> {
4836 node: SyntaxNode<'db>,
4837}
4838impl<'db> ConditionLet<'db> {
4839 pub const INDEX_LET_KW: usize = 0;
4840 pub const INDEX_PATTERNS: usize = 1;
4841 pub const INDEX_EQ: usize = 2;
4842 pub const INDEX_EXPR: usize = 3;
4843 pub fn new_green(
4844 db: &'db dyn Database,
4845 let_kw: TerminalLetGreen<'db>,
4846 patterns: PatternListOrGreen<'db>,
4847 eq: TerminalEqGreen<'db>,
4848 expr: ExprGreen<'db>,
4849 ) -> ConditionLetGreen<'db> {
4850 let children = [let_kw.0, patterns.0, eq.0, expr.0];
4851 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4852 ConditionLetGreen(
4853 GreenNode {
4854 kind: SyntaxKind::ConditionLet,
4855 details: GreenNodeDetails::Node { children: children.into(), width },
4856 }
4857 .intern(db),
4858 )
4859 }
4860}
4861impl<'db> ConditionLet<'db> {
4862 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4863 TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4864 }
4865 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4866 PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4867 }
4868 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4869 TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4870 }
4871 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4872 Expr::from_syntax_node(db, self.node.get_children(db)[3])
4873 }
4874}
4875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4876pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4877impl<'db> ConditionLetPtr<'db> {}
4878impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4879 type SyntaxNode = ConditionLet<'db>;
4880 fn untyped(self) -> SyntaxStablePtrId<'db> {
4881 self.0
4882 }
4883 fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4884 ConditionLet::from_syntax_node(db, self.0.lookup(db))
4885 }
4886}
4887impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4888 fn from(ptr: ConditionLetPtr<'db>) -> Self {
4889 ptr.untyped()
4890 }
4891}
4892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4893pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4894impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4895 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4896 type StablePtr = ConditionLetPtr<'db>;
4897 type Green = ConditionLetGreen<'db>;
4898 fn missing(db: &'db dyn Database) -> Self::Green {
4899 ConditionLetGreen(
4900 GreenNode {
4901 kind: SyntaxKind::ConditionLet,
4902 details: GreenNodeDetails::Node {
4903 children: [
4904 TerminalLet::missing(db).0,
4905 PatternListOr::missing(db).0,
4906 TerminalEq::missing(db).0,
4907 Expr::missing(db).0,
4908 ]
4909 .into(),
4910 width: TextWidth::default(),
4911 },
4912 }
4913 .intern(db),
4914 )
4915 }
4916 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4917 let kind = node.kind(db);
4918 assert_eq!(
4919 kind,
4920 SyntaxKind::ConditionLet,
4921 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4922 kind,
4923 SyntaxKind::ConditionLet
4924 );
4925 Self { node }
4926 }
4927 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4928 let kind = node.kind(db);
4929 if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4930 }
4931 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4932 self.node
4933 }
4934 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4935 ConditionLetPtr(self.node.stable_ptr(db))
4936 }
4937}
4938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4939pub struct ConditionExpr<'db> {
4940 node: SyntaxNode<'db>,
4941}
4942impl<'db> ConditionExpr<'db> {
4943 pub const INDEX_EXPR: usize = 0;
4944 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4945 let children = [expr.0];
4946 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4947 ConditionExprGreen(
4948 GreenNode {
4949 kind: SyntaxKind::ConditionExpr,
4950 details: GreenNodeDetails::Node { children: children.into(), width },
4951 }
4952 .intern(db),
4953 )
4954 }
4955}
4956impl<'db> ConditionExpr<'db> {
4957 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4958 Expr::from_syntax_node(db, self.node.get_children(db)[0])
4959 }
4960}
4961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4962pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
4963impl<'db> ConditionExprPtr<'db> {}
4964impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
4965 type SyntaxNode = ConditionExpr<'db>;
4966 fn untyped(self) -> SyntaxStablePtrId<'db> {
4967 self.0
4968 }
4969 fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
4970 ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4971 }
4972}
4973impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
4974 fn from(ptr: ConditionExprPtr<'db>) -> Self {
4975 ptr.untyped()
4976 }
4977}
4978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4979pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
4980impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
4981 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
4982 type StablePtr = ConditionExprPtr<'db>;
4983 type Green = ConditionExprGreen<'db>;
4984 fn missing(db: &'db dyn Database) -> Self::Green {
4985 ConditionExprGreen(
4986 GreenNode {
4987 kind: SyntaxKind::ConditionExpr,
4988 details: GreenNodeDetails::Node {
4989 children: [Expr::missing(db).0].into(),
4990 width: TextWidth::default(),
4991 },
4992 }
4993 .intern(db),
4994 )
4995 }
4996 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4997 let kind = node.kind(db);
4998 assert_eq!(
4999 kind,
5000 SyntaxKind::ConditionExpr,
5001 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5002 kind,
5003 SyntaxKind::ConditionExpr
5004 );
5005 Self { node }
5006 }
5007 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5008 let kind = node.kind(db);
5009 if kind == SyntaxKind::ConditionExpr {
5010 Some(Self::from_syntax_node(db, node))
5011 } else {
5012 None
5013 }
5014 }
5015 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5016 self.node
5017 }
5018 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5019 ConditionExprPtr(self.node.stable_ptr(db))
5020 }
5021}
5022#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5023pub enum BlockOrIf<'db> {
5024 Block(ExprBlock<'db>),
5025 If(ExprIf<'db>),
5026}
5027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5028pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5029impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5030 type SyntaxNode = BlockOrIf<'db>;
5031 fn untyped(self) -> SyntaxStablePtrId<'db> {
5032 self.0
5033 }
5034 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5035 BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5036 }
5037}
5038impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5039 fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5040 ptr.untyped()
5041 }
5042}
5043impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5044 fn from(value: ExprBlockPtr<'db>) -> Self {
5045 Self(value.0)
5046 }
5047}
5048impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5049 fn from(value: ExprIfPtr<'db>) -> Self {
5050 Self(value.0)
5051 }
5052}
5053impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5054 fn from(value: ExprBlockGreen<'db>) -> Self {
5055 Self(value.0)
5056 }
5057}
5058impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5059 fn from(value: ExprIfGreen<'db>) -> Self {
5060 Self(value.0)
5061 }
5062}
5063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5064pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5065impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5066 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5067 type StablePtr = BlockOrIfPtr<'db>;
5068 type Green = BlockOrIfGreen<'db>;
5069 fn missing(db: &'db dyn Database) -> Self::Green {
5070 panic!("No missing variant.");
5071 }
5072 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5073 let kind = node.kind(db);
5074 match kind {
5075 SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5076 SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5077 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5078 }
5079 }
5080 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5081 let kind = node.kind(db);
5082 match kind {
5083 SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5084 SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5085 _ => None,
5086 }
5087 }
5088 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5089 match self {
5090 BlockOrIf::Block(x) => x.as_syntax_node(),
5091 BlockOrIf::If(x) => x.as_syntax_node(),
5092 }
5093 }
5094 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5095 BlockOrIfPtr(self.as_syntax_node().long(db).stable_ptr)
5096 }
5097}
5098impl<'db> BlockOrIf<'db> {
5099 pub fn is_variant(kind: SyntaxKind) -> bool {
5101 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5102 }
5103}
5104#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5105pub struct ExprLoop<'db> {
5106 node: SyntaxNode<'db>,
5107}
5108impl<'db> ExprLoop<'db> {
5109 pub const INDEX_LOOP_KW: usize = 0;
5110 pub const INDEX_BODY: usize = 1;
5111 pub fn new_green(
5112 db: &'db dyn Database,
5113 loop_kw: TerminalLoopGreen<'db>,
5114 body: ExprBlockGreen<'db>,
5115 ) -> ExprLoopGreen<'db> {
5116 let children = [loop_kw.0, body.0];
5117 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5118 ExprLoopGreen(
5119 GreenNode {
5120 kind: SyntaxKind::ExprLoop,
5121 details: GreenNodeDetails::Node { children: children.into(), width },
5122 }
5123 .intern(db),
5124 )
5125 }
5126}
5127impl<'db> ExprLoop<'db> {
5128 pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5129 TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5130 }
5131 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5132 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5133 }
5134}
5135#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5136pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5137impl<'db> ExprLoopPtr<'db> {}
5138impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5139 type SyntaxNode = ExprLoop<'db>;
5140 fn untyped(self) -> SyntaxStablePtrId<'db> {
5141 self.0
5142 }
5143 fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5144 ExprLoop::from_syntax_node(db, self.0.lookup(db))
5145 }
5146}
5147impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5148 fn from(ptr: ExprLoopPtr<'db>) -> Self {
5149 ptr.untyped()
5150 }
5151}
5152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5153pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5154impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5155 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5156 type StablePtr = ExprLoopPtr<'db>;
5157 type Green = ExprLoopGreen<'db>;
5158 fn missing(db: &'db dyn Database) -> Self::Green {
5159 ExprLoopGreen(
5160 GreenNode {
5161 kind: SyntaxKind::ExprLoop,
5162 details: GreenNodeDetails::Node {
5163 children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5164 width: TextWidth::default(),
5165 },
5166 }
5167 .intern(db),
5168 )
5169 }
5170 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5171 let kind = node.kind(db);
5172 assert_eq!(
5173 kind,
5174 SyntaxKind::ExprLoop,
5175 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5176 kind,
5177 SyntaxKind::ExprLoop
5178 );
5179 Self { node }
5180 }
5181 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5182 let kind = node.kind(db);
5183 if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5184 }
5185 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5186 self.node
5187 }
5188 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5189 ExprLoopPtr(self.node.stable_ptr(db))
5190 }
5191}
5192#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5193pub struct ExprWhile<'db> {
5194 node: SyntaxNode<'db>,
5195}
5196impl<'db> ExprWhile<'db> {
5197 pub const INDEX_WHILE_KW: usize = 0;
5198 pub const INDEX_CONDITIONS: usize = 1;
5199 pub const INDEX_BODY: usize = 2;
5200 pub fn new_green(
5201 db: &'db dyn Database,
5202 while_kw: TerminalWhileGreen<'db>,
5203 conditions: ConditionListAndGreen<'db>,
5204 body: ExprBlockGreen<'db>,
5205 ) -> ExprWhileGreen<'db> {
5206 let children = [while_kw.0, conditions.0, body.0];
5207 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5208 ExprWhileGreen(
5209 GreenNode {
5210 kind: SyntaxKind::ExprWhile,
5211 details: GreenNodeDetails::Node { children: children.into(), width },
5212 }
5213 .intern(db),
5214 )
5215 }
5216}
5217impl<'db> ExprWhile<'db> {
5218 pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5219 TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5220 }
5221 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5222 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5223 }
5224 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5225 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5226 }
5227}
5228#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5229pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5230impl<'db> ExprWhilePtr<'db> {}
5231impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5232 type SyntaxNode = ExprWhile<'db>;
5233 fn untyped(self) -> SyntaxStablePtrId<'db> {
5234 self.0
5235 }
5236 fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5237 ExprWhile::from_syntax_node(db, self.0.lookup(db))
5238 }
5239}
5240impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5241 fn from(ptr: ExprWhilePtr<'db>) -> Self {
5242 ptr.untyped()
5243 }
5244}
5245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5246pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5247impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5248 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5249 type StablePtr = ExprWhilePtr<'db>;
5250 type Green = ExprWhileGreen<'db>;
5251 fn missing(db: &'db dyn Database) -> Self::Green {
5252 ExprWhileGreen(
5253 GreenNode {
5254 kind: SyntaxKind::ExprWhile,
5255 details: GreenNodeDetails::Node {
5256 children: [
5257 TerminalWhile::missing(db).0,
5258 ConditionListAnd::missing(db).0,
5259 ExprBlock::missing(db).0,
5260 ]
5261 .into(),
5262 width: TextWidth::default(),
5263 },
5264 }
5265 .intern(db),
5266 )
5267 }
5268 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5269 let kind = node.kind(db);
5270 assert_eq!(
5271 kind,
5272 SyntaxKind::ExprWhile,
5273 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5274 kind,
5275 SyntaxKind::ExprWhile
5276 );
5277 Self { node }
5278 }
5279 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5280 let kind = node.kind(db);
5281 if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5282 }
5283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5284 self.node
5285 }
5286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5287 ExprWhilePtr(self.node.stable_ptr(db))
5288 }
5289}
5290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5291pub struct ExprFor<'db> {
5292 node: SyntaxNode<'db>,
5293}
5294impl<'db> ExprFor<'db> {
5295 pub const INDEX_FOR_KW: usize = 0;
5296 pub const INDEX_PATTERN: usize = 1;
5297 pub const INDEX_IDENTIFIER: usize = 2;
5298 pub const INDEX_EXPR: usize = 3;
5299 pub const INDEX_BODY: usize = 4;
5300 pub fn new_green(
5301 db: &'db dyn Database,
5302 for_kw: TerminalForGreen<'db>,
5303 pattern: PatternGreen<'db>,
5304 identifier: TerminalIdentifierGreen<'db>,
5305 expr: ExprGreen<'db>,
5306 body: ExprBlockGreen<'db>,
5307 ) -> ExprForGreen<'db> {
5308 let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5309 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5310 ExprForGreen(
5311 GreenNode {
5312 kind: SyntaxKind::ExprFor,
5313 details: GreenNodeDetails::Node { children: children.into(), width },
5314 }
5315 .intern(db),
5316 )
5317 }
5318}
5319impl<'db> ExprFor<'db> {
5320 pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5321 TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5322 }
5323 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5324 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5325 }
5326 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5327 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5328 }
5329 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5330 Expr::from_syntax_node(db, self.node.get_children(db)[3])
5331 }
5332 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5333 ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5334 }
5335}
5336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5337pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5338impl<'db> ExprForPtr<'db> {
5339 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5340 let ptr = self.0.long(db);
5341 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5342 PatternGreen(key_fields[0])
5343 } else {
5344 panic!("Unexpected key field query on root.");
5345 }
5346 }
5347 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5348 let ptr = self.0.long(db);
5349 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5350 TerminalIdentifierGreen(key_fields[1])
5351 } else {
5352 panic!("Unexpected key field query on root.");
5353 }
5354 }
5355}
5356impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5357 type SyntaxNode = ExprFor<'db>;
5358 fn untyped(self) -> SyntaxStablePtrId<'db> {
5359 self.0
5360 }
5361 fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5362 ExprFor::from_syntax_node(db, self.0.lookup(db))
5363 }
5364}
5365impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5366 fn from(ptr: ExprForPtr<'db>) -> Self {
5367 ptr.untyped()
5368 }
5369}
5370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5371pub struct ExprForGreen<'db>(pub GreenId<'db>);
5372impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5373 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5374 type StablePtr = ExprForPtr<'db>;
5375 type Green = ExprForGreen<'db>;
5376 fn missing(db: &'db dyn Database) -> Self::Green {
5377 ExprForGreen(
5378 GreenNode {
5379 kind: SyntaxKind::ExprFor,
5380 details: GreenNodeDetails::Node {
5381 children: [
5382 TerminalFor::missing(db).0,
5383 Pattern::missing(db).0,
5384 TerminalIdentifier::missing(db).0,
5385 Expr::missing(db).0,
5386 ExprBlock::missing(db).0,
5387 ]
5388 .into(),
5389 width: TextWidth::default(),
5390 },
5391 }
5392 .intern(db),
5393 )
5394 }
5395 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5396 let kind = node.kind(db);
5397 assert_eq!(
5398 kind,
5399 SyntaxKind::ExprFor,
5400 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5401 kind,
5402 SyntaxKind::ExprFor
5403 );
5404 Self { node }
5405 }
5406 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5407 let kind = node.kind(db);
5408 if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5409 }
5410 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5411 self.node
5412 }
5413 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5414 ExprForPtr(self.node.stable_ptr(db))
5415 }
5416}
5417#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5418pub struct ElseClause<'db> {
5419 node: SyntaxNode<'db>,
5420}
5421impl<'db> ElseClause<'db> {
5422 pub const INDEX_ELSE_KW: usize = 0;
5423 pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5424 pub fn new_green(
5425 db: &'db dyn Database,
5426 else_kw: TerminalElseGreen<'db>,
5427 else_block_or_if: BlockOrIfGreen<'db>,
5428 ) -> ElseClauseGreen<'db> {
5429 let children = [else_kw.0, else_block_or_if.0];
5430 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5431 ElseClauseGreen(
5432 GreenNode {
5433 kind: SyntaxKind::ElseClause,
5434 details: GreenNodeDetails::Node { children: children.into(), width },
5435 }
5436 .intern(db),
5437 )
5438 }
5439}
5440impl<'db> ElseClause<'db> {
5441 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5442 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5443 }
5444 pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5445 BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5446 }
5447}
5448#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5449pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5450impl<'db> ElseClausePtr<'db> {}
5451impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5452 type SyntaxNode = ElseClause<'db>;
5453 fn untyped(self) -> SyntaxStablePtrId<'db> {
5454 self.0
5455 }
5456 fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5457 ElseClause::from_syntax_node(db, self.0.lookup(db))
5458 }
5459}
5460impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5461 fn from(ptr: ElseClausePtr<'db>) -> Self {
5462 ptr.untyped()
5463 }
5464}
5465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5466pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5467impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5468 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5469 type StablePtr = ElseClausePtr<'db>;
5470 type Green = ElseClauseGreen<'db>;
5471 fn missing(db: &'db dyn Database) -> Self::Green {
5472 ElseClauseGreen(
5473 GreenNode {
5474 kind: SyntaxKind::ElseClause,
5475 details: GreenNodeDetails::Node {
5476 children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5477 width: TextWidth::default(),
5478 },
5479 }
5480 .intern(db),
5481 )
5482 }
5483 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5484 let kind = node.kind(db);
5485 assert_eq!(
5486 kind,
5487 SyntaxKind::ElseClause,
5488 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5489 kind,
5490 SyntaxKind::ElseClause
5491 );
5492 Self { node }
5493 }
5494 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5495 let kind = node.kind(db);
5496 if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5497 }
5498 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5499 self.node
5500 }
5501 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5502 ElseClausePtr(self.node.stable_ptr(db))
5503 }
5504}
5505#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5506pub enum OptionElseClause<'db> {
5507 Empty(OptionElseClauseEmpty<'db>),
5508 ElseClause(ElseClause<'db>),
5509}
5510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5511pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5512impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5513 type SyntaxNode = OptionElseClause<'db>;
5514 fn untyped(self) -> SyntaxStablePtrId<'db> {
5515 self.0
5516 }
5517 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5518 OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5519 }
5520}
5521impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5522 fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5523 ptr.untyped()
5524 }
5525}
5526impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5527 fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5528 Self(value.0)
5529 }
5530}
5531impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5532 fn from(value: ElseClausePtr<'db>) -> Self {
5533 Self(value.0)
5534 }
5535}
5536impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5537 fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5538 Self(value.0)
5539 }
5540}
5541impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5542 fn from(value: ElseClauseGreen<'db>) -> Self {
5543 Self(value.0)
5544 }
5545}
5546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5547pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5548impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5549 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5550 type StablePtr = OptionElseClausePtr<'db>;
5551 type Green = OptionElseClauseGreen<'db>;
5552 fn missing(db: &'db dyn Database) -> Self::Green {
5553 panic!("No missing variant.");
5554 }
5555 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5556 let kind = node.kind(db);
5557 match kind {
5558 SyntaxKind::OptionElseClauseEmpty => {
5559 OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5560 }
5561 SyntaxKind::ElseClause => {
5562 OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5563 }
5564 _ => panic!(
5565 "Unexpected syntax kind {:?} when constructing {}.",
5566 kind, "OptionElseClause"
5567 ),
5568 }
5569 }
5570 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5571 let kind = node.kind(db);
5572 match kind {
5573 SyntaxKind::OptionElseClauseEmpty => {
5574 Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5575 }
5576 SyntaxKind::ElseClause => {
5577 Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5578 }
5579 _ => None,
5580 }
5581 }
5582 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5583 match self {
5584 OptionElseClause::Empty(x) => x.as_syntax_node(),
5585 OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5586 }
5587 }
5588 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5589 OptionElseClausePtr(self.as_syntax_node().long(db).stable_ptr)
5590 }
5591}
5592impl<'db> OptionElseClause<'db> {
5593 pub fn is_variant(kind: SyntaxKind) -> bool {
5595 matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5596 }
5597}
5598#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5599pub struct OptionElseClauseEmpty<'db> {
5600 node: SyntaxNode<'db>,
5601}
5602impl<'db> OptionElseClauseEmpty<'db> {
5603 pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5604 let children = [];
5605 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5606 OptionElseClauseEmptyGreen(
5607 GreenNode {
5608 kind: SyntaxKind::OptionElseClauseEmpty,
5609 details: GreenNodeDetails::Node { children: children.into(), width },
5610 }
5611 .intern(db),
5612 )
5613 }
5614}
5615impl<'db> OptionElseClauseEmpty<'db> {}
5616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5617pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5618impl<'db> OptionElseClauseEmptyPtr<'db> {}
5619impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5620 type SyntaxNode = OptionElseClauseEmpty<'db>;
5621 fn untyped(self) -> SyntaxStablePtrId<'db> {
5622 self.0
5623 }
5624 fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5625 OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5626 }
5627}
5628impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5629 fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5630 ptr.untyped()
5631 }
5632}
5633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5634pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5635impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5636 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5637 type StablePtr = OptionElseClauseEmptyPtr<'db>;
5638 type Green = OptionElseClauseEmptyGreen<'db>;
5639 fn missing(db: &'db dyn Database) -> Self::Green {
5640 OptionElseClauseEmptyGreen(
5641 GreenNode {
5642 kind: SyntaxKind::OptionElseClauseEmpty,
5643 details: GreenNodeDetails::Node {
5644 children: [].into(),
5645 width: TextWidth::default(),
5646 },
5647 }
5648 .intern(db),
5649 )
5650 }
5651 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5652 let kind = node.kind(db);
5653 assert_eq!(
5654 kind,
5655 SyntaxKind::OptionElseClauseEmpty,
5656 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5657 kind,
5658 SyntaxKind::OptionElseClauseEmpty
5659 );
5660 Self { node }
5661 }
5662 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5663 let kind = node.kind(db);
5664 if kind == SyntaxKind::OptionElseClauseEmpty {
5665 Some(Self::from_syntax_node(db, node))
5666 } else {
5667 None
5668 }
5669 }
5670 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5671 self.node
5672 }
5673 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5674 OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5675 }
5676}
5677#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5678pub struct ExprErrorPropagate<'db> {
5679 node: SyntaxNode<'db>,
5680}
5681impl<'db> ExprErrorPropagate<'db> {
5682 pub const INDEX_EXPR: usize = 0;
5683 pub const INDEX_OP: usize = 1;
5684 pub fn new_green(
5685 db: &'db dyn Database,
5686 expr: ExprGreen<'db>,
5687 op: TerminalQuestionMarkGreen<'db>,
5688 ) -> ExprErrorPropagateGreen<'db> {
5689 let children = [expr.0, op.0];
5690 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5691 ExprErrorPropagateGreen(
5692 GreenNode {
5693 kind: SyntaxKind::ExprErrorPropagate,
5694 details: GreenNodeDetails::Node { children: children.into(), width },
5695 }
5696 .intern(db),
5697 )
5698 }
5699}
5700impl<'db> ExprErrorPropagate<'db> {
5701 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5702 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5703 }
5704 pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5705 TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5706 }
5707}
5708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5709pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5710impl<'db> ExprErrorPropagatePtr<'db> {}
5711impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5712 type SyntaxNode = ExprErrorPropagate<'db>;
5713 fn untyped(self) -> SyntaxStablePtrId<'db> {
5714 self.0
5715 }
5716 fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5717 ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5718 }
5719}
5720impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5721 fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5722 ptr.untyped()
5723 }
5724}
5725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5726pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5727impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5728 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5729 type StablePtr = ExprErrorPropagatePtr<'db>;
5730 type Green = ExprErrorPropagateGreen<'db>;
5731 fn missing(db: &'db dyn Database) -> Self::Green {
5732 ExprErrorPropagateGreen(
5733 GreenNode {
5734 kind: SyntaxKind::ExprErrorPropagate,
5735 details: GreenNodeDetails::Node {
5736 children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5737 width: TextWidth::default(),
5738 },
5739 }
5740 .intern(db),
5741 )
5742 }
5743 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5744 let kind = node.kind(db);
5745 assert_eq!(
5746 kind,
5747 SyntaxKind::ExprErrorPropagate,
5748 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5749 kind,
5750 SyntaxKind::ExprErrorPropagate
5751 );
5752 Self { node }
5753 }
5754 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5755 let kind = node.kind(db);
5756 if kind == SyntaxKind::ExprErrorPropagate {
5757 Some(Self::from_syntax_node(db, node))
5758 } else {
5759 None
5760 }
5761 }
5762 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5763 self.node
5764 }
5765 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5766 ExprErrorPropagatePtr(self.node.stable_ptr(db))
5767 }
5768}
5769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5770pub struct ExprIndexed<'db> {
5771 node: SyntaxNode<'db>,
5772}
5773impl<'db> ExprIndexed<'db> {
5774 pub const INDEX_EXPR: usize = 0;
5775 pub const INDEX_LBRACK: usize = 1;
5776 pub const INDEX_INDEX_EXPR: usize = 2;
5777 pub const INDEX_RBRACK: usize = 3;
5778 pub fn new_green(
5779 db: &'db dyn Database,
5780 expr: ExprGreen<'db>,
5781 lbrack: TerminalLBrackGreen<'db>,
5782 index_expr: ExprGreen<'db>,
5783 rbrack: TerminalRBrackGreen<'db>,
5784 ) -> ExprIndexedGreen<'db> {
5785 let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5786 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5787 ExprIndexedGreen(
5788 GreenNode {
5789 kind: SyntaxKind::ExprIndexed,
5790 details: GreenNodeDetails::Node { children: children.into(), width },
5791 }
5792 .intern(db),
5793 )
5794 }
5795}
5796impl<'db> ExprIndexed<'db> {
5797 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5798 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5799 }
5800 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5801 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5802 }
5803 pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5804 Expr::from_syntax_node(db, self.node.get_children(db)[2])
5805 }
5806 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5807 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5808 }
5809}
5810#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5811pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5812impl<'db> ExprIndexedPtr<'db> {}
5813impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5814 type SyntaxNode = ExprIndexed<'db>;
5815 fn untyped(self) -> SyntaxStablePtrId<'db> {
5816 self.0
5817 }
5818 fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5819 ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5820 }
5821}
5822impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5823 fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5824 ptr.untyped()
5825 }
5826}
5827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5828pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5829impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5830 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5831 type StablePtr = ExprIndexedPtr<'db>;
5832 type Green = ExprIndexedGreen<'db>;
5833 fn missing(db: &'db dyn Database) -> Self::Green {
5834 ExprIndexedGreen(
5835 GreenNode {
5836 kind: SyntaxKind::ExprIndexed,
5837 details: GreenNodeDetails::Node {
5838 children: [
5839 Expr::missing(db).0,
5840 TerminalLBrack::missing(db).0,
5841 Expr::missing(db).0,
5842 TerminalRBrack::missing(db).0,
5843 ]
5844 .into(),
5845 width: TextWidth::default(),
5846 },
5847 }
5848 .intern(db),
5849 )
5850 }
5851 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5852 let kind = node.kind(db);
5853 assert_eq!(
5854 kind,
5855 SyntaxKind::ExprIndexed,
5856 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5857 kind,
5858 SyntaxKind::ExprIndexed
5859 );
5860 Self { node }
5861 }
5862 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5863 let kind = node.kind(db);
5864 if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5865 }
5866 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5867 self.node
5868 }
5869 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5870 ExprIndexedPtr(self.node.stable_ptr(db))
5871 }
5872}
5873#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5874pub struct ExprFixedSizeArray<'db> {
5875 node: SyntaxNode<'db>,
5876}
5877impl<'db> ExprFixedSizeArray<'db> {
5878 pub const INDEX_LBRACK: usize = 0;
5879 pub const INDEX_EXPRS: usize = 1;
5880 pub const INDEX_SIZE: usize = 2;
5881 pub const INDEX_RBRACK: usize = 3;
5882 pub fn new_green(
5883 db: &'db dyn Database,
5884 lbrack: TerminalLBrackGreen<'db>,
5885 exprs: ExprListGreen<'db>,
5886 size: OptionFixedSizeArraySizeGreen<'db>,
5887 rbrack: TerminalRBrackGreen<'db>,
5888 ) -> ExprFixedSizeArrayGreen<'db> {
5889 let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5890 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5891 ExprFixedSizeArrayGreen(
5892 GreenNode {
5893 kind: SyntaxKind::ExprFixedSizeArray,
5894 details: GreenNodeDetails::Node { children: children.into(), width },
5895 }
5896 .intern(db),
5897 )
5898 }
5899}
5900impl<'db> ExprFixedSizeArray<'db> {
5901 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5902 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5903 }
5904 pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5905 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5906 }
5907 pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5908 OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5909 }
5910 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5911 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5912 }
5913}
5914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5915pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5916impl<'db> ExprFixedSizeArrayPtr<'db> {}
5917impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5918 type SyntaxNode = ExprFixedSizeArray<'db>;
5919 fn untyped(self) -> SyntaxStablePtrId<'db> {
5920 self.0
5921 }
5922 fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5923 ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5924 }
5925}
5926impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5927 fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5928 ptr.untyped()
5929 }
5930}
5931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5932pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5933impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5934 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5935 type StablePtr = ExprFixedSizeArrayPtr<'db>;
5936 type Green = ExprFixedSizeArrayGreen<'db>;
5937 fn missing(db: &'db dyn Database) -> Self::Green {
5938 ExprFixedSizeArrayGreen(
5939 GreenNode {
5940 kind: SyntaxKind::ExprFixedSizeArray,
5941 details: GreenNodeDetails::Node {
5942 children: [
5943 TerminalLBrack::missing(db).0,
5944 ExprList::missing(db).0,
5945 OptionFixedSizeArraySize::missing(db).0,
5946 TerminalRBrack::missing(db).0,
5947 ]
5948 .into(),
5949 width: TextWidth::default(),
5950 },
5951 }
5952 .intern(db),
5953 )
5954 }
5955 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5956 let kind = node.kind(db);
5957 assert_eq!(
5958 kind,
5959 SyntaxKind::ExprFixedSizeArray,
5960 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5961 kind,
5962 SyntaxKind::ExprFixedSizeArray
5963 );
5964 Self { node }
5965 }
5966 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5967 let kind = node.kind(db);
5968 if kind == SyntaxKind::ExprFixedSizeArray {
5969 Some(Self::from_syntax_node(db, node))
5970 } else {
5971 None
5972 }
5973 }
5974 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5975 self.node
5976 }
5977 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5978 ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
5979 }
5980}
5981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5982pub struct FixedSizeArraySize<'db> {
5983 node: SyntaxNode<'db>,
5984}
5985impl<'db> FixedSizeArraySize<'db> {
5986 pub const INDEX_SEMICOLON: usize = 0;
5987 pub const INDEX_SIZE: usize = 1;
5988 pub fn new_green(
5989 db: &'db dyn Database,
5990 semicolon: TerminalSemicolonGreen<'db>,
5991 size: ExprGreen<'db>,
5992 ) -> FixedSizeArraySizeGreen<'db> {
5993 let children = [semicolon.0, size.0];
5994 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5995 FixedSizeArraySizeGreen(
5996 GreenNode {
5997 kind: SyntaxKind::FixedSizeArraySize,
5998 details: GreenNodeDetails::Node { children: children.into(), width },
5999 }
6000 .intern(db),
6001 )
6002 }
6003}
6004impl<'db> FixedSizeArraySize<'db> {
6005 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6006 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6007 }
6008 pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6009 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6010 }
6011}
6012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6013pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6014impl<'db> FixedSizeArraySizePtr<'db> {}
6015impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6016 type SyntaxNode = FixedSizeArraySize<'db>;
6017 fn untyped(self) -> SyntaxStablePtrId<'db> {
6018 self.0
6019 }
6020 fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6021 FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6022 }
6023}
6024impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6025 fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6026 ptr.untyped()
6027 }
6028}
6029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6030pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6031impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6032 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6033 type StablePtr = FixedSizeArraySizePtr<'db>;
6034 type Green = FixedSizeArraySizeGreen<'db>;
6035 fn missing(db: &'db dyn Database) -> Self::Green {
6036 FixedSizeArraySizeGreen(
6037 GreenNode {
6038 kind: SyntaxKind::FixedSizeArraySize,
6039 details: GreenNodeDetails::Node {
6040 children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6041 width: TextWidth::default(),
6042 },
6043 }
6044 .intern(db),
6045 )
6046 }
6047 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6048 let kind = node.kind(db);
6049 assert_eq!(
6050 kind,
6051 SyntaxKind::FixedSizeArraySize,
6052 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6053 kind,
6054 SyntaxKind::FixedSizeArraySize
6055 );
6056 Self { node }
6057 }
6058 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6059 let kind = node.kind(db);
6060 if kind == SyntaxKind::FixedSizeArraySize {
6061 Some(Self::from_syntax_node(db, node))
6062 } else {
6063 None
6064 }
6065 }
6066 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6067 self.node
6068 }
6069 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6070 FixedSizeArraySizePtr(self.node.stable_ptr(db))
6071 }
6072}
6073#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6074pub enum OptionFixedSizeArraySize<'db> {
6075 Empty(OptionFixedSizeArraySizeEmpty<'db>),
6076 FixedSizeArraySize(FixedSizeArraySize<'db>),
6077}
6078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6079pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6080impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6081 type SyntaxNode = OptionFixedSizeArraySize<'db>;
6082 fn untyped(self) -> SyntaxStablePtrId<'db> {
6083 self.0
6084 }
6085 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6086 OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6087 }
6088}
6089impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6090 fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6091 ptr.untyped()
6092 }
6093}
6094impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6095 fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6096 Self(value.0)
6097 }
6098}
6099impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6100 fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6101 Self(value.0)
6102 }
6103}
6104impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6105 fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6106 Self(value.0)
6107 }
6108}
6109impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6110 fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6111 Self(value.0)
6112 }
6113}
6114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6115pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6116impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6117 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6118 type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6119 type Green = OptionFixedSizeArraySizeGreen<'db>;
6120 fn missing(db: &'db dyn Database) -> Self::Green {
6121 panic!("No missing variant.");
6122 }
6123 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6124 let kind = node.kind(db);
6125 match kind {
6126 SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6127 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6128 ),
6129 SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6130 FixedSizeArraySize::from_syntax_node(db, node),
6131 ),
6132 _ => panic!(
6133 "Unexpected syntax kind {:?} when constructing {}.",
6134 kind, "OptionFixedSizeArraySize"
6135 ),
6136 }
6137 }
6138 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6139 let kind = node.kind(db);
6140 match kind {
6141 SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6142 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6143 )),
6144 SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6145 FixedSizeArraySize::from_syntax_node(db, node),
6146 )),
6147 _ => None,
6148 }
6149 }
6150 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6151 match self {
6152 OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6153 OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6154 }
6155 }
6156 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6157 OptionFixedSizeArraySizePtr(self.as_syntax_node().long(db).stable_ptr)
6158 }
6159}
6160impl<'db> OptionFixedSizeArraySize<'db> {
6161 pub fn is_variant(kind: SyntaxKind) -> bool {
6163 matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6164 }
6165}
6166#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6167pub struct OptionFixedSizeArraySizeEmpty<'db> {
6168 node: SyntaxNode<'db>,
6169}
6170impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6171 pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6172 let children = [];
6173 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6174 OptionFixedSizeArraySizeEmptyGreen(
6175 GreenNode {
6176 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6177 details: GreenNodeDetails::Node { children: children.into(), width },
6178 }
6179 .intern(db),
6180 )
6181 }
6182}
6183impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6184#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6185pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6186impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6187impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6188 type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6189 fn untyped(self) -> SyntaxStablePtrId<'db> {
6190 self.0
6191 }
6192 fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6193 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6194 }
6195}
6196impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6197 fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6198 ptr.untyped()
6199 }
6200}
6201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6202pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6203impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6204 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6205 type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6206 type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6207 fn missing(db: &'db dyn Database) -> Self::Green {
6208 OptionFixedSizeArraySizeEmptyGreen(
6209 GreenNode {
6210 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6211 details: GreenNodeDetails::Node {
6212 children: [].into(),
6213 width: TextWidth::default(),
6214 },
6215 }
6216 .intern(db),
6217 )
6218 }
6219 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6220 let kind = node.kind(db);
6221 assert_eq!(
6222 kind,
6223 SyntaxKind::OptionFixedSizeArraySizeEmpty,
6224 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6225 kind,
6226 SyntaxKind::OptionFixedSizeArraySizeEmpty
6227 );
6228 Self { node }
6229 }
6230 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6231 let kind = node.kind(db);
6232 if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6233 Some(Self::from_syntax_node(db, node))
6234 } else {
6235 None
6236 }
6237 }
6238 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6239 self.node
6240 }
6241 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6242 OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6243 }
6244}
6245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6246pub struct ExprClosure<'db> {
6247 node: SyntaxNode<'db>,
6248}
6249impl<'db> ExprClosure<'db> {
6250 pub const INDEX_WRAPPER: usize = 0;
6251 pub const INDEX_RET_TY: usize = 1;
6252 pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6253 pub const INDEX_EXPR: usize = 3;
6254 pub fn new_green(
6255 db: &'db dyn Database,
6256 wrapper: ClosureParamWrapperGreen<'db>,
6257 ret_ty: OptionReturnTypeClauseGreen<'db>,
6258 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6259 expr: ExprGreen<'db>,
6260 ) -> ExprClosureGreen<'db> {
6261 let children = [wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6262 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6263 ExprClosureGreen(
6264 GreenNode {
6265 kind: SyntaxKind::ExprClosure,
6266 details: GreenNodeDetails::Node { children: children.into(), width },
6267 }
6268 .intern(db),
6269 )
6270 }
6271}
6272impl<'db> ExprClosure<'db> {
6273 pub fn wrapper(&self, db: &'db dyn Database) -> ClosureParamWrapper<'db> {
6274 ClosureParamWrapper::from_syntax_node(db, self.node.get_children(db)[0])
6275 }
6276 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6277 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6278 }
6279 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6280 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6281 }
6282 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6283 Expr::from_syntax_node(db, self.node.get_children(db)[3])
6284 }
6285}
6286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6287pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6288impl<'db> ExprClosurePtr<'db> {}
6289impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6290 type SyntaxNode = ExprClosure<'db>;
6291 fn untyped(self) -> SyntaxStablePtrId<'db> {
6292 self.0
6293 }
6294 fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6295 ExprClosure::from_syntax_node(db, self.0.lookup(db))
6296 }
6297}
6298impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6299 fn from(ptr: ExprClosurePtr<'db>) -> Self {
6300 ptr.untyped()
6301 }
6302}
6303#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6304pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6305impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6306 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6307 type StablePtr = ExprClosurePtr<'db>;
6308 type Green = ExprClosureGreen<'db>;
6309 fn missing(db: &'db dyn Database) -> Self::Green {
6310 ExprClosureGreen(
6311 GreenNode {
6312 kind: SyntaxKind::ExprClosure,
6313 details: GreenNodeDetails::Node {
6314 children: [
6315 ClosureParamWrapper::missing(db).0,
6316 OptionReturnTypeClause::missing(db).0,
6317 OptionTerminalNoPanic::missing(db).0,
6318 Expr::missing(db).0,
6319 ]
6320 .into(),
6321 width: TextWidth::default(),
6322 },
6323 }
6324 .intern(db),
6325 )
6326 }
6327 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6328 let kind = node.kind(db);
6329 assert_eq!(
6330 kind,
6331 SyntaxKind::ExprClosure,
6332 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6333 kind,
6334 SyntaxKind::ExprClosure
6335 );
6336 Self { node }
6337 }
6338 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6339 let kind = node.kind(db);
6340 if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6341 }
6342 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6343 self.node
6344 }
6345 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6346 ExprClosurePtr(self.node.stable_ptr(db))
6347 }
6348}
6349#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6350pub enum ClosureParamWrapper<'db> {
6351 Nullary(TerminalOrOr<'db>),
6352 NAry(ClosureParamWrapperNAry<'db>),
6353}
6354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6355pub struct ClosureParamWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
6356impl<'db> TypedStablePtr<'db> for ClosureParamWrapperPtr<'db> {
6357 type SyntaxNode = ClosureParamWrapper<'db>;
6358 fn untyped(self) -> SyntaxStablePtrId<'db> {
6359 self.0
6360 }
6361 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6362 ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6363 }
6364}
6365impl<'db> From<ClosureParamWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
6366 fn from(ptr: ClosureParamWrapperPtr<'db>) -> Self {
6367 ptr.untyped()
6368 }
6369}
6370impl<'db> From<TerminalOrOrPtr<'db>> for ClosureParamWrapperPtr<'db> {
6371 fn from(value: TerminalOrOrPtr<'db>) -> Self {
6372 Self(value.0)
6373 }
6374}
6375impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for ClosureParamWrapperPtr<'db> {
6376 fn from(value: ClosureParamWrapperNAryPtr<'db>) -> Self {
6377 Self(value.0)
6378 }
6379}
6380impl<'db> From<TerminalOrOrGreen<'db>> for ClosureParamWrapperGreen<'db> {
6381 fn from(value: TerminalOrOrGreen<'db>) -> Self {
6382 Self(value.0)
6383 }
6384}
6385impl<'db> From<ClosureParamWrapperNAryGreen<'db>> for ClosureParamWrapperGreen<'db> {
6386 fn from(value: ClosureParamWrapperNAryGreen<'db>) -> Self {
6387 Self(value.0)
6388 }
6389}
6390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6391pub struct ClosureParamWrapperGreen<'db>(pub GreenId<'db>);
6392impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapper<'db> {
6393 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6394 type StablePtr = ClosureParamWrapperPtr<'db>;
6395 type Green = ClosureParamWrapperGreen<'db>;
6396 fn missing(db: &'db dyn Database) -> Self::Green {
6397 panic!("No missing variant.");
6398 }
6399 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6400 let kind = node.kind(db);
6401 match kind {
6402 SyntaxKind::TerminalOrOr => {
6403 ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6404 }
6405 SyntaxKind::ClosureParamWrapperNAry => {
6406 ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6407 }
6408 _ => panic!(
6409 "Unexpected syntax kind {:?} when constructing {}.",
6410 kind, "ClosureParamWrapper"
6411 ),
6412 }
6413 }
6414 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6415 let kind = node.kind(db);
6416 match kind {
6417 SyntaxKind::TerminalOrOr => {
6418 Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6419 }
6420 SyntaxKind::ClosureParamWrapperNAry => {
6421 Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6422 }
6423 _ => None,
6424 }
6425 }
6426 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6427 match self {
6428 ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6429 ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6430 }
6431 }
6432 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6433 ClosureParamWrapperPtr(self.as_syntax_node().long(db).stable_ptr)
6434 }
6435}
6436impl<'db> ClosureParamWrapper<'db> {
6437 pub fn is_variant(kind: SyntaxKind) -> bool {
6439 matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6440 }
6441}
6442#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6443pub struct ClosureParamWrapperNAry<'db> {
6444 node: SyntaxNode<'db>,
6445}
6446impl<'db> ClosureParamWrapperNAry<'db> {
6447 pub const INDEX_LEFTOR: usize = 0;
6448 pub const INDEX_PARAMS: usize = 1;
6449 pub const INDEX_RIGHTOR: usize = 2;
6450 pub fn new_green(
6451 db: &'db dyn Database,
6452 leftor: TerminalOrGreen<'db>,
6453 params: ParamListGreen<'db>,
6454 rightor: TerminalOrGreen<'db>,
6455 ) -> ClosureParamWrapperNAryGreen<'db> {
6456 let children = [leftor.0, params.0, rightor.0];
6457 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6458 ClosureParamWrapperNAryGreen(
6459 GreenNode {
6460 kind: SyntaxKind::ClosureParamWrapperNAry,
6461 details: GreenNodeDetails::Node { children: children.into(), width },
6462 }
6463 .intern(db),
6464 )
6465 }
6466}
6467impl<'db> ClosureParamWrapperNAry<'db> {
6468 pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6469 TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6470 }
6471 pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6472 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6473 }
6474 pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6475 TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6476 }
6477}
6478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6479pub struct ClosureParamWrapperNAryPtr<'db>(pub SyntaxStablePtrId<'db>);
6480impl<'db> ClosureParamWrapperNAryPtr<'db> {}
6481impl<'db> TypedStablePtr<'db> for ClosureParamWrapperNAryPtr<'db> {
6482 type SyntaxNode = ClosureParamWrapperNAry<'db>;
6483 fn untyped(self) -> SyntaxStablePtrId<'db> {
6484 self.0
6485 }
6486 fn lookup(&self, db: &'db dyn Database) -> ClosureParamWrapperNAry<'db> {
6487 ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6488 }
6489}
6490impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for SyntaxStablePtrId<'db> {
6491 fn from(ptr: ClosureParamWrapperNAryPtr<'db>) -> Self {
6492 ptr.untyped()
6493 }
6494}
6495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6496pub struct ClosureParamWrapperNAryGreen<'db>(pub GreenId<'db>);
6497impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapperNAry<'db> {
6498 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6499 type StablePtr = ClosureParamWrapperNAryPtr<'db>;
6500 type Green = ClosureParamWrapperNAryGreen<'db>;
6501 fn missing(db: &'db dyn Database) -> Self::Green {
6502 ClosureParamWrapperNAryGreen(
6503 GreenNode {
6504 kind: SyntaxKind::ClosureParamWrapperNAry,
6505 details: GreenNodeDetails::Node {
6506 children: [
6507 TerminalOr::missing(db).0,
6508 ParamList::missing(db).0,
6509 TerminalOr::missing(db).0,
6510 ]
6511 .into(),
6512 width: TextWidth::default(),
6513 },
6514 }
6515 .intern(db),
6516 )
6517 }
6518 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6519 let kind = node.kind(db);
6520 assert_eq!(
6521 kind,
6522 SyntaxKind::ClosureParamWrapperNAry,
6523 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6524 kind,
6525 SyntaxKind::ClosureParamWrapperNAry
6526 );
6527 Self { node }
6528 }
6529 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6530 let kind = node.kind(db);
6531 if kind == SyntaxKind::ClosureParamWrapperNAry {
6532 Some(Self::from_syntax_node(db, node))
6533 } else {
6534 None
6535 }
6536 }
6537 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6538 self.node
6539 }
6540 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6541 ClosureParamWrapperNAryPtr(self.node.stable_ptr(db))
6542 }
6543}
6544#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6545pub struct StructArgExpr<'db> {
6546 node: SyntaxNode<'db>,
6547}
6548impl<'db> StructArgExpr<'db> {
6549 pub const INDEX_COLON: usize = 0;
6550 pub const INDEX_EXPR: usize = 1;
6551 pub fn new_green(
6552 db: &'db dyn Database,
6553 colon: TerminalColonGreen<'db>,
6554 expr: ExprGreen<'db>,
6555 ) -> StructArgExprGreen<'db> {
6556 let children = [colon.0, expr.0];
6557 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6558 StructArgExprGreen(
6559 GreenNode {
6560 kind: SyntaxKind::StructArgExpr,
6561 details: GreenNodeDetails::Node { children: children.into(), width },
6562 }
6563 .intern(db),
6564 )
6565 }
6566}
6567impl<'db> StructArgExpr<'db> {
6568 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6569 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6570 }
6571 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6572 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6573 }
6574}
6575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6576pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6577impl<'db> StructArgExprPtr<'db> {}
6578impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6579 type SyntaxNode = StructArgExpr<'db>;
6580 fn untyped(self) -> SyntaxStablePtrId<'db> {
6581 self.0
6582 }
6583 fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6584 StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6585 }
6586}
6587impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6588 fn from(ptr: StructArgExprPtr<'db>) -> Self {
6589 ptr.untyped()
6590 }
6591}
6592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6593pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6594impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6595 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6596 type StablePtr = StructArgExprPtr<'db>;
6597 type Green = StructArgExprGreen<'db>;
6598 fn missing(db: &'db dyn Database) -> Self::Green {
6599 StructArgExprGreen(
6600 GreenNode {
6601 kind: SyntaxKind::StructArgExpr,
6602 details: GreenNodeDetails::Node {
6603 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6604 width: TextWidth::default(),
6605 },
6606 }
6607 .intern(db),
6608 )
6609 }
6610 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6611 let kind = node.kind(db);
6612 assert_eq!(
6613 kind,
6614 SyntaxKind::StructArgExpr,
6615 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6616 kind,
6617 SyntaxKind::StructArgExpr
6618 );
6619 Self { node }
6620 }
6621 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6622 let kind = node.kind(db);
6623 if kind == SyntaxKind::StructArgExpr {
6624 Some(Self::from_syntax_node(db, node))
6625 } else {
6626 None
6627 }
6628 }
6629 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6630 self.node
6631 }
6632 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6633 StructArgExprPtr(self.node.stable_ptr(db))
6634 }
6635}
6636#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6637pub enum OptionStructArgExpr<'db> {
6638 Empty(OptionStructArgExprEmpty<'db>),
6639 StructArgExpr(StructArgExpr<'db>),
6640}
6641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6642pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6643impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6644 type SyntaxNode = OptionStructArgExpr<'db>;
6645 fn untyped(self) -> SyntaxStablePtrId<'db> {
6646 self.0
6647 }
6648 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6649 OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6650 }
6651}
6652impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6653 fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6654 ptr.untyped()
6655 }
6656}
6657impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6658 fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6659 Self(value.0)
6660 }
6661}
6662impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6663 fn from(value: StructArgExprPtr<'db>) -> Self {
6664 Self(value.0)
6665 }
6666}
6667impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6668 fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6669 Self(value.0)
6670 }
6671}
6672impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6673 fn from(value: StructArgExprGreen<'db>) -> Self {
6674 Self(value.0)
6675 }
6676}
6677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6678pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6679impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6680 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6681 type StablePtr = OptionStructArgExprPtr<'db>;
6682 type Green = OptionStructArgExprGreen<'db>;
6683 fn missing(db: &'db dyn Database) -> Self::Green {
6684 panic!("No missing variant.");
6685 }
6686 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6687 let kind = node.kind(db);
6688 match kind {
6689 SyntaxKind::OptionStructArgExprEmpty => {
6690 OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6691 }
6692 SyntaxKind::StructArgExpr => {
6693 OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6694 }
6695 _ => panic!(
6696 "Unexpected syntax kind {:?} when constructing {}.",
6697 kind, "OptionStructArgExpr"
6698 ),
6699 }
6700 }
6701 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6702 let kind = node.kind(db);
6703 match kind {
6704 SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6705 OptionStructArgExprEmpty::from_syntax_node(db, node),
6706 )),
6707 SyntaxKind::StructArgExpr => {
6708 Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6709 }
6710 _ => None,
6711 }
6712 }
6713 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6714 match self {
6715 OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6716 OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6717 }
6718 }
6719 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6720 OptionStructArgExprPtr(self.as_syntax_node().long(db).stable_ptr)
6721 }
6722}
6723impl<'db> OptionStructArgExpr<'db> {
6724 pub fn is_variant(kind: SyntaxKind) -> bool {
6726 matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6727 }
6728}
6729#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6730pub struct OptionStructArgExprEmpty<'db> {
6731 node: SyntaxNode<'db>,
6732}
6733impl<'db> OptionStructArgExprEmpty<'db> {
6734 pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6735 let children = [];
6736 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6737 OptionStructArgExprEmptyGreen(
6738 GreenNode {
6739 kind: SyntaxKind::OptionStructArgExprEmpty,
6740 details: GreenNodeDetails::Node { children: children.into(), width },
6741 }
6742 .intern(db),
6743 )
6744 }
6745}
6746impl<'db> OptionStructArgExprEmpty<'db> {}
6747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6748pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6749impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6750impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6751 type SyntaxNode = OptionStructArgExprEmpty<'db>;
6752 fn untyped(self) -> SyntaxStablePtrId<'db> {
6753 self.0
6754 }
6755 fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6756 OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6757 }
6758}
6759impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6760 fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6761 ptr.untyped()
6762 }
6763}
6764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6765pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6766impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6767 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6768 type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6769 type Green = OptionStructArgExprEmptyGreen<'db>;
6770 fn missing(db: &'db dyn Database) -> Self::Green {
6771 OptionStructArgExprEmptyGreen(
6772 GreenNode {
6773 kind: SyntaxKind::OptionStructArgExprEmpty,
6774 details: GreenNodeDetails::Node {
6775 children: [].into(),
6776 width: TextWidth::default(),
6777 },
6778 }
6779 .intern(db),
6780 )
6781 }
6782 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6783 let kind = node.kind(db);
6784 assert_eq!(
6785 kind,
6786 SyntaxKind::OptionStructArgExprEmpty,
6787 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6788 kind,
6789 SyntaxKind::OptionStructArgExprEmpty
6790 );
6791 Self { node }
6792 }
6793 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6794 let kind = node.kind(db);
6795 if kind == SyntaxKind::OptionStructArgExprEmpty {
6796 Some(Self::from_syntax_node(db, node))
6797 } else {
6798 None
6799 }
6800 }
6801 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6802 self.node
6803 }
6804 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6805 OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6806 }
6807}
6808#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6809pub struct StructArgSingle<'db> {
6810 node: SyntaxNode<'db>,
6811}
6812impl<'db> StructArgSingle<'db> {
6813 pub const INDEX_IDENTIFIER: usize = 0;
6814 pub const INDEX_ARG_EXPR: usize = 1;
6815 pub fn new_green(
6816 db: &'db dyn Database,
6817 identifier: TerminalIdentifierGreen<'db>,
6818 arg_expr: OptionStructArgExprGreen<'db>,
6819 ) -> StructArgSingleGreen<'db> {
6820 let children = [identifier.0, arg_expr.0];
6821 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6822 StructArgSingleGreen(
6823 GreenNode {
6824 kind: SyntaxKind::StructArgSingle,
6825 details: GreenNodeDetails::Node { children: children.into(), width },
6826 }
6827 .intern(db),
6828 )
6829 }
6830}
6831impl<'db> StructArgSingle<'db> {
6832 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6833 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6834 }
6835 pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6836 OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6837 }
6838}
6839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6840pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6841impl<'db> StructArgSinglePtr<'db> {
6842 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6843 let ptr = self.0.long(db);
6844 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
6845 TerminalIdentifierGreen(key_fields[0])
6846 } else {
6847 panic!("Unexpected key field query on root.");
6848 }
6849 }
6850}
6851impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6852 type SyntaxNode = StructArgSingle<'db>;
6853 fn untyped(self) -> SyntaxStablePtrId<'db> {
6854 self.0
6855 }
6856 fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6857 StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6858 }
6859}
6860impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6861 fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6862 ptr.untyped()
6863 }
6864}
6865#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6866pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6867impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6868 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6869 type StablePtr = StructArgSinglePtr<'db>;
6870 type Green = StructArgSingleGreen<'db>;
6871 fn missing(db: &'db dyn Database) -> Self::Green {
6872 StructArgSingleGreen(
6873 GreenNode {
6874 kind: SyntaxKind::StructArgSingle,
6875 details: GreenNodeDetails::Node {
6876 children: [
6877 TerminalIdentifier::missing(db).0,
6878 OptionStructArgExpr::missing(db).0,
6879 ]
6880 .into(),
6881 width: TextWidth::default(),
6882 },
6883 }
6884 .intern(db),
6885 )
6886 }
6887 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6888 let kind = node.kind(db);
6889 assert_eq!(
6890 kind,
6891 SyntaxKind::StructArgSingle,
6892 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6893 kind,
6894 SyntaxKind::StructArgSingle
6895 );
6896 Self { node }
6897 }
6898 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6899 let kind = node.kind(db);
6900 if kind == SyntaxKind::StructArgSingle {
6901 Some(Self::from_syntax_node(db, node))
6902 } else {
6903 None
6904 }
6905 }
6906 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6907 self.node
6908 }
6909 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6910 StructArgSinglePtr(self.node.stable_ptr(db))
6911 }
6912}
6913#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6914pub struct StructArgTail<'db> {
6915 node: SyntaxNode<'db>,
6916}
6917impl<'db> StructArgTail<'db> {
6918 pub const INDEX_DOTDOT: usize = 0;
6919 pub const INDEX_EXPRESSION: usize = 1;
6920 pub fn new_green(
6921 db: &'db dyn Database,
6922 dotdot: TerminalDotDotGreen<'db>,
6923 expression: ExprGreen<'db>,
6924 ) -> StructArgTailGreen<'db> {
6925 let children = [dotdot.0, expression.0];
6926 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6927 StructArgTailGreen(
6928 GreenNode {
6929 kind: SyntaxKind::StructArgTail,
6930 details: GreenNodeDetails::Node { children: children.into(), width },
6931 }
6932 .intern(db),
6933 )
6934 }
6935}
6936impl<'db> StructArgTail<'db> {
6937 pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6938 TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6939 }
6940 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6941 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6942 }
6943}
6944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6945pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6946impl<'db> StructArgTailPtr<'db> {}
6947impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6948 type SyntaxNode = StructArgTail<'db>;
6949 fn untyped(self) -> SyntaxStablePtrId<'db> {
6950 self.0
6951 }
6952 fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6953 StructArgTail::from_syntax_node(db, self.0.lookup(db))
6954 }
6955}
6956impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6957 fn from(ptr: StructArgTailPtr<'db>) -> Self {
6958 ptr.untyped()
6959 }
6960}
6961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6962pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6963impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6964 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6965 type StablePtr = StructArgTailPtr<'db>;
6966 type Green = StructArgTailGreen<'db>;
6967 fn missing(db: &'db dyn Database) -> Self::Green {
6968 StructArgTailGreen(
6969 GreenNode {
6970 kind: SyntaxKind::StructArgTail,
6971 details: GreenNodeDetails::Node {
6972 children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6973 width: TextWidth::default(),
6974 },
6975 }
6976 .intern(db),
6977 )
6978 }
6979 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6980 let kind = node.kind(db);
6981 assert_eq!(
6982 kind,
6983 SyntaxKind::StructArgTail,
6984 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6985 kind,
6986 SyntaxKind::StructArgTail
6987 );
6988 Self { node }
6989 }
6990 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6991 let kind = node.kind(db);
6992 if kind == SyntaxKind::StructArgTail {
6993 Some(Self::from_syntax_node(db, node))
6994 } else {
6995 None
6996 }
6997 }
6998 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6999 self.node
7000 }
7001 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7002 StructArgTailPtr(self.node.stable_ptr(db))
7003 }
7004}
7005#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7006pub enum StructArg<'db> {
7007 StructArgSingle(StructArgSingle<'db>),
7008 StructArgTail(StructArgTail<'db>),
7009}
7010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7011pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
7012impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
7013 type SyntaxNode = StructArg<'db>;
7014 fn untyped(self) -> SyntaxStablePtrId<'db> {
7015 self.0
7016 }
7017 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7018 StructArg::from_syntax_node(db, self.0.lookup(db))
7019 }
7020}
7021impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
7022 fn from(ptr: StructArgPtr<'db>) -> Self {
7023 ptr.untyped()
7024 }
7025}
7026impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
7027 fn from(value: StructArgSinglePtr<'db>) -> Self {
7028 Self(value.0)
7029 }
7030}
7031impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
7032 fn from(value: StructArgTailPtr<'db>) -> Self {
7033 Self(value.0)
7034 }
7035}
7036impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
7037 fn from(value: StructArgSingleGreen<'db>) -> Self {
7038 Self(value.0)
7039 }
7040}
7041impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
7042 fn from(value: StructArgTailGreen<'db>) -> Self {
7043 Self(value.0)
7044 }
7045}
7046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7047pub struct StructArgGreen<'db>(pub GreenId<'db>);
7048impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
7049 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7050 type StablePtr = StructArgPtr<'db>;
7051 type Green = StructArgGreen<'db>;
7052 fn missing(db: &'db dyn Database) -> Self::Green {
7053 panic!("No missing variant.");
7054 }
7055 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7056 let kind = node.kind(db);
7057 match kind {
7058 SyntaxKind::StructArgSingle => {
7059 StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7060 }
7061 SyntaxKind::StructArgTail => {
7062 StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7063 }
7064 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7065 }
7066 }
7067 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7068 let kind = node.kind(db);
7069 match kind {
7070 SyntaxKind::StructArgSingle => {
7071 Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7072 }
7073 SyntaxKind::StructArgTail => {
7074 Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7075 }
7076 _ => None,
7077 }
7078 }
7079 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7080 match self {
7081 StructArg::StructArgSingle(x) => x.as_syntax_node(),
7082 StructArg::StructArgTail(x) => x.as_syntax_node(),
7083 }
7084 }
7085 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7086 StructArgPtr(self.as_syntax_node().long(db).stable_ptr)
7087 }
7088}
7089impl<'db> StructArg<'db> {
7090 pub fn is_variant(kind: SyntaxKind) -> bool {
7092 matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7093 }
7094}
7095#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7096pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7097impl<'db> Deref for StructArgList<'db> {
7098 type Target = ElementList<'db, StructArg<'db>, 2>;
7099 fn deref(&self) -> &Self::Target {
7100 &self.0
7101 }
7102}
7103impl<'db> StructArgList<'db> {
7104 pub fn new_green(
7105 db: &'db dyn Database,
7106 children: &[StructArgListElementOrSeparatorGreen<'db>],
7107 ) -> StructArgListGreen<'db> {
7108 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7109 StructArgListGreen(
7110 GreenNode {
7111 kind: SyntaxKind::StructArgList,
7112 details: GreenNodeDetails::Node {
7113 children: children.iter().map(|x| x.id()).collect(),
7114 width,
7115 },
7116 }
7117 .intern(db),
7118 )
7119 }
7120}
7121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7122pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7123impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7124 type SyntaxNode = StructArgList<'db>;
7125 fn untyped(self) -> SyntaxStablePtrId<'db> {
7126 self.0
7127 }
7128 fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7129 StructArgList::from_syntax_node(db, self.0.lookup(db))
7130 }
7131}
7132impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7133 fn from(ptr: StructArgListPtr<'db>) -> Self {
7134 ptr.untyped()
7135 }
7136}
7137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7138pub enum StructArgListElementOrSeparatorGreen<'db> {
7139 Separator(TerminalCommaGreen<'db>),
7140 Element(StructArgGreen<'db>),
7141}
7142impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7143 fn from(value: TerminalCommaGreen<'db>) -> Self {
7144 StructArgListElementOrSeparatorGreen::Separator(value)
7145 }
7146}
7147impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7148 fn from(value: StructArgGreen<'db>) -> Self {
7149 StructArgListElementOrSeparatorGreen::Element(value)
7150 }
7151}
7152impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7153 fn id(&self) -> GreenId<'db> {
7154 match self {
7155 StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7156 StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7157 }
7158 }
7159}
7160#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7161pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7162impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7163 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7164 type StablePtr = StructArgListPtr<'db>;
7165 type Green = StructArgListGreen<'db>;
7166 fn missing(db: &'db dyn Database) -> Self::Green {
7167 StructArgListGreen(
7168 GreenNode {
7169 kind: SyntaxKind::StructArgList,
7170 details: GreenNodeDetails::Node {
7171 children: [].into(),
7172 width: TextWidth::default(),
7173 },
7174 }
7175 .intern(db),
7176 )
7177 }
7178 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7179 Self(ElementList::new(node))
7180 }
7181 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7182 if node.kind(db) == SyntaxKind::StructArgList {
7183 Some(Self(ElementList::new(node)))
7184 } else {
7185 None
7186 }
7187 }
7188 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7189 self.node
7190 }
7191 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7192 StructArgListPtr(self.node.stable_ptr(db))
7193 }
7194}
7195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7196pub struct ArgListBraced<'db> {
7197 node: SyntaxNode<'db>,
7198}
7199impl<'db> ArgListBraced<'db> {
7200 pub const INDEX_LBRACE: usize = 0;
7201 pub const INDEX_ARGUMENTS: usize = 1;
7202 pub const INDEX_RBRACE: usize = 2;
7203 pub fn new_green(
7204 db: &'db dyn Database,
7205 lbrace: TerminalLBraceGreen<'db>,
7206 arguments: ArgListGreen<'db>,
7207 rbrace: TerminalRBraceGreen<'db>,
7208 ) -> ArgListBracedGreen<'db> {
7209 let children = [lbrace.0, arguments.0, rbrace.0];
7210 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7211 ArgListBracedGreen(
7212 GreenNode {
7213 kind: SyntaxKind::ArgListBraced,
7214 details: GreenNodeDetails::Node { children: children.into(), width },
7215 }
7216 .intern(db),
7217 )
7218 }
7219}
7220impl<'db> ArgListBraced<'db> {
7221 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7222 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7223 }
7224 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7225 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7226 }
7227 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7228 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7229 }
7230}
7231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7232pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7233impl<'db> ArgListBracedPtr<'db> {}
7234impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7235 type SyntaxNode = ArgListBraced<'db>;
7236 fn untyped(self) -> SyntaxStablePtrId<'db> {
7237 self.0
7238 }
7239 fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7240 ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7241 }
7242}
7243impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7244 fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7245 ptr.untyped()
7246 }
7247}
7248#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7249pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7250impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7251 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7252 type StablePtr = ArgListBracedPtr<'db>;
7253 type Green = ArgListBracedGreen<'db>;
7254 fn missing(db: &'db dyn Database) -> Self::Green {
7255 ArgListBracedGreen(
7256 GreenNode {
7257 kind: SyntaxKind::ArgListBraced,
7258 details: GreenNodeDetails::Node {
7259 children: [
7260 TerminalLBrace::missing(db).0,
7261 ArgList::missing(db).0,
7262 TerminalRBrace::missing(db).0,
7263 ]
7264 .into(),
7265 width: TextWidth::default(),
7266 },
7267 }
7268 .intern(db),
7269 )
7270 }
7271 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7272 let kind = node.kind(db);
7273 assert_eq!(
7274 kind,
7275 SyntaxKind::ArgListBraced,
7276 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7277 kind,
7278 SyntaxKind::ArgListBraced
7279 );
7280 Self { node }
7281 }
7282 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7283 let kind = node.kind(db);
7284 if kind == SyntaxKind::ArgListBraced {
7285 Some(Self::from_syntax_node(db, node))
7286 } else {
7287 None
7288 }
7289 }
7290 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7291 self.node
7292 }
7293 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7294 ArgListBracedPtr(self.node.stable_ptr(db))
7295 }
7296}
7297#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7298pub struct ArgListBracketed<'db> {
7299 node: SyntaxNode<'db>,
7300}
7301impl<'db> ArgListBracketed<'db> {
7302 pub const INDEX_LBRACK: usize = 0;
7303 pub const INDEX_ARGUMENTS: usize = 1;
7304 pub const INDEX_RBRACK: usize = 2;
7305 pub fn new_green(
7306 db: &'db dyn Database,
7307 lbrack: TerminalLBrackGreen<'db>,
7308 arguments: ArgListGreen<'db>,
7309 rbrack: TerminalRBrackGreen<'db>,
7310 ) -> ArgListBracketedGreen<'db> {
7311 let children = [lbrack.0, arguments.0, rbrack.0];
7312 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7313 ArgListBracketedGreen(
7314 GreenNode {
7315 kind: SyntaxKind::ArgListBracketed,
7316 details: GreenNodeDetails::Node { children: children.into(), width },
7317 }
7318 .intern(db),
7319 )
7320 }
7321}
7322impl<'db> ArgListBracketed<'db> {
7323 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7324 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7325 }
7326 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7327 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7328 }
7329 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7330 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7331 }
7332}
7333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7334pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7335impl<'db> ArgListBracketedPtr<'db> {}
7336impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7337 type SyntaxNode = ArgListBracketed<'db>;
7338 fn untyped(self) -> SyntaxStablePtrId<'db> {
7339 self.0
7340 }
7341 fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7342 ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7343 }
7344}
7345impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7346 fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7347 ptr.untyped()
7348 }
7349}
7350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7351pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7352impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7353 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7354 type StablePtr = ArgListBracketedPtr<'db>;
7355 type Green = ArgListBracketedGreen<'db>;
7356 fn missing(db: &'db dyn Database) -> Self::Green {
7357 ArgListBracketedGreen(
7358 GreenNode {
7359 kind: SyntaxKind::ArgListBracketed,
7360 details: GreenNodeDetails::Node {
7361 children: [
7362 TerminalLBrack::missing(db).0,
7363 ArgList::missing(db).0,
7364 TerminalRBrack::missing(db).0,
7365 ]
7366 .into(),
7367 width: TextWidth::default(),
7368 },
7369 }
7370 .intern(db),
7371 )
7372 }
7373 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7374 let kind = node.kind(db);
7375 assert_eq!(
7376 kind,
7377 SyntaxKind::ArgListBracketed,
7378 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7379 kind,
7380 SyntaxKind::ArgListBracketed
7381 );
7382 Self { node }
7383 }
7384 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7385 let kind = node.kind(db);
7386 if kind == SyntaxKind::ArgListBracketed {
7387 Some(Self::from_syntax_node(db, node))
7388 } else {
7389 None
7390 }
7391 }
7392 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7393 self.node
7394 }
7395 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7396 ArgListBracketedPtr(self.node.stable_ptr(db))
7397 }
7398}
7399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7400pub enum WrappedArgList<'db> {
7401 BracketedArgList(ArgListBracketed<'db>),
7402 ParenthesizedArgList(ArgListParenthesized<'db>),
7403 BracedArgList(ArgListBraced<'db>),
7404 Missing(WrappedArgListMissing<'db>),
7405}
7406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7407pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7408impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7409 type SyntaxNode = WrappedArgList<'db>;
7410 fn untyped(self) -> SyntaxStablePtrId<'db> {
7411 self.0
7412 }
7413 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7414 WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7415 }
7416}
7417impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7418 fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7419 ptr.untyped()
7420 }
7421}
7422impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7423 fn from(value: ArgListBracketedPtr<'db>) -> Self {
7424 Self(value.0)
7425 }
7426}
7427impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7428 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7429 Self(value.0)
7430 }
7431}
7432impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7433 fn from(value: ArgListBracedPtr<'db>) -> Self {
7434 Self(value.0)
7435 }
7436}
7437impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7438 fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7439 Self(value.0)
7440 }
7441}
7442impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7443 fn from(value: ArgListBracketedGreen<'db>) -> Self {
7444 Self(value.0)
7445 }
7446}
7447impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7448 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7449 Self(value.0)
7450 }
7451}
7452impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7453 fn from(value: ArgListBracedGreen<'db>) -> Self {
7454 Self(value.0)
7455 }
7456}
7457impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7458 fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7459 Self(value.0)
7460 }
7461}
7462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7463pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7464impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7465 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7466 type StablePtr = WrappedArgListPtr<'db>;
7467 type Green = WrappedArgListGreen<'db>;
7468 fn missing(db: &'db dyn Database) -> Self::Green {
7469 WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7470 }
7471 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7472 let kind = node.kind(db);
7473 match kind {
7474 SyntaxKind::ArgListBracketed => {
7475 WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7476 }
7477 SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7478 ArgListParenthesized::from_syntax_node(db, node),
7479 ),
7480 SyntaxKind::ArgListBraced => {
7481 WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7482 }
7483 SyntaxKind::WrappedArgListMissing => {
7484 WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7485 }
7486 _ => {
7487 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7488 }
7489 }
7490 }
7491 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7492 let kind = node.kind(db);
7493 match kind {
7494 SyntaxKind::ArgListBracketed => {
7495 Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7496 }
7497 SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7498 ArgListParenthesized::from_syntax_node(db, node),
7499 )),
7500 SyntaxKind::ArgListBraced => {
7501 Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7502 }
7503 SyntaxKind::WrappedArgListMissing => {
7504 Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7505 }
7506 _ => None,
7507 }
7508 }
7509 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7510 match self {
7511 WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7512 WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7513 WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7514 WrappedArgList::Missing(x) => x.as_syntax_node(),
7515 }
7516 }
7517 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7518 WrappedArgListPtr(self.as_syntax_node().long(db).stable_ptr)
7519 }
7520}
7521impl<'db> WrappedArgList<'db> {
7522 pub fn is_variant(kind: SyntaxKind) -> bool {
7524 matches!(
7525 kind,
7526 SyntaxKind::ArgListBracketed
7527 | SyntaxKind::ArgListParenthesized
7528 | SyntaxKind::ArgListBraced
7529 | SyntaxKind::WrappedArgListMissing
7530 )
7531 }
7532}
7533#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7534pub struct WrappedArgListMissing<'db> {
7535 node: SyntaxNode<'db>,
7536}
7537impl<'db> WrappedArgListMissing<'db> {
7538 pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7539 let children = [];
7540 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7541 WrappedArgListMissingGreen(
7542 GreenNode {
7543 kind: SyntaxKind::WrappedArgListMissing,
7544 details: GreenNodeDetails::Node { children: children.into(), width },
7545 }
7546 .intern(db),
7547 )
7548 }
7549}
7550impl<'db> WrappedArgListMissing<'db> {}
7551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7552pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7553impl<'db> WrappedArgListMissingPtr<'db> {}
7554impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7555 type SyntaxNode = WrappedArgListMissing<'db>;
7556 fn untyped(self) -> SyntaxStablePtrId<'db> {
7557 self.0
7558 }
7559 fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7560 WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7561 }
7562}
7563impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7564 fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7565 ptr.untyped()
7566 }
7567}
7568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7569pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7570impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7571 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7572 type StablePtr = WrappedArgListMissingPtr<'db>;
7573 type Green = WrappedArgListMissingGreen<'db>;
7574 fn missing(db: &'db dyn Database) -> Self::Green {
7575 WrappedArgListMissingGreen(
7576 GreenNode {
7577 kind: SyntaxKind::WrappedArgListMissing,
7578 details: GreenNodeDetails::Node {
7579 children: [].into(),
7580 width: TextWidth::default(),
7581 },
7582 }
7583 .intern(db),
7584 )
7585 }
7586 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7587 let kind = node.kind(db);
7588 assert_eq!(
7589 kind,
7590 SyntaxKind::WrappedArgListMissing,
7591 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7592 kind,
7593 SyntaxKind::WrappedArgListMissing
7594 );
7595 Self { node }
7596 }
7597 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7598 let kind = node.kind(db);
7599 if kind == SyntaxKind::WrappedArgListMissing {
7600 Some(Self::from_syntax_node(db, node))
7601 } else {
7602 None
7603 }
7604 }
7605 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7606 self.node
7607 }
7608 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7609 WrappedArgListMissingPtr(self.node.stable_ptr(db))
7610 }
7611}
7612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7613pub enum Pattern<'db> {
7614 Underscore(TerminalUnderscore<'db>),
7615 Literal(TerminalLiteralNumber<'db>),
7616 False(TerminalFalse<'db>),
7617 True(TerminalTrue<'db>),
7618 ShortString(TerminalShortString<'db>),
7619 String(TerminalString<'db>),
7620 Identifier(PatternIdentifier<'db>),
7621 Struct(PatternStruct<'db>),
7622 Tuple(PatternTuple<'db>),
7623 Enum(PatternEnum<'db>),
7624 FixedSizeArray(PatternFixedSizeArray<'db>),
7625 Path(ExprPath<'db>),
7626}
7627#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7628pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7629impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7630 type SyntaxNode = Pattern<'db>;
7631 fn untyped(self) -> SyntaxStablePtrId<'db> {
7632 self.0
7633 }
7634 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7635 Pattern::from_syntax_node(db, self.0.lookup(db))
7636 }
7637}
7638impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7639 fn from(ptr: PatternPtr<'db>) -> Self {
7640 ptr.untyped()
7641 }
7642}
7643impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7644 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7645 Self(value.0)
7646 }
7647}
7648impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7649 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7650 Self(value.0)
7651 }
7652}
7653impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7654 fn from(value: TerminalFalsePtr<'db>) -> Self {
7655 Self(value.0)
7656 }
7657}
7658impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7659 fn from(value: TerminalTruePtr<'db>) -> Self {
7660 Self(value.0)
7661 }
7662}
7663impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7664 fn from(value: TerminalShortStringPtr<'db>) -> Self {
7665 Self(value.0)
7666 }
7667}
7668impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7669 fn from(value: TerminalStringPtr<'db>) -> Self {
7670 Self(value.0)
7671 }
7672}
7673impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7674 fn from(value: PatternIdentifierPtr<'db>) -> Self {
7675 Self(value.0)
7676 }
7677}
7678impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7679 fn from(value: PatternStructPtr<'db>) -> Self {
7680 Self(value.0)
7681 }
7682}
7683impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7684 fn from(value: PatternTuplePtr<'db>) -> Self {
7685 Self(value.0)
7686 }
7687}
7688impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7689 fn from(value: PatternEnumPtr<'db>) -> Self {
7690 Self(value.0)
7691 }
7692}
7693impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7694 fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7695 Self(value.0)
7696 }
7697}
7698impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7699 fn from(value: ExprPathPtr<'db>) -> Self {
7700 Self(value.0)
7701 }
7702}
7703impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7704 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7705 Self(value.0)
7706 }
7707}
7708impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7709 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7710 Self(value.0)
7711 }
7712}
7713impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7714 fn from(value: TerminalFalseGreen<'db>) -> Self {
7715 Self(value.0)
7716 }
7717}
7718impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7719 fn from(value: TerminalTrueGreen<'db>) -> Self {
7720 Self(value.0)
7721 }
7722}
7723impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7724 fn from(value: TerminalShortStringGreen<'db>) -> Self {
7725 Self(value.0)
7726 }
7727}
7728impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7729 fn from(value: TerminalStringGreen<'db>) -> Self {
7730 Self(value.0)
7731 }
7732}
7733impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7734 fn from(value: PatternIdentifierGreen<'db>) -> Self {
7735 Self(value.0)
7736 }
7737}
7738impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7739 fn from(value: PatternStructGreen<'db>) -> Self {
7740 Self(value.0)
7741 }
7742}
7743impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7744 fn from(value: PatternTupleGreen<'db>) -> Self {
7745 Self(value.0)
7746 }
7747}
7748impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7749 fn from(value: PatternEnumGreen<'db>) -> Self {
7750 Self(value.0)
7751 }
7752}
7753impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7754 fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7755 Self(value.0)
7756 }
7757}
7758impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7759 fn from(value: ExprPathGreen<'db>) -> Self {
7760 Self(value.0)
7761 }
7762}
7763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7764pub struct PatternGreen<'db>(pub GreenId<'db>);
7765impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7766 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7767 type StablePtr = PatternPtr<'db>;
7768 type Green = PatternGreen<'db>;
7769 fn missing(db: &'db dyn Database) -> Self::Green {
7770 panic!("No missing variant.");
7771 }
7772 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7773 let kind = node.kind(db);
7774 match kind {
7775 SyntaxKind::TerminalUnderscore => {
7776 Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7777 }
7778 SyntaxKind::TerminalLiteralNumber => {
7779 Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7780 }
7781 SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7782 SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7783 SyntaxKind::TerminalShortString => {
7784 Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7785 }
7786 SyntaxKind::TerminalString => {
7787 Pattern::String(TerminalString::from_syntax_node(db, node))
7788 }
7789 SyntaxKind::PatternIdentifier => {
7790 Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7791 }
7792 SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7793 SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7794 SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7795 SyntaxKind::PatternFixedSizeArray => {
7796 Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7797 }
7798 SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7799 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7800 }
7801 }
7802 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7803 let kind = node.kind(db);
7804 match kind {
7805 SyntaxKind::TerminalUnderscore => {
7806 Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7807 }
7808 SyntaxKind::TerminalLiteralNumber => {
7809 Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7810 }
7811 SyntaxKind::TerminalFalse => {
7812 Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7813 }
7814 SyntaxKind::TerminalTrue => {
7815 Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7816 }
7817 SyntaxKind::TerminalShortString => {
7818 Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7819 }
7820 SyntaxKind::TerminalString => {
7821 Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7822 }
7823 SyntaxKind::PatternIdentifier => {
7824 Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7825 }
7826 SyntaxKind::PatternStruct => {
7827 Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7828 }
7829 SyntaxKind::PatternTuple => {
7830 Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7831 }
7832 SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7833 SyntaxKind::PatternFixedSizeArray => {
7834 Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7835 }
7836 SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7837 _ => None,
7838 }
7839 }
7840 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7841 match self {
7842 Pattern::Underscore(x) => x.as_syntax_node(),
7843 Pattern::Literal(x) => x.as_syntax_node(),
7844 Pattern::False(x) => x.as_syntax_node(),
7845 Pattern::True(x) => x.as_syntax_node(),
7846 Pattern::ShortString(x) => x.as_syntax_node(),
7847 Pattern::String(x) => x.as_syntax_node(),
7848 Pattern::Identifier(x) => x.as_syntax_node(),
7849 Pattern::Struct(x) => x.as_syntax_node(),
7850 Pattern::Tuple(x) => x.as_syntax_node(),
7851 Pattern::Enum(x) => x.as_syntax_node(),
7852 Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7853 Pattern::Path(x) => x.as_syntax_node(),
7854 }
7855 }
7856 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7857 PatternPtr(self.as_syntax_node().long(db).stable_ptr)
7858 }
7859}
7860impl<'db> Pattern<'db> {
7861 pub fn is_variant(kind: SyntaxKind) -> bool {
7863 matches!(
7864 kind,
7865 SyntaxKind::TerminalUnderscore
7866 | SyntaxKind::TerminalLiteralNumber
7867 | SyntaxKind::TerminalFalse
7868 | SyntaxKind::TerminalTrue
7869 | SyntaxKind::TerminalShortString
7870 | SyntaxKind::TerminalString
7871 | SyntaxKind::PatternIdentifier
7872 | SyntaxKind::PatternStruct
7873 | SyntaxKind::PatternTuple
7874 | SyntaxKind::PatternEnum
7875 | SyntaxKind::PatternFixedSizeArray
7876 | SyntaxKind::ExprPath
7877 )
7878 }
7879}
7880#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7881pub struct PatternIdentifier<'db> {
7882 node: SyntaxNode<'db>,
7883}
7884impl<'db> PatternIdentifier<'db> {
7885 pub const INDEX_MODIFIERS: usize = 0;
7886 pub const INDEX_NAME: usize = 1;
7887 pub fn new_green(
7888 db: &'db dyn Database,
7889 modifiers: ModifierListGreen<'db>,
7890 name: TerminalIdentifierGreen<'db>,
7891 ) -> PatternIdentifierGreen<'db> {
7892 let children = [modifiers.0, name.0];
7893 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7894 PatternIdentifierGreen(
7895 GreenNode {
7896 kind: SyntaxKind::PatternIdentifier,
7897 details: GreenNodeDetails::Node { children: children.into(), width },
7898 }
7899 .intern(db),
7900 )
7901 }
7902}
7903impl<'db> PatternIdentifier<'db> {
7904 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7905 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7906 }
7907 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7908 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7909 }
7910}
7911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7912pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7913impl<'db> PatternIdentifierPtr<'db> {
7914 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7915 let ptr = self.0.long(db);
7916 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
7917 TerminalIdentifierGreen(key_fields[0])
7918 } else {
7919 panic!("Unexpected key field query on root.");
7920 }
7921 }
7922}
7923impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7924 type SyntaxNode = PatternIdentifier<'db>;
7925 fn untyped(self) -> SyntaxStablePtrId<'db> {
7926 self.0
7927 }
7928 fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7929 PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7930 }
7931}
7932impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7933 fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7934 ptr.untyped()
7935 }
7936}
7937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7938pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7939impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7940 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7941 type StablePtr = PatternIdentifierPtr<'db>;
7942 type Green = PatternIdentifierGreen<'db>;
7943 fn missing(db: &'db dyn Database) -> Self::Green {
7944 PatternIdentifierGreen(
7945 GreenNode {
7946 kind: SyntaxKind::PatternIdentifier,
7947 details: GreenNodeDetails::Node {
7948 children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7949 .into(),
7950 width: TextWidth::default(),
7951 },
7952 }
7953 .intern(db),
7954 )
7955 }
7956 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7957 let kind = node.kind(db);
7958 assert_eq!(
7959 kind,
7960 SyntaxKind::PatternIdentifier,
7961 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7962 kind,
7963 SyntaxKind::PatternIdentifier
7964 );
7965 Self { node }
7966 }
7967 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7968 let kind = node.kind(db);
7969 if kind == SyntaxKind::PatternIdentifier {
7970 Some(Self::from_syntax_node(db, node))
7971 } else {
7972 None
7973 }
7974 }
7975 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7976 self.node
7977 }
7978 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7979 PatternIdentifierPtr(self.node.stable_ptr(db))
7980 }
7981}
7982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7983pub struct PatternStruct<'db> {
7984 node: SyntaxNode<'db>,
7985}
7986impl<'db> PatternStruct<'db> {
7987 pub const INDEX_PATH: usize = 0;
7988 pub const INDEX_LBRACE: usize = 1;
7989 pub const INDEX_PARAMS: usize = 2;
7990 pub const INDEX_RBRACE: usize = 3;
7991 pub fn new_green(
7992 db: &'db dyn Database,
7993 path: ExprPathGreen<'db>,
7994 lbrace: TerminalLBraceGreen<'db>,
7995 params: PatternStructParamListGreen<'db>,
7996 rbrace: TerminalRBraceGreen<'db>,
7997 ) -> PatternStructGreen<'db> {
7998 let children = [path.0, lbrace.0, params.0, rbrace.0];
7999 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8000 PatternStructGreen(
8001 GreenNode {
8002 kind: SyntaxKind::PatternStruct,
8003 details: GreenNodeDetails::Node { children: children.into(), width },
8004 }
8005 .intern(db),
8006 )
8007 }
8008}
8009impl<'db> PatternStruct<'db> {
8010 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8011 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8012 }
8013 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
8014 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
8015 }
8016 pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8017 PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
8018 }
8019 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
8020 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
8021 }
8022}
8023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8024pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
8025impl<'db> PatternStructPtr<'db> {}
8026impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
8027 type SyntaxNode = PatternStruct<'db>;
8028 fn untyped(self) -> SyntaxStablePtrId<'db> {
8029 self.0
8030 }
8031 fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
8032 PatternStruct::from_syntax_node(db, self.0.lookup(db))
8033 }
8034}
8035impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
8036 fn from(ptr: PatternStructPtr<'db>) -> Self {
8037 ptr.untyped()
8038 }
8039}
8040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8041pub struct PatternStructGreen<'db>(pub GreenId<'db>);
8042impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
8043 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8044 type StablePtr = PatternStructPtr<'db>;
8045 type Green = PatternStructGreen<'db>;
8046 fn missing(db: &'db dyn Database) -> Self::Green {
8047 PatternStructGreen(
8048 GreenNode {
8049 kind: SyntaxKind::PatternStruct,
8050 details: GreenNodeDetails::Node {
8051 children: [
8052 ExprPath::missing(db).0,
8053 TerminalLBrace::missing(db).0,
8054 PatternStructParamList::missing(db).0,
8055 TerminalRBrace::missing(db).0,
8056 ]
8057 .into(),
8058 width: TextWidth::default(),
8059 },
8060 }
8061 .intern(db),
8062 )
8063 }
8064 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8065 let kind = node.kind(db);
8066 assert_eq!(
8067 kind,
8068 SyntaxKind::PatternStruct,
8069 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8070 kind,
8071 SyntaxKind::PatternStruct
8072 );
8073 Self { node }
8074 }
8075 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8076 let kind = node.kind(db);
8077 if kind == SyntaxKind::PatternStruct {
8078 Some(Self::from_syntax_node(db, node))
8079 } else {
8080 None
8081 }
8082 }
8083 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8084 self.node
8085 }
8086 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8087 PatternStructPtr(self.node.stable_ptr(db))
8088 }
8089}
8090#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8091pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8092impl<'db> Deref for PatternStructParamList<'db> {
8093 type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8094 fn deref(&self) -> &Self::Target {
8095 &self.0
8096 }
8097}
8098impl<'db> PatternStructParamList<'db> {
8099 pub fn new_green(
8100 db: &'db dyn Database,
8101 children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8102 ) -> PatternStructParamListGreen<'db> {
8103 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8104 PatternStructParamListGreen(
8105 GreenNode {
8106 kind: SyntaxKind::PatternStructParamList,
8107 details: GreenNodeDetails::Node {
8108 children: children.iter().map(|x| x.id()).collect(),
8109 width,
8110 },
8111 }
8112 .intern(db),
8113 )
8114 }
8115}
8116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8117pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8118impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8119 type SyntaxNode = PatternStructParamList<'db>;
8120 fn untyped(self) -> SyntaxStablePtrId<'db> {
8121 self.0
8122 }
8123 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8124 PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8125 }
8126}
8127impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8128 fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8129 ptr.untyped()
8130 }
8131}
8132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8133pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8134 Separator(TerminalCommaGreen<'db>),
8135 Element(PatternStructParamGreen<'db>),
8136}
8137impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8138 fn from(value: TerminalCommaGreen<'db>) -> Self {
8139 PatternStructParamListElementOrSeparatorGreen::Separator(value)
8140 }
8141}
8142impl<'db> From<PatternStructParamGreen<'db>>
8143 for PatternStructParamListElementOrSeparatorGreen<'db>
8144{
8145 fn from(value: PatternStructParamGreen<'db>) -> Self {
8146 PatternStructParamListElementOrSeparatorGreen::Element(value)
8147 }
8148}
8149impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8150 fn id(&self) -> GreenId<'db> {
8151 match self {
8152 PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8153 PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8154 }
8155 }
8156}
8157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8158pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8159impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8160 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8161 type StablePtr = PatternStructParamListPtr<'db>;
8162 type Green = PatternStructParamListGreen<'db>;
8163 fn missing(db: &'db dyn Database) -> Self::Green {
8164 PatternStructParamListGreen(
8165 GreenNode {
8166 kind: SyntaxKind::PatternStructParamList,
8167 details: GreenNodeDetails::Node {
8168 children: [].into(),
8169 width: TextWidth::default(),
8170 },
8171 }
8172 .intern(db),
8173 )
8174 }
8175 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8176 Self(ElementList::new(node))
8177 }
8178 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8179 if node.kind(db) == SyntaxKind::PatternStructParamList {
8180 Some(Self(ElementList::new(node)))
8181 } else {
8182 None
8183 }
8184 }
8185 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8186 self.node
8187 }
8188 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8189 PatternStructParamListPtr(self.node.stable_ptr(db))
8190 }
8191}
8192#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8193pub struct PatternTuple<'db> {
8194 node: SyntaxNode<'db>,
8195}
8196impl<'db> PatternTuple<'db> {
8197 pub const INDEX_LPAREN: usize = 0;
8198 pub const INDEX_PATTERNS: usize = 1;
8199 pub const INDEX_RPAREN: usize = 2;
8200 pub fn new_green(
8201 db: &'db dyn Database,
8202 lparen: TerminalLParenGreen<'db>,
8203 patterns: PatternListGreen<'db>,
8204 rparen: TerminalRParenGreen<'db>,
8205 ) -> PatternTupleGreen<'db> {
8206 let children = [lparen.0, patterns.0, rparen.0];
8207 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8208 PatternTupleGreen(
8209 GreenNode {
8210 kind: SyntaxKind::PatternTuple,
8211 details: GreenNodeDetails::Node { children: children.into(), width },
8212 }
8213 .intern(db),
8214 )
8215 }
8216}
8217impl<'db> PatternTuple<'db> {
8218 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8219 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8220 }
8221 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8222 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8223 }
8224 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8225 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8226 }
8227}
8228#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8229pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8230impl<'db> PatternTuplePtr<'db> {}
8231impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8232 type SyntaxNode = PatternTuple<'db>;
8233 fn untyped(self) -> SyntaxStablePtrId<'db> {
8234 self.0
8235 }
8236 fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8237 PatternTuple::from_syntax_node(db, self.0.lookup(db))
8238 }
8239}
8240impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8241 fn from(ptr: PatternTuplePtr<'db>) -> Self {
8242 ptr.untyped()
8243 }
8244}
8245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8246pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8247impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8248 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8249 type StablePtr = PatternTuplePtr<'db>;
8250 type Green = PatternTupleGreen<'db>;
8251 fn missing(db: &'db dyn Database) -> Self::Green {
8252 PatternTupleGreen(
8253 GreenNode {
8254 kind: SyntaxKind::PatternTuple,
8255 details: GreenNodeDetails::Node {
8256 children: [
8257 TerminalLParen::missing(db).0,
8258 PatternList::missing(db).0,
8259 TerminalRParen::missing(db).0,
8260 ]
8261 .into(),
8262 width: TextWidth::default(),
8263 },
8264 }
8265 .intern(db),
8266 )
8267 }
8268 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8269 let kind = node.kind(db);
8270 assert_eq!(
8271 kind,
8272 SyntaxKind::PatternTuple,
8273 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8274 kind,
8275 SyntaxKind::PatternTuple
8276 );
8277 Self { node }
8278 }
8279 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8280 let kind = node.kind(db);
8281 if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8282 }
8283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8284 self.node
8285 }
8286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8287 PatternTuplePtr(self.node.stable_ptr(db))
8288 }
8289}
8290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8291pub struct PatternFixedSizeArray<'db> {
8292 node: SyntaxNode<'db>,
8293}
8294impl<'db> PatternFixedSizeArray<'db> {
8295 pub const INDEX_LBRACK: usize = 0;
8296 pub const INDEX_PATTERNS: usize = 1;
8297 pub const INDEX_RBRACK: usize = 2;
8298 pub fn new_green(
8299 db: &'db dyn Database,
8300 lbrack: TerminalLBrackGreen<'db>,
8301 patterns: PatternListGreen<'db>,
8302 rbrack: TerminalRBrackGreen<'db>,
8303 ) -> PatternFixedSizeArrayGreen<'db> {
8304 let children = [lbrack.0, patterns.0, rbrack.0];
8305 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8306 PatternFixedSizeArrayGreen(
8307 GreenNode {
8308 kind: SyntaxKind::PatternFixedSizeArray,
8309 details: GreenNodeDetails::Node { children: children.into(), width },
8310 }
8311 .intern(db),
8312 )
8313 }
8314}
8315impl<'db> PatternFixedSizeArray<'db> {
8316 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8317 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8318 }
8319 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8320 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8321 }
8322 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8323 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8324 }
8325}
8326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8327pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8328impl<'db> PatternFixedSizeArrayPtr<'db> {}
8329impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8330 type SyntaxNode = PatternFixedSizeArray<'db>;
8331 fn untyped(self) -> SyntaxStablePtrId<'db> {
8332 self.0
8333 }
8334 fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8335 PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8336 }
8337}
8338impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8339 fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8340 ptr.untyped()
8341 }
8342}
8343#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8344pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8345impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8346 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8347 type StablePtr = PatternFixedSizeArrayPtr<'db>;
8348 type Green = PatternFixedSizeArrayGreen<'db>;
8349 fn missing(db: &'db dyn Database) -> Self::Green {
8350 PatternFixedSizeArrayGreen(
8351 GreenNode {
8352 kind: SyntaxKind::PatternFixedSizeArray,
8353 details: GreenNodeDetails::Node {
8354 children: [
8355 TerminalLBrack::missing(db).0,
8356 PatternList::missing(db).0,
8357 TerminalRBrack::missing(db).0,
8358 ]
8359 .into(),
8360 width: TextWidth::default(),
8361 },
8362 }
8363 .intern(db),
8364 )
8365 }
8366 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8367 let kind = node.kind(db);
8368 assert_eq!(
8369 kind,
8370 SyntaxKind::PatternFixedSizeArray,
8371 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8372 kind,
8373 SyntaxKind::PatternFixedSizeArray
8374 );
8375 Self { node }
8376 }
8377 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8378 let kind = node.kind(db);
8379 if kind == SyntaxKind::PatternFixedSizeArray {
8380 Some(Self::from_syntax_node(db, node))
8381 } else {
8382 None
8383 }
8384 }
8385 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8386 self.node
8387 }
8388 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8389 PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8390 }
8391}
8392#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8393pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8394impl<'db> Deref for PatternList<'db> {
8395 type Target = ElementList<'db, Pattern<'db>, 2>;
8396 fn deref(&self) -> &Self::Target {
8397 &self.0
8398 }
8399}
8400impl<'db> PatternList<'db> {
8401 pub fn new_green(
8402 db: &'db dyn Database,
8403 children: &[PatternListElementOrSeparatorGreen<'db>],
8404 ) -> PatternListGreen<'db> {
8405 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8406 PatternListGreen(
8407 GreenNode {
8408 kind: SyntaxKind::PatternList,
8409 details: GreenNodeDetails::Node {
8410 children: children.iter().map(|x| x.id()).collect(),
8411 width,
8412 },
8413 }
8414 .intern(db),
8415 )
8416 }
8417}
8418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8419pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8420impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8421 type SyntaxNode = PatternList<'db>;
8422 fn untyped(self) -> SyntaxStablePtrId<'db> {
8423 self.0
8424 }
8425 fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8426 PatternList::from_syntax_node(db, self.0.lookup(db))
8427 }
8428}
8429impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8430 fn from(ptr: PatternListPtr<'db>) -> Self {
8431 ptr.untyped()
8432 }
8433}
8434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8435pub enum PatternListElementOrSeparatorGreen<'db> {
8436 Separator(TerminalCommaGreen<'db>),
8437 Element(PatternGreen<'db>),
8438}
8439impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8440 fn from(value: TerminalCommaGreen<'db>) -> Self {
8441 PatternListElementOrSeparatorGreen::Separator(value)
8442 }
8443}
8444impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8445 fn from(value: PatternGreen<'db>) -> Self {
8446 PatternListElementOrSeparatorGreen::Element(value)
8447 }
8448}
8449impl<'db> PatternListElementOrSeparatorGreen<'db> {
8450 fn id(&self) -> GreenId<'db> {
8451 match self {
8452 PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8453 PatternListElementOrSeparatorGreen::Element(green) => green.0,
8454 }
8455 }
8456}
8457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8458pub struct PatternListGreen<'db>(pub GreenId<'db>);
8459impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8460 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8461 type StablePtr = PatternListPtr<'db>;
8462 type Green = PatternListGreen<'db>;
8463 fn missing(db: &'db dyn Database) -> Self::Green {
8464 PatternListGreen(
8465 GreenNode {
8466 kind: SyntaxKind::PatternList,
8467 details: GreenNodeDetails::Node {
8468 children: [].into(),
8469 width: TextWidth::default(),
8470 },
8471 }
8472 .intern(db),
8473 )
8474 }
8475 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8476 Self(ElementList::new(node))
8477 }
8478 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8479 if node.kind(db) == SyntaxKind::PatternList {
8480 Some(Self(ElementList::new(node)))
8481 } else {
8482 None
8483 }
8484 }
8485 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8486 self.node
8487 }
8488 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8489 PatternListPtr(self.node.stable_ptr(db))
8490 }
8491}
8492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8493pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8494impl<'db> Deref for PatternListOr<'db> {
8495 type Target = ElementList<'db, Pattern<'db>, 2>;
8496 fn deref(&self) -> &Self::Target {
8497 &self.0
8498 }
8499}
8500impl<'db> PatternListOr<'db> {
8501 pub fn new_green(
8502 db: &'db dyn Database,
8503 children: &[PatternListOrElementOrSeparatorGreen<'db>],
8504 ) -> PatternListOrGreen<'db> {
8505 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8506 PatternListOrGreen(
8507 GreenNode {
8508 kind: SyntaxKind::PatternListOr,
8509 details: GreenNodeDetails::Node {
8510 children: children.iter().map(|x| x.id()).collect(),
8511 width,
8512 },
8513 }
8514 .intern(db),
8515 )
8516 }
8517}
8518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8519pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8520impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8521 type SyntaxNode = PatternListOr<'db>;
8522 fn untyped(self) -> SyntaxStablePtrId<'db> {
8523 self.0
8524 }
8525 fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8526 PatternListOr::from_syntax_node(db, self.0.lookup(db))
8527 }
8528}
8529impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8530 fn from(ptr: PatternListOrPtr<'db>) -> Self {
8531 ptr.untyped()
8532 }
8533}
8534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8535pub enum PatternListOrElementOrSeparatorGreen<'db> {
8536 Separator(TerminalOrGreen<'db>),
8537 Element(PatternGreen<'db>),
8538}
8539impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8540 fn from(value: TerminalOrGreen<'db>) -> Self {
8541 PatternListOrElementOrSeparatorGreen::Separator(value)
8542 }
8543}
8544impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8545 fn from(value: PatternGreen<'db>) -> Self {
8546 PatternListOrElementOrSeparatorGreen::Element(value)
8547 }
8548}
8549impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8550 fn id(&self) -> GreenId<'db> {
8551 match self {
8552 PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8553 PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8554 }
8555 }
8556}
8557#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8558pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8559impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8560 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8561 type StablePtr = PatternListOrPtr<'db>;
8562 type Green = PatternListOrGreen<'db>;
8563 fn missing(db: &'db dyn Database) -> Self::Green {
8564 PatternListOrGreen(
8565 GreenNode {
8566 kind: SyntaxKind::PatternListOr,
8567 details: GreenNodeDetails::Node {
8568 children: [].into(),
8569 width: TextWidth::default(),
8570 },
8571 }
8572 .intern(db),
8573 )
8574 }
8575 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8576 Self(ElementList::new(node))
8577 }
8578 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8579 if node.kind(db) == SyntaxKind::PatternListOr {
8580 Some(Self(ElementList::new(node)))
8581 } else {
8582 None
8583 }
8584 }
8585 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8586 self.node
8587 }
8588 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8589 PatternListOrPtr(self.node.stable_ptr(db))
8590 }
8591}
8592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8593pub enum PatternStructParam<'db> {
8594 Single(PatternIdentifier<'db>),
8595 WithExpr(PatternStructParamWithExpr<'db>),
8596 Tail(TerminalDotDot<'db>),
8597}
8598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8599pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8600impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8601 type SyntaxNode = PatternStructParam<'db>;
8602 fn untyped(self) -> SyntaxStablePtrId<'db> {
8603 self.0
8604 }
8605 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8606 PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8607 }
8608}
8609impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8610 fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8611 ptr.untyped()
8612 }
8613}
8614impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8615 fn from(value: PatternIdentifierPtr<'db>) -> Self {
8616 Self(value.0)
8617 }
8618}
8619impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8620 fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8621 Self(value.0)
8622 }
8623}
8624impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8625 fn from(value: TerminalDotDotPtr<'db>) -> Self {
8626 Self(value.0)
8627 }
8628}
8629impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8630 fn from(value: PatternIdentifierGreen<'db>) -> Self {
8631 Self(value.0)
8632 }
8633}
8634impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8635 fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8636 Self(value.0)
8637 }
8638}
8639impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8640 fn from(value: TerminalDotDotGreen<'db>) -> Self {
8641 Self(value.0)
8642 }
8643}
8644#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8645pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8646impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8647 const OPTIONAL_KIND: Option<SyntaxKind> = None;
8648 type StablePtr = PatternStructParamPtr<'db>;
8649 type Green = PatternStructParamGreen<'db>;
8650 fn missing(db: &'db dyn Database) -> Self::Green {
8651 panic!("No missing variant.");
8652 }
8653 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8654 let kind = node.kind(db);
8655 match kind {
8656 SyntaxKind::PatternIdentifier => {
8657 PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8658 }
8659 SyntaxKind::PatternStructParamWithExpr => {
8660 PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8661 }
8662 SyntaxKind::TerminalDotDot => {
8663 PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8664 }
8665 _ => panic!(
8666 "Unexpected syntax kind {:?} when constructing {}.",
8667 kind, "PatternStructParam"
8668 ),
8669 }
8670 }
8671 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8672 let kind = node.kind(db);
8673 match kind {
8674 SyntaxKind::PatternIdentifier => {
8675 Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8676 }
8677 SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8678 PatternStructParamWithExpr::from_syntax_node(db, node),
8679 )),
8680 SyntaxKind::TerminalDotDot => {
8681 Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8682 }
8683 _ => None,
8684 }
8685 }
8686 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8687 match self {
8688 PatternStructParam::Single(x) => x.as_syntax_node(),
8689 PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8690 PatternStructParam::Tail(x) => x.as_syntax_node(),
8691 }
8692 }
8693 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8694 PatternStructParamPtr(self.as_syntax_node().long(db).stable_ptr)
8695 }
8696}
8697impl<'db> PatternStructParam<'db> {
8698 pub fn is_variant(kind: SyntaxKind) -> bool {
8700 matches!(
8701 kind,
8702 SyntaxKind::PatternIdentifier
8703 | SyntaxKind::PatternStructParamWithExpr
8704 | SyntaxKind::TerminalDotDot
8705 )
8706 }
8707}
8708#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8709pub struct PatternStructParamWithExpr<'db> {
8710 node: SyntaxNode<'db>,
8711}
8712impl<'db> PatternStructParamWithExpr<'db> {
8713 pub const INDEX_MODIFIERS: usize = 0;
8714 pub const INDEX_NAME: usize = 1;
8715 pub const INDEX_COLON: usize = 2;
8716 pub const INDEX_PATTERN: usize = 3;
8717 pub fn new_green(
8718 db: &'db dyn Database,
8719 modifiers: ModifierListGreen<'db>,
8720 name: TerminalIdentifierGreen<'db>,
8721 colon: TerminalColonGreen<'db>,
8722 pattern: PatternGreen<'db>,
8723 ) -> PatternStructParamWithExprGreen<'db> {
8724 let children = [modifiers.0, name.0, colon.0, pattern.0];
8725 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8726 PatternStructParamWithExprGreen(
8727 GreenNode {
8728 kind: SyntaxKind::PatternStructParamWithExpr,
8729 details: GreenNodeDetails::Node { children: children.into(), width },
8730 }
8731 .intern(db),
8732 )
8733 }
8734}
8735impl<'db> PatternStructParamWithExpr<'db> {
8736 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8737 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8738 }
8739 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8740 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8741 }
8742 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8743 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8744 }
8745 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8746 Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8747 }
8748}
8749#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8750pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8751impl<'db> PatternStructParamWithExprPtr<'db> {}
8752impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8753 type SyntaxNode = PatternStructParamWithExpr<'db>;
8754 fn untyped(self) -> SyntaxStablePtrId<'db> {
8755 self.0
8756 }
8757 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8758 PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8759 }
8760}
8761impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8762 fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8763 ptr.untyped()
8764 }
8765}
8766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8767pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8768impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8769 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8770 type StablePtr = PatternStructParamWithExprPtr<'db>;
8771 type Green = PatternStructParamWithExprGreen<'db>;
8772 fn missing(db: &'db dyn Database) -> Self::Green {
8773 PatternStructParamWithExprGreen(
8774 GreenNode {
8775 kind: SyntaxKind::PatternStructParamWithExpr,
8776 details: GreenNodeDetails::Node {
8777 children: [
8778 ModifierList::missing(db).0,
8779 TerminalIdentifier::missing(db).0,
8780 TerminalColon::missing(db).0,
8781 Pattern::missing(db).0,
8782 ]
8783 .into(),
8784 width: TextWidth::default(),
8785 },
8786 }
8787 .intern(db),
8788 )
8789 }
8790 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8791 let kind = node.kind(db);
8792 assert_eq!(
8793 kind,
8794 SyntaxKind::PatternStructParamWithExpr,
8795 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8796 kind,
8797 SyntaxKind::PatternStructParamWithExpr
8798 );
8799 Self { node }
8800 }
8801 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8802 let kind = node.kind(db);
8803 if kind == SyntaxKind::PatternStructParamWithExpr {
8804 Some(Self::from_syntax_node(db, node))
8805 } else {
8806 None
8807 }
8808 }
8809 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8810 self.node
8811 }
8812 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8813 PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8814 }
8815}
8816#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8817pub struct PatternEnum<'db> {
8818 node: SyntaxNode<'db>,
8819}
8820impl<'db> PatternEnum<'db> {
8821 pub const INDEX_PATH: usize = 0;
8822 pub const INDEX_PATTERN: usize = 1;
8823 pub fn new_green(
8824 db: &'db dyn Database,
8825 path: ExprPathGreen<'db>,
8826 pattern: OptionPatternEnumInnerPatternGreen<'db>,
8827 ) -> PatternEnumGreen<'db> {
8828 let children = [path.0, pattern.0];
8829 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8830 PatternEnumGreen(
8831 GreenNode {
8832 kind: SyntaxKind::PatternEnum,
8833 details: GreenNodeDetails::Node { children: children.into(), width },
8834 }
8835 .intern(db),
8836 )
8837 }
8838}
8839impl<'db> PatternEnum<'db> {
8840 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8841 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8842 }
8843 pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8844 OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8845 }
8846}
8847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8848pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8849impl<'db> PatternEnumPtr<'db> {}
8850impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8851 type SyntaxNode = PatternEnum<'db>;
8852 fn untyped(self) -> SyntaxStablePtrId<'db> {
8853 self.0
8854 }
8855 fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8856 PatternEnum::from_syntax_node(db, self.0.lookup(db))
8857 }
8858}
8859impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8860 fn from(ptr: PatternEnumPtr<'db>) -> Self {
8861 ptr.untyped()
8862 }
8863}
8864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8865pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8866impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8867 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8868 type StablePtr = PatternEnumPtr<'db>;
8869 type Green = PatternEnumGreen<'db>;
8870 fn missing(db: &'db dyn Database) -> Self::Green {
8871 PatternEnumGreen(
8872 GreenNode {
8873 kind: SyntaxKind::PatternEnum,
8874 details: GreenNodeDetails::Node {
8875 children: [
8876 ExprPath::missing(db).0,
8877 OptionPatternEnumInnerPattern::missing(db).0,
8878 ]
8879 .into(),
8880 width: TextWidth::default(),
8881 },
8882 }
8883 .intern(db),
8884 )
8885 }
8886 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8887 let kind = node.kind(db);
8888 assert_eq!(
8889 kind,
8890 SyntaxKind::PatternEnum,
8891 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8892 kind,
8893 SyntaxKind::PatternEnum
8894 );
8895 Self { node }
8896 }
8897 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8898 let kind = node.kind(db);
8899 if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8900 }
8901 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8902 self.node
8903 }
8904 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8905 PatternEnumPtr(self.node.stable_ptr(db))
8906 }
8907}
8908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8909pub struct PatternEnumInnerPattern<'db> {
8910 node: SyntaxNode<'db>,
8911}
8912impl<'db> PatternEnumInnerPattern<'db> {
8913 pub const INDEX_LPAREN: usize = 0;
8914 pub const INDEX_PATTERN: usize = 1;
8915 pub const INDEX_RPAREN: usize = 2;
8916 pub fn new_green(
8917 db: &'db dyn Database,
8918 lparen: TerminalLParenGreen<'db>,
8919 pattern: PatternGreen<'db>,
8920 rparen: TerminalRParenGreen<'db>,
8921 ) -> PatternEnumInnerPatternGreen<'db> {
8922 let children = [lparen.0, pattern.0, rparen.0];
8923 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8924 PatternEnumInnerPatternGreen(
8925 GreenNode {
8926 kind: SyntaxKind::PatternEnumInnerPattern,
8927 details: GreenNodeDetails::Node { children: children.into(), width },
8928 }
8929 .intern(db),
8930 )
8931 }
8932}
8933impl<'db> PatternEnumInnerPattern<'db> {
8934 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8935 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8936 }
8937 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8938 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8939 }
8940 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8941 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8942 }
8943}
8944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8945pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8946impl<'db> PatternEnumInnerPatternPtr<'db> {}
8947impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8948 type SyntaxNode = PatternEnumInnerPattern<'db>;
8949 fn untyped(self) -> SyntaxStablePtrId<'db> {
8950 self.0
8951 }
8952 fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8953 PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8954 }
8955}
8956impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8957 fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8958 ptr.untyped()
8959 }
8960}
8961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8962pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8963impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8964 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8965 type StablePtr = PatternEnumInnerPatternPtr<'db>;
8966 type Green = PatternEnumInnerPatternGreen<'db>;
8967 fn missing(db: &'db dyn Database) -> Self::Green {
8968 PatternEnumInnerPatternGreen(
8969 GreenNode {
8970 kind: SyntaxKind::PatternEnumInnerPattern,
8971 details: GreenNodeDetails::Node {
8972 children: [
8973 TerminalLParen::missing(db).0,
8974 Pattern::missing(db).0,
8975 TerminalRParen::missing(db).0,
8976 ]
8977 .into(),
8978 width: TextWidth::default(),
8979 },
8980 }
8981 .intern(db),
8982 )
8983 }
8984 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8985 let kind = node.kind(db);
8986 assert_eq!(
8987 kind,
8988 SyntaxKind::PatternEnumInnerPattern,
8989 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8990 kind,
8991 SyntaxKind::PatternEnumInnerPattern
8992 );
8993 Self { node }
8994 }
8995 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8996 let kind = node.kind(db);
8997 if kind == SyntaxKind::PatternEnumInnerPattern {
8998 Some(Self::from_syntax_node(db, node))
8999 } else {
9000 None
9001 }
9002 }
9003 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9004 self.node
9005 }
9006 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9007 PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
9008 }
9009}
9010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9011pub enum OptionPatternEnumInnerPattern<'db> {
9012 Empty(OptionPatternEnumInnerPatternEmpty<'db>),
9013 PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
9014}
9015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9016pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
9017impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
9018 type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
9019 fn untyped(self) -> SyntaxStablePtrId<'db> {
9020 self.0
9021 }
9022 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9023 OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9024 }
9025}
9026impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
9027 fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
9028 ptr.untyped()
9029 }
9030}
9031impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
9032 for OptionPatternEnumInnerPatternPtr<'db>
9033{
9034 fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9035 Self(value.0)
9036 }
9037}
9038impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
9039 fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
9040 Self(value.0)
9041 }
9042}
9043impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
9044 for OptionPatternEnumInnerPatternGreen<'db>
9045{
9046 fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
9047 Self(value.0)
9048 }
9049}
9050impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
9051 fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
9052 Self(value.0)
9053 }
9054}
9055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9056pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
9057impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
9058 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9059 type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
9060 type Green = OptionPatternEnumInnerPatternGreen<'db>;
9061 fn missing(db: &'db dyn Database) -> Self::Green {
9062 panic!("No missing variant.");
9063 }
9064 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9065 let kind = node.kind(db);
9066 match kind {
9067 SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9068 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9069 ),
9070 SyntaxKind::PatternEnumInnerPattern => {
9071 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9072 PatternEnumInnerPattern::from_syntax_node(db, node),
9073 )
9074 }
9075 _ => panic!(
9076 "Unexpected syntax kind {:?} when constructing {}.",
9077 kind, "OptionPatternEnumInnerPattern"
9078 ),
9079 }
9080 }
9081 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9082 let kind = node.kind(db);
9083 match kind {
9084 SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9085 Some(OptionPatternEnumInnerPattern::Empty(
9086 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9087 ))
9088 }
9089 SyntaxKind::PatternEnumInnerPattern => {
9090 Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9091 PatternEnumInnerPattern::from_syntax_node(db, node),
9092 ))
9093 }
9094 _ => None,
9095 }
9096 }
9097 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9098 match self {
9099 OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9100 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9101 }
9102 }
9103 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9104 OptionPatternEnumInnerPatternPtr(self.as_syntax_node().long(db).stable_ptr)
9105 }
9106}
9107impl<'db> OptionPatternEnumInnerPattern<'db> {
9108 pub fn is_variant(kind: SyntaxKind) -> bool {
9110 matches!(
9111 kind,
9112 SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9113 )
9114 }
9115}
9116#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9117pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9118 node: SyntaxNode<'db>,
9119}
9120impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9121 pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9122 let children = [];
9123 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9124 OptionPatternEnumInnerPatternEmptyGreen(
9125 GreenNode {
9126 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9127 details: GreenNodeDetails::Node { children: children.into(), width },
9128 }
9129 .intern(db),
9130 )
9131 }
9132}
9133impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9135pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9136impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9137impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9138 type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9139 fn untyped(self) -> SyntaxStablePtrId<'db> {
9140 self.0
9141 }
9142 fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9143 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9144 }
9145}
9146impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9147 fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9148 ptr.untyped()
9149 }
9150}
9151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9152pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9153impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9154 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9155 type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9156 type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9157 fn missing(db: &'db dyn Database) -> Self::Green {
9158 OptionPatternEnumInnerPatternEmptyGreen(
9159 GreenNode {
9160 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9161 details: GreenNodeDetails::Node {
9162 children: [].into(),
9163 width: TextWidth::default(),
9164 },
9165 }
9166 .intern(db),
9167 )
9168 }
9169 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9170 let kind = node.kind(db);
9171 assert_eq!(
9172 kind,
9173 SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9174 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9175 kind,
9176 SyntaxKind::OptionPatternEnumInnerPatternEmpty
9177 );
9178 Self { node }
9179 }
9180 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9181 let kind = node.kind(db);
9182 if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9183 Some(Self::from_syntax_node(db, node))
9184 } else {
9185 None
9186 }
9187 }
9188 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9189 self.node
9190 }
9191 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9192 OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9193 }
9194}
9195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9196pub struct TypeClause<'db> {
9197 node: SyntaxNode<'db>,
9198}
9199impl<'db> TypeClause<'db> {
9200 pub const INDEX_COLON: usize = 0;
9201 pub const INDEX_TY: usize = 1;
9202 pub fn new_green(
9203 db: &'db dyn Database,
9204 colon: TerminalColonGreen<'db>,
9205 ty: ExprGreen<'db>,
9206 ) -> TypeClauseGreen<'db> {
9207 let children = [colon.0, ty.0];
9208 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9209 TypeClauseGreen(
9210 GreenNode {
9211 kind: SyntaxKind::TypeClause,
9212 details: GreenNodeDetails::Node { children: children.into(), width },
9213 }
9214 .intern(db),
9215 )
9216 }
9217}
9218impl<'db> TypeClause<'db> {
9219 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9220 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9221 }
9222 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9223 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9224 }
9225}
9226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9227pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9228impl<'db> TypeClausePtr<'db> {}
9229impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9230 type SyntaxNode = TypeClause<'db>;
9231 fn untyped(self) -> SyntaxStablePtrId<'db> {
9232 self.0
9233 }
9234 fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9235 TypeClause::from_syntax_node(db, self.0.lookup(db))
9236 }
9237}
9238impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9239 fn from(ptr: TypeClausePtr<'db>) -> Self {
9240 ptr.untyped()
9241 }
9242}
9243#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9244pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9245impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9246 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9247 type StablePtr = TypeClausePtr<'db>;
9248 type Green = TypeClauseGreen<'db>;
9249 fn missing(db: &'db dyn Database) -> Self::Green {
9250 TypeClauseGreen(
9251 GreenNode {
9252 kind: SyntaxKind::TypeClause,
9253 details: GreenNodeDetails::Node {
9254 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9255 width: TextWidth::default(),
9256 },
9257 }
9258 .intern(db),
9259 )
9260 }
9261 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9262 let kind = node.kind(db);
9263 assert_eq!(
9264 kind,
9265 SyntaxKind::TypeClause,
9266 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9267 kind,
9268 SyntaxKind::TypeClause
9269 );
9270 Self { node }
9271 }
9272 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9273 let kind = node.kind(db);
9274 if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9275 }
9276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9277 self.node
9278 }
9279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9280 TypeClausePtr(self.node.stable_ptr(db))
9281 }
9282}
9283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9284pub enum OptionTypeClause<'db> {
9285 Empty(OptionTypeClauseEmpty<'db>),
9286 TypeClause(TypeClause<'db>),
9287}
9288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9289pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9290impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9291 type SyntaxNode = OptionTypeClause<'db>;
9292 fn untyped(self) -> SyntaxStablePtrId<'db> {
9293 self.0
9294 }
9295 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9296 OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9297 }
9298}
9299impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9300 fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9301 ptr.untyped()
9302 }
9303}
9304impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9305 fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9306 Self(value.0)
9307 }
9308}
9309impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9310 fn from(value: TypeClausePtr<'db>) -> Self {
9311 Self(value.0)
9312 }
9313}
9314impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9315 fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9316 Self(value.0)
9317 }
9318}
9319impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9320 fn from(value: TypeClauseGreen<'db>) -> Self {
9321 Self(value.0)
9322 }
9323}
9324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9325pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9326impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9327 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9328 type StablePtr = OptionTypeClausePtr<'db>;
9329 type Green = OptionTypeClauseGreen<'db>;
9330 fn missing(db: &'db dyn Database) -> Self::Green {
9331 panic!("No missing variant.");
9332 }
9333 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9334 let kind = node.kind(db);
9335 match kind {
9336 SyntaxKind::OptionTypeClauseEmpty => {
9337 OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9338 }
9339 SyntaxKind::TypeClause => {
9340 OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9341 }
9342 _ => panic!(
9343 "Unexpected syntax kind {:?} when constructing {}.",
9344 kind, "OptionTypeClause"
9345 ),
9346 }
9347 }
9348 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9349 let kind = node.kind(db);
9350 match kind {
9351 SyntaxKind::OptionTypeClauseEmpty => {
9352 Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9353 }
9354 SyntaxKind::TypeClause => {
9355 Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9356 }
9357 _ => None,
9358 }
9359 }
9360 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9361 match self {
9362 OptionTypeClause::Empty(x) => x.as_syntax_node(),
9363 OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9364 }
9365 }
9366 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9367 OptionTypeClausePtr(self.as_syntax_node().long(db).stable_ptr)
9368 }
9369}
9370impl<'db> OptionTypeClause<'db> {
9371 pub fn is_variant(kind: SyntaxKind) -> bool {
9373 matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9374 }
9375}
9376#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9377pub struct OptionTypeClauseEmpty<'db> {
9378 node: SyntaxNode<'db>,
9379}
9380impl<'db> OptionTypeClauseEmpty<'db> {
9381 pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9382 let children = [];
9383 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9384 OptionTypeClauseEmptyGreen(
9385 GreenNode {
9386 kind: SyntaxKind::OptionTypeClauseEmpty,
9387 details: GreenNodeDetails::Node { children: children.into(), width },
9388 }
9389 .intern(db),
9390 )
9391 }
9392}
9393impl<'db> OptionTypeClauseEmpty<'db> {}
9394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9395pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9396impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9397impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9398 type SyntaxNode = OptionTypeClauseEmpty<'db>;
9399 fn untyped(self) -> SyntaxStablePtrId<'db> {
9400 self.0
9401 }
9402 fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9403 OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9404 }
9405}
9406impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9407 fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9408 ptr.untyped()
9409 }
9410}
9411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9412pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9413impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9414 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9415 type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9416 type Green = OptionTypeClauseEmptyGreen<'db>;
9417 fn missing(db: &'db dyn Database) -> Self::Green {
9418 OptionTypeClauseEmptyGreen(
9419 GreenNode {
9420 kind: SyntaxKind::OptionTypeClauseEmpty,
9421 details: GreenNodeDetails::Node {
9422 children: [].into(),
9423 width: TextWidth::default(),
9424 },
9425 }
9426 .intern(db),
9427 )
9428 }
9429 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9430 let kind = node.kind(db);
9431 assert_eq!(
9432 kind,
9433 SyntaxKind::OptionTypeClauseEmpty,
9434 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9435 kind,
9436 SyntaxKind::OptionTypeClauseEmpty
9437 );
9438 Self { node }
9439 }
9440 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9441 let kind = node.kind(db);
9442 if kind == SyntaxKind::OptionTypeClauseEmpty {
9443 Some(Self::from_syntax_node(db, node))
9444 } else {
9445 None
9446 }
9447 }
9448 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9449 self.node
9450 }
9451 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9452 OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9453 }
9454}
9455#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9456pub struct ReturnTypeClause<'db> {
9457 node: SyntaxNode<'db>,
9458}
9459impl<'db> ReturnTypeClause<'db> {
9460 pub const INDEX_ARROW: usize = 0;
9461 pub const INDEX_TY: usize = 1;
9462 pub fn new_green(
9463 db: &'db dyn Database,
9464 arrow: TerminalArrowGreen<'db>,
9465 ty: ExprGreen<'db>,
9466 ) -> ReturnTypeClauseGreen<'db> {
9467 let children = [arrow.0, ty.0];
9468 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9469 ReturnTypeClauseGreen(
9470 GreenNode {
9471 kind: SyntaxKind::ReturnTypeClause,
9472 details: GreenNodeDetails::Node { children: children.into(), width },
9473 }
9474 .intern(db),
9475 )
9476 }
9477}
9478impl<'db> ReturnTypeClause<'db> {
9479 pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9480 TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9481 }
9482 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9483 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9484 }
9485}
9486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9487pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9488impl<'db> ReturnTypeClausePtr<'db> {}
9489impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9490 type SyntaxNode = ReturnTypeClause<'db>;
9491 fn untyped(self) -> SyntaxStablePtrId<'db> {
9492 self.0
9493 }
9494 fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9495 ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9496 }
9497}
9498impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9499 fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9500 ptr.untyped()
9501 }
9502}
9503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9504pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9505impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9506 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9507 type StablePtr = ReturnTypeClausePtr<'db>;
9508 type Green = ReturnTypeClauseGreen<'db>;
9509 fn missing(db: &'db dyn Database) -> Self::Green {
9510 ReturnTypeClauseGreen(
9511 GreenNode {
9512 kind: SyntaxKind::ReturnTypeClause,
9513 details: GreenNodeDetails::Node {
9514 children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9515 width: TextWidth::default(),
9516 },
9517 }
9518 .intern(db),
9519 )
9520 }
9521 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9522 let kind = node.kind(db);
9523 assert_eq!(
9524 kind,
9525 SyntaxKind::ReturnTypeClause,
9526 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9527 kind,
9528 SyntaxKind::ReturnTypeClause
9529 );
9530 Self { node }
9531 }
9532 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9533 let kind = node.kind(db);
9534 if kind == SyntaxKind::ReturnTypeClause {
9535 Some(Self::from_syntax_node(db, node))
9536 } else {
9537 None
9538 }
9539 }
9540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9541 self.node
9542 }
9543 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9544 ReturnTypeClausePtr(self.node.stable_ptr(db))
9545 }
9546}
9547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9548pub enum OptionReturnTypeClause<'db> {
9549 Empty(OptionReturnTypeClauseEmpty<'db>),
9550 ReturnTypeClause(ReturnTypeClause<'db>),
9551}
9552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9553pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9554impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9555 type SyntaxNode = OptionReturnTypeClause<'db>;
9556 fn untyped(self) -> SyntaxStablePtrId<'db> {
9557 self.0
9558 }
9559 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9560 OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9561 }
9562}
9563impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9564 fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9565 ptr.untyped()
9566 }
9567}
9568impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9569 fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9570 Self(value.0)
9571 }
9572}
9573impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9574 fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9575 Self(value.0)
9576 }
9577}
9578impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9579 fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9580 Self(value.0)
9581 }
9582}
9583impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9584 fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9585 Self(value.0)
9586 }
9587}
9588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9589pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9590impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9591 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9592 type StablePtr = OptionReturnTypeClausePtr<'db>;
9593 type Green = OptionReturnTypeClauseGreen<'db>;
9594 fn missing(db: &'db dyn Database) -> Self::Green {
9595 panic!("No missing variant.");
9596 }
9597 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9598 let kind = node.kind(db);
9599 match kind {
9600 SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9601 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9602 ),
9603 SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9604 ReturnTypeClause::from_syntax_node(db, node),
9605 ),
9606 _ => panic!(
9607 "Unexpected syntax kind {:?} when constructing {}.",
9608 kind, "OptionReturnTypeClause"
9609 ),
9610 }
9611 }
9612 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9613 let kind = node.kind(db);
9614 match kind {
9615 SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9616 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9617 )),
9618 SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9619 ReturnTypeClause::from_syntax_node(db, node),
9620 )),
9621 _ => None,
9622 }
9623 }
9624 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9625 match self {
9626 OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9627 OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9628 }
9629 }
9630 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9631 OptionReturnTypeClausePtr(self.as_syntax_node().long(db).stable_ptr)
9632 }
9633}
9634impl<'db> OptionReturnTypeClause<'db> {
9635 pub fn is_variant(kind: SyntaxKind) -> bool {
9637 matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9638 }
9639}
9640#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9641pub struct OptionReturnTypeClauseEmpty<'db> {
9642 node: SyntaxNode<'db>,
9643}
9644impl<'db> OptionReturnTypeClauseEmpty<'db> {
9645 pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9646 let children = [];
9647 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9648 OptionReturnTypeClauseEmptyGreen(
9649 GreenNode {
9650 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9651 details: GreenNodeDetails::Node { children: children.into(), width },
9652 }
9653 .intern(db),
9654 )
9655 }
9656}
9657impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9659pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9660impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9661impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9662 type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9663 fn untyped(self) -> SyntaxStablePtrId<'db> {
9664 self.0
9665 }
9666 fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9667 OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9668 }
9669}
9670impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9671 fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9672 ptr.untyped()
9673 }
9674}
9675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9676pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9677impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9678 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9679 type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9680 type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9681 fn missing(db: &'db dyn Database) -> Self::Green {
9682 OptionReturnTypeClauseEmptyGreen(
9683 GreenNode {
9684 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9685 details: GreenNodeDetails::Node {
9686 children: [].into(),
9687 width: TextWidth::default(),
9688 },
9689 }
9690 .intern(db),
9691 )
9692 }
9693 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9694 let kind = node.kind(db);
9695 assert_eq!(
9696 kind,
9697 SyntaxKind::OptionReturnTypeClauseEmpty,
9698 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9699 kind,
9700 SyntaxKind::OptionReturnTypeClauseEmpty
9701 );
9702 Self { node }
9703 }
9704 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9705 let kind = node.kind(db);
9706 if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9707 Some(Self::from_syntax_node(db, node))
9708 } else {
9709 None
9710 }
9711 }
9712 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9713 self.node
9714 }
9715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9716 OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9717 }
9718}
9719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9720pub enum Statement<'db> {
9721 Let(StatementLet<'db>),
9722 Expr(StatementExpr<'db>),
9723 Continue(StatementContinue<'db>),
9724 Return(StatementReturn<'db>),
9725 Break(StatementBreak<'db>),
9726 Item(StatementItem<'db>),
9727 Missing(StatementMissing<'db>),
9728}
9729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9730pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9731impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9732 type SyntaxNode = Statement<'db>;
9733 fn untyped(self) -> SyntaxStablePtrId<'db> {
9734 self.0
9735 }
9736 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9737 Statement::from_syntax_node(db, self.0.lookup(db))
9738 }
9739}
9740impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9741 fn from(ptr: StatementPtr<'db>) -> Self {
9742 ptr.untyped()
9743 }
9744}
9745impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9746 fn from(value: StatementLetPtr<'db>) -> Self {
9747 Self(value.0)
9748 }
9749}
9750impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9751 fn from(value: StatementExprPtr<'db>) -> Self {
9752 Self(value.0)
9753 }
9754}
9755impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9756 fn from(value: StatementContinuePtr<'db>) -> Self {
9757 Self(value.0)
9758 }
9759}
9760impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9761 fn from(value: StatementReturnPtr<'db>) -> Self {
9762 Self(value.0)
9763 }
9764}
9765impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9766 fn from(value: StatementBreakPtr<'db>) -> Self {
9767 Self(value.0)
9768 }
9769}
9770impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9771 fn from(value: StatementItemPtr<'db>) -> Self {
9772 Self(value.0)
9773 }
9774}
9775impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9776 fn from(value: StatementMissingPtr<'db>) -> Self {
9777 Self(value.0)
9778 }
9779}
9780impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9781 fn from(value: StatementLetGreen<'db>) -> Self {
9782 Self(value.0)
9783 }
9784}
9785impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9786 fn from(value: StatementExprGreen<'db>) -> Self {
9787 Self(value.0)
9788 }
9789}
9790impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9791 fn from(value: StatementContinueGreen<'db>) -> Self {
9792 Self(value.0)
9793 }
9794}
9795impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9796 fn from(value: StatementReturnGreen<'db>) -> Self {
9797 Self(value.0)
9798 }
9799}
9800impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9801 fn from(value: StatementBreakGreen<'db>) -> Self {
9802 Self(value.0)
9803 }
9804}
9805impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9806 fn from(value: StatementItemGreen<'db>) -> Self {
9807 Self(value.0)
9808 }
9809}
9810impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9811 fn from(value: StatementMissingGreen<'db>) -> Self {
9812 Self(value.0)
9813 }
9814}
9815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9816pub struct StatementGreen<'db>(pub GreenId<'db>);
9817impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9818 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9819 type StablePtr = StatementPtr<'db>;
9820 type Green = StatementGreen<'db>;
9821 fn missing(db: &'db dyn Database) -> Self::Green {
9822 StatementGreen(StatementMissing::missing(db).0)
9823 }
9824 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9825 let kind = node.kind(db);
9826 match kind {
9827 SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9828 SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9829 SyntaxKind::StatementContinue => {
9830 Statement::Continue(StatementContinue::from_syntax_node(db, node))
9831 }
9832 SyntaxKind::StatementReturn => {
9833 Statement::Return(StatementReturn::from_syntax_node(db, node))
9834 }
9835 SyntaxKind::StatementBreak => {
9836 Statement::Break(StatementBreak::from_syntax_node(db, node))
9837 }
9838 SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9839 SyntaxKind::StatementMissing => {
9840 Statement::Missing(StatementMissing::from_syntax_node(db, node))
9841 }
9842 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9843 }
9844 }
9845 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9846 let kind = node.kind(db);
9847 match kind {
9848 SyntaxKind::StatementLet => {
9849 Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9850 }
9851 SyntaxKind::StatementExpr => {
9852 Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9853 }
9854 SyntaxKind::StatementContinue => {
9855 Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9856 }
9857 SyntaxKind::StatementReturn => {
9858 Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9859 }
9860 SyntaxKind::StatementBreak => {
9861 Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9862 }
9863 SyntaxKind::StatementItem => {
9864 Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9865 }
9866 SyntaxKind::StatementMissing => {
9867 Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9868 }
9869 _ => None,
9870 }
9871 }
9872 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9873 match self {
9874 Statement::Let(x) => x.as_syntax_node(),
9875 Statement::Expr(x) => x.as_syntax_node(),
9876 Statement::Continue(x) => x.as_syntax_node(),
9877 Statement::Return(x) => x.as_syntax_node(),
9878 Statement::Break(x) => x.as_syntax_node(),
9879 Statement::Item(x) => x.as_syntax_node(),
9880 Statement::Missing(x) => x.as_syntax_node(),
9881 }
9882 }
9883 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9884 StatementPtr(self.as_syntax_node().long(db).stable_ptr)
9885 }
9886}
9887impl<'db> Statement<'db> {
9888 pub fn is_variant(kind: SyntaxKind) -> bool {
9890 matches!(
9891 kind,
9892 SyntaxKind::StatementLet
9893 | SyntaxKind::StatementExpr
9894 | SyntaxKind::StatementContinue
9895 | SyntaxKind::StatementReturn
9896 | SyntaxKind::StatementBreak
9897 | SyntaxKind::StatementItem
9898 | SyntaxKind::StatementMissing
9899 )
9900 }
9901}
9902#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9903pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9904impl<'db> Deref for StatementList<'db> {
9905 type Target = ElementList<'db, Statement<'db>, 1>;
9906 fn deref(&self) -> &Self::Target {
9907 &self.0
9908 }
9909}
9910impl<'db> StatementList<'db> {
9911 pub fn new_green(
9912 db: &'db dyn Database,
9913 children: &[StatementGreen<'db>],
9914 ) -> StatementListGreen<'db> {
9915 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9916 StatementListGreen(
9917 GreenNode {
9918 kind: SyntaxKind::StatementList,
9919 details: GreenNodeDetails::Node {
9920 children: children.iter().map(|x| x.0).collect(),
9921 width,
9922 },
9923 }
9924 .intern(db),
9925 )
9926 }
9927}
9928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9929pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9930impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9931 type SyntaxNode = StatementList<'db>;
9932 fn untyped(self) -> SyntaxStablePtrId<'db> {
9933 self.0
9934 }
9935 fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9936 StatementList::from_syntax_node(db, self.0.lookup(db))
9937 }
9938}
9939impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9940 fn from(ptr: StatementListPtr<'db>) -> Self {
9941 ptr.untyped()
9942 }
9943}
9944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9945pub struct StatementListGreen<'db>(pub GreenId<'db>);
9946impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9947 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9948 type StablePtr = StatementListPtr<'db>;
9949 type Green = StatementListGreen<'db>;
9950 fn missing(db: &'db dyn Database) -> Self::Green {
9951 StatementListGreen(
9952 GreenNode {
9953 kind: SyntaxKind::StatementList,
9954 details: GreenNodeDetails::Node {
9955 children: [].into(),
9956 width: TextWidth::default(),
9957 },
9958 }
9959 .intern(db),
9960 )
9961 }
9962 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9963 Self(ElementList::new(node))
9964 }
9965 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9966 if node.kind(db) == SyntaxKind::StatementList {
9967 Some(Self(ElementList::new(node)))
9968 } else {
9969 None
9970 }
9971 }
9972 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9973 self.node
9974 }
9975 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9976 StatementListPtr(self.node.stable_ptr(db))
9977 }
9978}
9979#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9980pub struct StatementMissing<'db> {
9981 node: SyntaxNode<'db>,
9982}
9983impl<'db> StatementMissing<'db> {
9984 pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9985 let children = [];
9986 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9987 StatementMissingGreen(
9988 GreenNode {
9989 kind: SyntaxKind::StatementMissing,
9990 details: GreenNodeDetails::Node { children: children.into(), width },
9991 }
9992 .intern(db),
9993 )
9994 }
9995}
9996impl<'db> StatementMissing<'db> {}
9997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9998pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9999impl<'db> StatementMissingPtr<'db> {}
10000impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
10001 type SyntaxNode = StatementMissing<'db>;
10002 fn untyped(self) -> SyntaxStablePtrId<'db> {
10003 self.0
10004 }
10005 fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
10006 StatementMissing::from_syntax_node(db, self.0.lookup(db))
10007 }
10008}
10009impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
10010 fn from(ptr: StatementMissingPtr<'db>) -> Self {
10011 ptr.untyped()
10012 }
10013}
10014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10015pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
10016impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
10017 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10018 type StablePtr = StatementMissingPtr<'db>;
10019 type Green = StatementMissingGreen<'db>;
10020 fn missing(db: &'db dyn Database) -> Self::Green {
10021 StatementMissingGreen(
10022 GreenNode {
10023 kind: SyntaxKind::StatementMissing,
10024 details: GreenNodeDetails::Node {
10025 children: [].into(),
10026 width: TextWidth::default(),
10027 },
10028 }
10029 .intern(db),
10030 )
10031 }
10032 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10033 let kind = node.kind(db);
10034 assert_eq!(
10035 kind,
10036 SyntaxKind::StatementMissing,
10037 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10038 kind,
10039 SyntaxKind::StatementMissing
10040 );
10041 Self { node }
10042 }
10043 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10044 let kind = node.kind(db);
10045 if kind == SyntaxKind::StatementMissing {
10046 Some(Self::from_syntax_node(db, node))
10047 } else {
10048 None
10049 }
10050 }
10051 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10052 self.node
10053 }
10054 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10055 StatementMissingPtr(self.node.stable_ptr(db))
10056 }
10057}
10058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10059pub struct StatementLet<'db> {
10060 node: SyntaxNode<'db>,
10061}
10062impl<'db> StatementLet<'db> {
10063 pub const INDEX_ATTRIBUTES: usize = 0;
10064 pub const INDEX_LET_KW: usize = 1;
10065 pub const INDEX_PATTERN: usize = 2;
10066 pub const INDEX_TYPE_CLAUSE: usize = 3;
10067 pub const INDEX_EQ: usize = 4;
10068 pub const INDEX_RHS: usize = 5;
10069 pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
10070 pub const INDEX_SEMICOLON: usize = 7;
10071 pub fn new_green(
10072 db: &'db dyn Database,
10073 attributes: AttributeListGreen<'db>,
10074 let_kw: TerminalLetGreen<'db>,
10075 pattern: PatternGreen<'db>,
10076 type_clause: OptionTypeClauseGreen<'db>,
10077 eq: TerminalEqGreen<'db>,
10078 rhs: ExprGreen<'db>,
10079 let_else_clause: OptionLetElseClauseGreen<'db>,
10080 semicolon: TerminalSemicolonGreen<'db>,
10081 ) -> StatementLetGreen<'db> {
10082 let children = [
10083 attributes.0,
10084 let_kw.0,
10085 pattern.0,
10086 type_clause.0,
10087 eq.0,
10088 rhs.0,
10089 let_else_clause.0,
10090 semicolon.0,
10091 ];
10092 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10093 StatementLetGreen(
10094 GreenNode {
10095 kind: SyntaxKind::StatementLet,
10096 details: GreenNodeDetails::Node { children: children.into(), width },
10097 }
10098 .intern(db),
10099 )
10100 }
10101}
10102impl<'db> StatementLet<'db> {
10103 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10104 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10105 }
10106 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10107 TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10108 }
10109 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10110 Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10111 }
10112 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10113 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10114 }
10115 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10116 TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10117 }
10118 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10119 Expr::from_syntax_node(db, self.node.get_children(db)[5])
10120 }
10121 pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10122 OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10123 }
10124 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10125 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10126 }
10127}
10128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10129pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10130impl<'db> StatementLetPtr<'db> {
10131 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10132 let ptr = self.0.long(db);
10133 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
10134 PatternGreen(key_fields[0])
10135 } else {
10136 panic!("Unexpected key field query on root.");
10137 }
10138 }
10139}
10140impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10141 type SyntaxNode = StatementLet<'db>;
10142 fn untyped(self) -> SyntaxStablePtrId<'db> {
10143 self.0
10144 }
10145 fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10146 StatementLet::from_syntax_node(db, self.0.lookup(db))
10147 }
10148}
10149impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10150 fn from(ptr: StatementLetPtr<'db>) -> Self {
10151 ptr.untyped()
10152 }
10153}
10154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10155pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10156impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10157 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10158 type StablePtr = StatementLetPtr<'db>;
10159 type Green = StatementLetGreen<'db>;
10160 fn missing(db: &'db dyn Database) -> Self::Green {
10161 StatementLetGreen(
10162 GreenNode {
10163 kind: SyntaxKind::StatementLet,
10164 details: GreenNodeDetails::Node {
10165 children: [
10166 AttributeList::missing(db).0,
10167 TerminalLet::missing(db).0,
10168 Pattern::missing(db).0,
10169 OptionTypeClause::missing(db).0,
10170 TerminalEq::missing(db).0,
10171 Expr::missing(db).0,
10172 OptionLetElseClause::missing(db).0,
10173 TerminalSemicolon::missing(db).0,
10174 ]
10175 .into(),
10176 width: TextWidth::default(),
10177 },
10178 }
10179 .intern(db),
10180 )
10181 }
10182 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10183 let kind = node.kind(db);
10184 assert_eq!(
10185 kind,
10186 SyntaxKind::StatementLet,
10187 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10188 kind,
10189 SyntaxKind::StatementLet
10190 );
10191 Self { node }
10192 }
10193 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10194 let kind = node.kind(db);
10195 if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10196 }
10197 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10198 self.node
10199 }
10200 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10201 StatementLetPtr(self.node.stable_ptr(db))
10202 }
10203}
10204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10205pub struct LetElseClause<'db> {
10206 node: SyntaxNode<'db>,
10207}
10208impl<'db> LetElseClause<'db> {
10209 pub const INDEX_ELSE_KW: usize = 0;
10210 pub const INDEX_ELSE_BLOCK: usize = 1;
10211 pub fn new_green(
10212 db: &'db dyn Database,
10213 else_kw: TerminalElseGreen<'db>,
10214 else_block: ExprBlockGreen<'db>,
10215 ) -> LetElseClauseGreen<'db> {
10216 let children = [else_kw.0, else_block.0];
10217 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10218 LetElseClauseGreen(
10219 GreenNode {
10220 kind: SyntaxKind::LetElseClause,
10221 details: GreenNodeDetails::Node { children: children.into(), width },
10222 }
10223 .intern(db),
10224 )
10225 }
10226}
10227impl<'db> LetElseClause<'db> {
10228 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10229 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10230 }
10231 pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10232 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10233 }
10234}
10235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10236pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10237impl<'db> LetElseClausePtr<'db> {}
10238impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10239 type SyntaxNode = LetElseClause<'db>;
10240 fn untyped(self) -> SyntaxStablePtrId<'db> {
10241 self.0
10242 }
10243 fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10244 LetElseClause::from_syntax_node(db, self.0.lookup(db))
10245 }
10246}
10247impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10248 fn from(ptr: LetElseClausePtr<'db>) -> Self {
10249 ptr.untyped()
10250 }
10251}
10252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10253pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10254impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10255 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10256 type StablePtr = LetElseClausePtr<'db>;
10257 type Green = LetElseClauseGreen<'db>;
10258 fn missing(db: &'db dyn Database) -> Self::Green {
10259 LetElseClauseGreen(
10260 GreenNode {
10261 kind: SyntaxKind::LetElseClause,
10262 details: GreenNodeDetails::Node {
10263 children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10264 width: TextWidth::default(),
10265 },
10266 }
10267 .intern(db),
10268 )
10269 }
10270 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10271 let kind = node.kind(db);
10272 assert_eq!(
10273 kind,
10274 SyntaxKind::LetElseClause,
10275 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10276 kind,
10277 SyntaxKind::LetElseClause
10278 );
10279 Self { node }
10280 }
10281 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10282 let kind = node.kind(db);
10283 if kind == SyntaxKind::LetElseClause {
10284 Some(Self::from_syntax_node(db, node))
10285 } else {
10286 None
10287 }
10288 }
10289 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10290 self.node
10291 }
10292 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10293 LetElseClausePtr(self.node.stable_ptr(db))
10294 }
10295}
10296#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10297pub enum OptionLetElseClause<'db> {
10298 Empty(OptionLetElseClauseEmpty<'db>),
10299 LetElseClause(LetElseClause<'db>),
10300}
10301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10302pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10303impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10304 type SyntaxNode = OptionLetElseClause<'db>;
10305 fn untyped(self) -> SyntaxStablePtrId<'db> {
10306 self.0
10307 }
10308 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10309 OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10310 }
10311}
10312impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10313 fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10314 ptr.untyped()
10315 }
10316}
10317impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10318 fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10319 Self(value.0)
10320 }
10321}
10322impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10323 fn from(value: LetElseClausePtr<'db>) -> Self {
10324 Self(value.0)
10325 }
10326}
10327impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10328 fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10329 Self(value.0)
10330 }
10331}
10332impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10333 fn from(value: LetElseClauseGreen<'db>) -> Self {
10334 Self(value.0)
10335 }
10336}
10337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10338pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10339impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10340 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10341 type StablePtr = OptionLetElseClausePtr<'db>;
10342 type Green = OptionLetElseClauseGreen<'db>;
10343 fn missing(db: &'db dyn Database) -> Self::Green {
10344 panic!("No missing variant.");
10345 }
10346 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10347 let kind = node.kind(db);
10348 match kind {
10349 SyntaxKind::OptionLetElseClauseEmpty => {
10350 OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10351 }
10352 SyntaxKind::LetElseClause => {
10353 OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10354 }
10355 _ => panic!(
10356 "Unexpected syntax kind {:?} when constructing {}.",
10357 kind, "OptionLetElseClause"
10358 ),
10359 }
10360 }
10361 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10362 let kind = node.kind(db);
10363 match kind {
10364 SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10365 OptionLetElseClauseEmpty::from_syntax_node(db, node),
10366 )),
10367 SyntaxKind::LetElseClause => {
10368 Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10369 }
10370 _ => None,
10371 }
10372 }
10373 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10374 match self {
10375 OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10376 OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10377 }
10378 }
10379 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10380 OptionLetElseClausePtr(self.as_syntax_node().long(db).stable_ptr)
10381 }
10382}
10383impl<'db> OptionLetElseClause<'db> {
10384 pub fn is_variant(kind: SyntaxKind) -> bool {
10386 matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10387 }
10388}
10389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10390pub struct OptionLetElseClauseEmpty<'db> {
10391 node: SyntaxNode<'db>,
10392}
10393impl<'db> OptionLetElseClauseEmpty<'db> {
10394 pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10395 let children = [];
10396 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10397 OptionLetElseClauseEmptyGreen(
10398 GreenNode {
10399 kind: SyntaxKind::OptionLetElseClauseEmpty,
10400 details: GreenNodeDetails::Node { children: children.into(), width },
10401 }
10402 .intern(db),
10403 )
10404 }
10405}
10406impl<'db> OptionLetElseClauseEmpty<'db> {}
10407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10408pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10409impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10410impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10411 type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10412 fn untyped(self) -> SyntaxStablePtrId<'db> {
10413 self.0
10414 }
10415 fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10416 OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10417 }
10418}
10419impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10420 fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10421 ptr.untyped()
10422 }
10423}
10424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10425pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10426impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10427 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10428 type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10429 type Green = OptionLetElseClauseEmptyGreen<'db>;
10430 fn missing(db: &'db dyn Database) -> Self::Green {
10431 OptionLetElseClauseEmptyGreen(
10432 GreenNode {
10433 kind: SyntaxKind::OptionLetElseClauseEmpty,
10434 details: GreenNodeDetails::Node {
10435 children: [].into(),
10436 width: TextWidth::default(),
10437 },
10438 }
10439 .intern(db),
10440 )
10441 }
10442 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10443 let kind = node.kind(db);
10444 assert_eq!(
10445 kind,
10446 SyntaxKind::OptionLetElseClauseEmpty,
10447 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10448 kind,
10449 SyntaxKind::OptionLetElseClauseEmpty
10450 );
10451 Self { node }
10452 }
10453 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10454 let kind = node.kind(db);
10455 if kind == SyntaxKind::OptionLetElseClauseEmpty {
10456 Some(Self::from_syntax_node(db, node))
10457 } else {
10458 None
10459 }
10460 }
10461 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10462 self.node
10463 }
10464 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10465 OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10466 }
10467}
10468#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10469pub enum OptionTerminalSemicolon<'db> {
10470 Empty(OptionTerminalSemicolonEmpty<'db>),
10471 TerminalSemicolon(TerminalSemicolon<'db>),
10472}
10473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10474pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10475impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10476 type SyntaxNode = OptionTerminalSemicolon<'db>;
10477 fn untyped(self) -> SyntaxStablePtrId<'db> {
10478 self.0
10479 }
10480 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10481 OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10482 }
10483}
10484impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10485 fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10486 ptr.untyped()
10487 }
10488}
10489impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10490 fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10491 Self(value.0)
10492 }
10493}
10494impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10495 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10496 Self(value.0)
10497 }
10498}
10499impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10500 fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10501 Self(value.0)
10502 }
10503}
10504impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10505 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10506 Self(value.0)
10507 }
10508}
10509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10510pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10511impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10512 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10513 type StablePtr = OptionTerminalSemicolonPtr<'db>;
10514 type Green = OptionTerminalSemicolonGreen<'db>;
10515 fn missing(db: &'db dyn Database) -> Self::Green {
10516 panic!("No missing variant.");
10517 }
10518 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10519 let kind = node.kind(db);
10520 match kind {
10521 SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10522 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10523 ),
10524 SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10525 TerminalSemicolon::from_syntax_node(db, node),
10526 ),
10527 _ => panic!(
10528 "Unexpected syntax kind {:?} when constructing {}.",
10529 kind, "OptionTerminalSemicolon"
10530 ),
10531 }
10532 }
10533 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10534 let kind = node.kind(db);
10535 match kind {
10536 SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10537 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10538 )),
10539 SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10540 TerminalSemicolon::from_syntax_node(db, node),
10541 )),
10542 _ => None,
10543 }
10544 }
10545 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10546 match self {
10547 OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10548 OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10549 }
10550 }
10551 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10552 OptionTerminalSemicolonPtr(self.as_syntax_node().long(db).stable_ptr)
10553 }
10554}
10555impl<'db> OptionTerminalSemicolon<'db> {
10556 pub fn is_variant(kind: SyntaxKind) -> bool {
10558 matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10559 }
10560}
10561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10562pub struct OptionTerminalSemicolonEmpty<'db> {
10563 node: SyntaxNode<'db>,
10564}
10565impl<'db> OptionTerminalSemicolonEmpty<'db> {
10566 pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10567 let children = [];
10568 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10569 OptionTerminalSemicolonEmptyGreen(
10570 GreenNode {
10571 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10572 details: GreenNodeDetails::Node { children: children.into(), width },
10573 }
10574 .intern(db),
10575 )
10576 }
10577}
10578impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10580pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10581impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10582impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10583 type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10584 fn untyped(self) -> SyntaxStablePtrId<'db> {
10585 self.0
10586 }
10587 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10588 OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10589 }
10590}
10591impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10592 fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10593 ptr.untyped()
10594 }
10595}
10596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10597pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10598impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10599 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10600 type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10601 type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10602 fn missing(db: &'db dyn Database) -> Self::Green {
10603 OptionTerminalSemicolonEmptyGreen(
10604 GreenNode {
10605 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10606 details: GreenNodeDetails::Node {
10607 children: [].into(),
10608 width: TextWidth::default(),
10609 },
10610 }
10611 .intern(db),
10612 )
10613 }
10614 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10615 let kind = node.kind(db);
10616 assert_eq!(
10617 kind,
10618 SyntaxKind::OptionTerminalSemicolonEmpty,
10619 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10620 kind,
10621 SyntaxKind::OptionTerminalSemicolonEmpty
10622 );
10623 Self { node }
10624 }
10625 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10626 let kind = node.kind(db);
10627 if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10628 Some(Self::from_syntax_node(db, node))
10629 } else {
10630 None
10631 }
10632 }
10633 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10634 self.node
10635 }
10636 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10637 OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10638 }
10639}
10640#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10641pub struct StatementExpr<'db> {
10642 node: SyntaxNode<'db>,
10643}
10644impl<'db> StatementExpr<'db> {
10645 pub const INDEX_ATTRIBUTES: usize = 0;
10646 pub const INDEX_EXPR: usize = 1;
10647 pub const INDEX_SEMICOLON: usize = 2;
10648 pub fn new_green(
10649 db: &'db dyn Database,
10650 attributes: AttributeListGreen<'db>,
10651 expr: ExprGreen<'db>,
10652 semicolon: OptionTerminalSemicolonGreen<'db>,
10653 ) -> StatementExprGreen<'db> {
10654 let children = [attributes.0, expr.0, semicolon.0];
10655 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10656 StatementExprGreen(
10657 GreenNode {
10658 kind: SyntaxKind::StatementExpr,
10659 details: GreenNodeDetails::Node { children: children.into(), width },
10660 }
10661 .intern(db),
10662 )
10663 }
10664}
10665impl<'db> StatementExpr<'db> {
10666 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10667 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10668 }
10669 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10670 Expr::from_syntax_node(db, self.node.get_children(db)[1])
10671 }
10672 pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10673 OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10674 }
10675}
10676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10677pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10678impl<'db> StatementExprPtr<'db> {}
10679impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10680 type SyntaxNode = StatementExpr<'db>;
10681 fn untyped(self) -> SyntaxStablePtrId<'db> {
10682 self.0
10683 }
10684 fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10685 StatementExpr::from_syntax_node(db, self.0.lookup(db))
10686 }
10687}
10688impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10689 fn from(ptr: StatementExprPtr<'db>) -> Self {
10690 ptr.untyped()
10691 }
10692}
10693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10694pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10695impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10696 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10697 type StablePtr = StatementExprPtr<'db>;
10698 type Green = StatementExprGreen<'db>;
10699 fn missing(db: &'db dyn Database) -> Self::Green {
10700 StatementExprGreen(
10701 GreenNode {
10702 kind: SyntaxKind::StatementExpr,
10703 details: GreenNodeDetails::Node {
10704 children: [
10705 AttributeList::missing(db).0,
10706 Expr::missing(db).0,
10707 OptionTerminalSemicolon::missing(db).0,
10708 ]
10709 .into(),
10710 width: TextWidth::default(),
10711 },
10712 }
10713 .intern(db),
10714 )
10715 }
10716 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10717 let kind = node.kind(db);
10718 assert_eq!(
10719 kind,
10720 SyntaxKind::StatementExpr,
10721 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10722 kind,
10723 SyntaxKind::StatementExpr
10724 );
10725 Self { node }
10726 }
10727 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10728 let kind = node.kind(db);
10729 if kind == SyntaxKind::StatementExpr {
10730 Some(Self::from_syntax_node(db, node))
10731 } else {
10732 None
10733 }
10734 }
10735 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10736 self.node
10737 }
10738 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10739 StatementExprPtr(self.node.stable_ptr(db))
10740 }
10741}
10742#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10743pub struct StatementContinue<'db> {
10744 node: SyntaxNode<'db>,
10745}
10746impl<'db> StatementContinue<'db> {
10747 pub const INDEX_ATTRIBUTES: usize = 0;
10748 pub const INDEX_CONTINUE_KW: usize = 1;
10749 pub const INDEX_SEMICOLON: usize = 2;
10750 pub fn new_green(
10751 db: &'db dyn Database,
10752 attributes: AttributeListGreen<'db>,
10753 continue_kw: TerminalContinueGreen<'db>,
10754 semicolon: TerminalSemicolonGreen<'db>,
10755 ) -> StatementContinueGreen<'db> {
10756 let children = [attributes.0, continue_kw.0, semicolon.0];
10757 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10758 StatementContinueGreen(
10759 GreenNode {
10760 kind: SyntaxKind::StatementContinue,
10761 details: GreenNodeDetails::Node { children: children.into(), width },
10762 }
10763 .intern(db),
10764 )
10765 }
10766}
10767impl<'db> StatementContinue<'db> {
10768 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10769 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10770 }
10771 pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10772 TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10773 }
10774 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10775 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10776 }
10777}
10778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10779pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10780impl<'db> StatementContinuePtr<'db> {}
10781impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10782 type SyntaxNode = StatementContinue<'db>;
10783 fn untyped(self) -> SyntaxStablePtrId<'db> {
10784 self.0
10785 }
10786 fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10787 StatementContinue::from_syntax_node(db, self.0.lookup(db))
10788 }
10789}
10790impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10791 fn from(ptr: StatementContinuePtr<'db>) -> Self {
10792 ptr.untyped()
10793 }
10794}
10795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10796pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10797impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10798 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10799 type StablePtr = StatementContinuePtr<'db>;
10800 type Green = StatementContinueGreen<'db>;
10801 fn missing(db: &'db dyn Database) -> Self::Green {
10802 StatementContinueGreen(
10803 GreenNode {
10804 kind: SyntaxKind::StatementContinue,
10805 details: GreenNodeDetails::Node {
10806 children: [
10807 AttributeList::missing(db).0,
10808 TerminalContinue::missing(db).0,
10809 TerminalSemicolon::missing(db).0,
10810 ]
10811 .into(),
10812 width: TextWidth::default(),
10813 },
10814 }
10815 .intern(db),
10816 )
10817 }
10818 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10819 let kind = node.kind(db);
10820 assert_eq!(
10821 kind,
10822 SyntaxKind::StatementContinue,
10823 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10824 kind,
10825 SyntaxKind::StatementContinue
10826 );
10827 Self { node }
10828 }
10829 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10830 let kind = node.kind(db);
10831 if kind == SyntaxKind::StatementContinue {
10832 Some(Self::from_syntax_node(db, node))
10833 } else {
10834 None
10835 }
10836 }
10837 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10838 self.node
10839 }
10840 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10841 StatementContinuePtr(self.node.stable_ptr(db))
10842 }
10843}
10844#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10845pub struct ExprClause<'db> {
10846 node: SyntaxNode<'db>,
10847}
10848impl<'db> ExprClause<'db> {
10849 pub const INDEX_EXPR: usize = 0;
10850 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10851 let children = [expr.0];
10852 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10853 ExprClauseGreen(
10854 GreenNode {
10855 kind: SyntaxKind::ExprClause,
10856 details: GreenNodeDetails::Node { children: children.into(), width },
10857 }
10858 .intern(db),
10859 )
10860 }
10861}
10862impl<'db> ExprClause<'db> {
10863 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10864 Expr::from_syntax_node(db, self.node.get_children(db)[0])
10865 }
10866}
10867#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10868pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10869impl<'db> ExprClausePtr<'db> {}
10870impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10871 type SyntaxNode = ExprClause<'db>;
10872 fn untyped(self) -> SyntaxStablePtrId<'db> {
10873 self.0
10874 }
10875 fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10876 ExprClause::from_syntax_node(db, self.0.lookup(db))
10877 }
10878}
10879impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10880 fn from(ptr: ExprClausePtr<'db>) -> Self {
10881 ptr.untyped()
10882 }
10883}
10884#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10885pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10886impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10887 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10888 type StablePtr = ExprClausePtr<'db>;
10889 type Green = ExprClauseGreen<'db>;
10890 fn missing(db: &'db dyn Database) -> Self::Green {
10891 ExprClauseGreen(
10892 GreenNode {
10893 kind: SyntaxKind::ExprClause,
10894 details: GreenNodeDetails::Node {
10895 children: [Expr::missing(db).0].into(),
10896 width: TextWidth::default(),
10897 },
10898 }
10899 .intern(db),
10900 )
10901 }
10902 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10903 let kind = node.kind(db);
10904 assert_eq!(
10905 kind,
10906 SyntaxKind::ExprClause,
10907 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10908 kind,
10909 SyntaxKind::ExprClause
10910 );
10911 Self { node }
10912 }
10913 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10914 let kind = node.kind(db);
10915 if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10916 }
10917 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10918 self.node
10919 }
10920 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10921 ExprClausePtr(self.node.stable_ptr(db))
10922 }
10923}
10924#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10925pub enum OptionExprClause<'db> {
10926 Empty(OptionExprClauseEmpty<'db>),
10927 ExprClause(ExprClause<'db>),
10928}
10929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10930pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10931impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10932 type SyntaxNode = OptionExprClause<'db>;
10933 fn untyped(self) -> SyntaxStablePtrId<'db> {
10934 self.0
10935 }
10936 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10937 OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10938 }
10939}
10940impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10941 fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10942 ptr.untyped()
10943 }
10944}
10945impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10946 fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10947 Self(value.0)
10948 }
10949}
10950impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10951 fn from(value: ExprClausePtr<'db>) -> Self {
10952 Self(value.0)
10953 }
10954}
10955impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10956 fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10957 Self(value.0)
10958 }
10959}
10960impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10961 fn from(value: ExprClauseGreen<'db>) -> Self {
10962 Self(value.0)
10963 }
10964}
10965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10966pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10967impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10968 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10969 type StablePtr = OptionExprClausePtr<'db>;
10970 type Green = OptionExprClauseGreen<'db>;
10971 fn missing(db: &'db dyn Database) -> Self::Green {
10972 panic!("No missing variant.");
10973 }
10974 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10975 let kind = node.kind(db);
10976 match kind {
10977 SyntaxKind::OptionExprClauseEmpty => {
10978 OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10979 }
10980 SyntaxKind::ExprClause => {
10981 OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10982 }
10983 _ => panic!(
10984 "Unexpected syntax kind {:?} when constructing {}.",
10985 kind, "OptionExprClause"
10986 ),
10987 }
10988 }
10989 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10990 let kind = node.kind(db);
10991 match kind {
10992 SyntaxKind::OptionExprClauseEmpty => {
10993 Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10994 }
10995 SyntaxKind::ExprClause => {
10996 Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10997 }
10998 _ => None,
10999 }
11000 }
11001 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11002 match self {
11003 OptionExprClause::Empty(x) => x.as_syntax_node(),
11004 OptionExprClause::ExprClause(x) => x.as_syntax_node(),
11005 }
11006 }
11007 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11008 OptionExprClausePtr(self.as_syntax_node().long(db).stable_ptr)
11009 }
11010}
11011impl<'db> OptionExprClause<'db> {
11012 pub fn is_variant(kind: SyntaxKind) -> bool {
11014 matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
11015 }
11016}
11017#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11018pub struct OptionExprClauseEmpty<'db> {
11019 node: SyntaxNode<'db>,
11020}
11021impl<'db> OptionExprClauseEmpty<'db> {
11022 pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
11023 let children = [];
11024 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11025 OptionExprClauseEmptyGreen(
11026 GreenNode {
11027 kind: SyntaxKind::OptionExprClauseEmpty,
11028 details: GreenNodeDetails::Node { children: children.into(), width },
11029 }
11030 .intern(db),
11031 )
11032 }
11033}
11034impl<'db> OptionExprClauseEmpty<'db> {}
11035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11036pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11037impl<'db> OptionExprClauseEmptyPtr<'db> {}
11038impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
11039 type SyntaxNode = OptionExprClauseEmpty<'db>;
11040 fn untyped(self) -> SyntaxStablePtrId<'db> {
11041 self.0
11042 }
11043 fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
11044 OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11045 }
11046}
11047impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
11048 fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
11049 ptr.untyped()
11050 }
11051}
11052#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11053pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
11054impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
11055 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11056 type StablePtr = OptionExprClauseEmptyPtr<'db>;
11057 type Green = OptionExprClauseEmptyGreen<'db>;
11058 fn missing(db: &'db dyn Database) -> Self::Green {
11059 OptionExprClauseEmptyGreen(
11060 GreenNode {
11061 kind: SyntaxKind::OptionExprClauseEmpty,
11062 details: GreenNodeDetails::Node {
11063 children: [].into(),
11064 width: TextWidth::default(),
11065 },
11066 }
11067 .intern(db),
11068 )
11069 }
11070 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11071 let kind = node.kind(db);
11072 assert_eq!(
11073 kind,
11074 SyntaxKind::OptionExprClauseEmpty,
11075 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11076 kind,
11077 SyntaxKind::OptionExprClauseEmpty
11078 );
11079 Self { node }
11080 }
11081 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11082 let kind = node.kind(db);
11083 if kind == SyntaxKind::OptionExprClauseEmpty {
11084 Some(Self::from_syntax_node(db, node))
11085 } else {
11086 None
11087 }
11088 }
11089 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11090 self.node
11091 }
11092 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11093 OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11094 }
11095}
11096#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11097pub struct StatementReturn<'db> {
11098 node: SyntaxNode<'db>,
11099}
11100impl<'db> StatementReturn<'db> {
11101 pub const INDEX_ATTRIBUTES: usize = 0;
11102 pub const INDEX_RETURN_KW: usize = 1;
11103 pub const INDEX_EXPR_CLAUSE: usize = 2;
11104 pub const INDEX_SEMICOLON: usize = 3;
11105 pub fn new_green(
11106 db: &'db dyn Database,
11107 attributes: AttributeListGreen<'db>,
11108 return_kw: TerminalReturnGreen<'db>,
11109 expr_clause: OptionExprClauseGreen<'db>,
11110 semicolon: TerminalSemicolonGreen<'db>,
11111 ) -> StatementReturnGreen<'db> {
11112 let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11113 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11114 StatementReturnGreen(
11115 GreenNode {
11116 kind: SyntaxKind::StatementReturn,
11117 details: GreenNodeDetails::Node { children: children.into(), width },
11118 }
11119 .intern(db),
11120 )
11121 }
11122}
11123impl<'db> StatementReturn<'db> {
11124 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11125 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11126 }
11127 pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11128 TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11129 }
11130 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11131 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11132 }
11133 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11134 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11135 }
11136}
11137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11138pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11139impl<'db> StatementReturnPtr<'db> {}
11140impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11141 type SyntaxNode = StatementReturn<'db>;
11142 fn untyped(self) -> SyntaxStablePtrId<'db> {
11143 self.0
11144 }
11145 fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11146 StatementReturn::from_syntax_node(db, self.0.lookup(db))
11147 }
11148}
11149impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11150 fn from(ptr: StatementReturnPtr<'db>) -> Self {
11151 ptr.untyped()
11152 }
11153}
11154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11155pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11156impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11157 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11158 type StablePtr = StatementReturnPtr<'db>;
11159 type Green = StatementReturnGreen<'db>;
11160 fn missing(db: &'db dyn Database) -> Self::Green {
11161 StatementReturnGreen(
11162 GreenNode {
11163 kind: SyntaxKind::StatementReturn,
11164 details: GreenNodeDetails::Node {
11165 children: [
11166 AttributeList::missing(db).0,
11167 TerminalReturn::missing(db).0,
11168 OptionExprClause::missing(db).0,
11169 TerminalSemicolon::missing(db).0,
11170 ]
11171 .into(),
11172 width: TextWidth::default(),
11173 },
11174 }
11175 .intern(db),
11176 )
11177 }
11178 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11179 let kind = node.kind(db);
11180 assert_eq!(
11181 kind,
11182 SyntaxKind::StatementReturn,
11183 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11184 kind,
11185 SyntaxKind::StatementReturn
11186 );
11187 Self { node }
11188 }
11189 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11190 let kind = node.kind(db);
11191 if kind == SyntaxKind::StatementReturn {
11192 Some(Self::from_syntax_node(db, node))
11193 } else {
11194 None
11195 }
11196 }
11197 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11198 self.node
11199 }
11200 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11201 StatementReturnPtr(self.node.stable_ptr(db))
11202 }
11203}
11204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11205pub struct StatementBreak<'db> {
11206 node: SyntaxNode<'db>,
11207}
11208impl<'db> StatementBreak<'db> {
11209 pub const INDEX_ATTRIBUTES: usize = 0;
11210 pub const INDEX_BREAK_KW: usize = 1;
11211 pub const INDEX_EXPR_CLAUSE: usize = 2;
11212 pub const INDEX_SEMICOLON: usize = 3;
11213 pub fn new_green(
11214 db: &'db dyn Database,
11215 attributes: AttributeListGreen<'db>,
11216 break_kw: TerminalBreakGreen<'db>,
11217 expr_clause: OptionExprClauseGreen<'db>,
11218 semicolon: TerminalSemicolonGreen<'db>,
11219 ) -> StatementBreakGreen<'db> {
11220 let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11221 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11222 StatementBreakGreen(
11223 GreenNode {
11224 kind: SyntaxKind::StatementBreak,
11225 details: GreenNodeDetails::Node { children: children.into(), width },
11226 }
11227 .intern(db),
11228 )
11229 }
11230}
11231impl<'db> StatementBreak<'db> {
11232 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11233 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11234 }
11235 pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11236 TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11237 }
11238 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11239 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11240 }
11241 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11242 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11243 }
11244}
11245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11246pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11247impl<'db> StatementBreakPtr<'db> {}
11248impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11249 type SyntaxNode = StatementBreak<'db>;
11250 fn untyped(self) -> SyntaxStablePtrId<'db> {
11251 self.0
11252 }
11253 fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11254 StatementBreak::from_syntax_node(db, self.0.lookup(db))
11255 }
11256}
11257impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11258 fn from(ptr: StatementBreakPtr<'db>) -> Self {
11259 ptr.untyped()
11260 }
11261}
11262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11263pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11264impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11265 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11266 type StablePtr = StatementBreakPtr<'db>;
11267 type Green = StatementBreakGreen<'db>;
11268 fn missing(db: &'db dyn Database) -> Self::Green {
11269 StatementBreakGreen(
11270 GreenNode {
11271 kind: SyntaxKind::StatementBreak,
11272 details: GreenNodeDetails::Node {
11273 children: [
11274 AttributeList::missing(db).0,
11275 TerminalBreak::missing(db).0,
11276 OptionExprClause::missing(db).0,
11277 TerminalSemicolon::missing(db).0,
11278 ]
11279 .into(),
11280 width: TextWidth::default(),
11281 },
11282 }
11283 .intern(db),
11284 )
11285 }
11286 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11287 let kind = node.kind(db);
11288 assert_eq!(
11289 kind,
11290 SyntaxKind::StatementBreak,
11291 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11292 kind,
11293 SyntaxKind::StatementBreak
11294 );
11295 Self { node }
11296 }
11297 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11298 let kind = node.kind(db);
11299 if kind == SyntaxKind::StatementBreak {
11300 Some(Self::from_syntax_node(db, node))
11301 } else {
11302 None
11303 }
11304 }
11305 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11306 self.node
11307 }
11308 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11309 StatementBreakPtr(self.node.stable_ptr(db))
11310 }
11311}
11312#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11313pub struct StatementItem<'db> {
11314 node: SyntaxNode<'db>,
11315}
11316impl<'db> StatementItem<'db> {
11317 pub const INDEX_ITEM: usize = 0;
11318 pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11319 let children = [item.0];
11320 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11321 StatementItemGreen(
11322 GreenNode {
11323 kind: SyntaxKind::StatementItem,
11324 details: GreenNodeDetails::Node { children: children.into(), width },
11325 }
11326 .intern(db),
11327 )
11328 }
11329}
11330impl<'db> StatementItem<'db> {
11331 pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11332 ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11333 }
11334}
11335#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11336pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11337impl<'db> StatementItemPtr<'db> {}
11338impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11339 type SyntaxNode = StatementItem<'db>;
11340 fn untyped(self) -> SyntaxStablePtrId<'db> {
11341 self.0
11342 }
11343 fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11344 StatementItem::from_syntax_node(db, self.0.lookup(db))
11345 }
11346}
11347impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11348 fn from(ptr: StatementItemPtr<'db>) -> Self {
11349 ptr.untyped()
11350 }
11351}
11352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11353pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11354impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11355 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11356 type StablePtr = StatementItemPtr<'db>;
11357 type Green = StatementItemGreen<'db>;
11358 fn missing(db: &'db dyn Database) -> Self::Green {
11359 StatementItemGreen(
11360 GreenNode {
11361 kind: SyntaxKind::StatementItem,
11362 details: GreenNodeDetails::Node {
11363 children: [ModuleItem::missing(db).0].into(),
11364 width: TextWidth::default(),
11365 },
11366 }
11367 .intern(db),
11368 )
11369 }
11370 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11371 let kind = node.kind(db);
11372 assert_eq!(
11373 kind,
11374 SyntaxKind::StatementItem,
11375 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11376 kind,
11377 SyntaxKind::StatementItem
11378 );
11379 Self { node }
11380 }
11381 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11382 let kind = node.kind(db);
11383 if kind == SyntaxKind::StatementItem {
11384 Some(Self::from_syntax_node(db, node))
11385 } else {
11386 None
11387 }
11388 }
11389 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11390 self.node
11391 }
11392 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11393 StatementItemPtr(self.node.stable_ptr(db))
11394 }
11395}
11396#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11397pub struct Param<'db> {
11398 node: SyntaxNode<'db>,
11399}
11400impl<'db> Param<'db> {
11401 pub const INDEX_MODIFIERS: usize = 0;
11402 pub const INDEX_NAME: usize = 1;
11403 pub const INDEX_TYPE_CLAUSE: usize = 2;
11404 pub fn new_green(
11405 db: &'db dyn Database,
11406 modifiers: ModifierListGreen<'db>,
11407 name: TerminalIdentifierGreen<'db>,
11408 type_clause: OptionTypeClauseGreen<'db>,
11409 ) -> ParamGreen<'db> {
11410 let children = [modifiers.0, name.0, type_clause.0];
11411 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11412 ParamGreen(
11413 GreenNode {
11414 kind: SyntaxKind::Param,
11415 details: GreenNodeDetails::Node { children: children.into(), width },
11416 }
11417 .intern(db),
11418 )
11419 }
11420}
11421impl<'db> Param<'db> {
11422 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11423 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11424 }
11425 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11426 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11427 }
11428 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11429 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11430 }
11431}
11432#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11433pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11434impl<'db> ParamPtr<'db> {
11435 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11436 let ptr = self.0.long(db);
11437 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
11438 TerminalIdentifierGreen(key_fields[0])
11439 } else {
11440 panic!("Unexpected key field query on root.");
11441 }
11442 }
11443}
11444impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11445 type SyntaxNode = Param<'db>;
11446 fn untyped(self) -> SyntaxStablePtrId<'db> {
11447 self.0
11448 }
11449 fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11450 Param::from_syntax_node(db, self.0.lookup(db))
11451 }
11452}
11453impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11454 fn from(ptr: ParamPtr<'db>) -> Self {
11455 ptr.untyped()
11456 }
11457}
11458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11459pub struct ParamGreen<'db>(pub GreenId<'db>);
11460impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11461 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11462 type StablePtr = ParamPtr<'db>;
11463 type Green = ParamGreen<'db>;
11464 fn missing(db: &'db dyn Database) -> Self::Green {
11465 ParamGreen(
11466 GreenNode {
11467 kind: SyntaxKind::Param,
11468 details: GreenNodeDetails::Node {
11469 children: [
11470 ModifierList::missing(db).0,
11471 TerminalIdentifier::missing(db).0,
11472 OptionTypeClause::missing(db).0,
11473 ]
11474 .into(),
11475 width: TextWidth::default(),
11476 },
11477 }
11478 .intern(db),
11479 )
11480 }
11481 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11482 let kind = node.kind(db);
11483 assert_eq!(
11484 kind,
11485 SyntaxKind::Param,
11486 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11487 kind,
11488 SyntaxKind::Param
11489 );
11490 Self { node }
11491 }
11492 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11493 let kind = node.kind(db);
11494 if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11495 }
11496 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11497 self.node
11498 }
11499 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11500 ParamPtr(self.node.stable_ptr(db))
11501 }
11502}
11503#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11504pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11505impl<'db> Deref for ModifierList<'db> {
11506 type Target = ElementList<'db, Modifier<'db>, 1>;
11507 fn deref(&self) -> &Self::Target {
11508 &self.0
11509 }
11510}
11511impl<'db> ModifierList<'db> {
11512 pub fn new_green(
11513 db: &'db dyn Database,
11514 children: &[ModifierGreen<'db>],
11515 ) -> ModifierListGreen<'db> {
11516 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11517 ModifierListGreen(
11518 GreenNode {
11519 kind: SyntaxKind::ModifierList,
11520 details: GreenNodeDetails::Node {
11521 children: children.iter().map(|x| x.0).collect(),
11522 width,
11523 },
11524 }
11525 .intern(db),
11526 )
11527 }
11528}
11529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11530pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11531impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11532 type SyntaxNode = ModifierList<'db>;
11533 fn untyped(self) -> SyntaxStablePtrId<'db> {
11534 self.0
11535 }
11536 fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11537 ModifierList::from_syntax_node(db, self.0.lookup(db))
11538 }
11539}
11540impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11541 fn from(ptr: ModifierListPtr<'db>) -> Self {
11542 ptr.untyped()
11543 }
11544}
11545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11546pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11547impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11548 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11549 type StablePtr = ModifierListPtr<'db>;
11550 type Green = ModifierListGreen<'db>;
11551 fn missing(db: &'db dyn Database) -> Self::Green {
11552 ModifierListGreen(
11553 GreenNode {
11554 kind: SyntaxKind::ModifierList,
11555 details: GreenNodeDetails::Node {
11556 children: [].into(),
11557 width: TextWidth::default(),
11558 },
11559 }
11560 .intern(db),
11561 )
11562 }
11563 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11564 Self(ElementList::new(node))
11565 }
11566 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11567 if node.kind(db) == SyntaxKind::ModifierList {
11568 Some(Self(ElementList::new(node)))
11569 } else {
11570 None
11571 }
11572 }
11573 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11574 self.node
11575 }
11576 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11577 ModifierListPtr(self.node.stable_ptr(db))
11578 }
11579}
11580#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11581pub enum Modifier<'db> {
11582 Ref(TerminalRef<'db>),
11583 Mut(TerminalMut<'db>),
11584}
11585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11586pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11587impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11588 type SyntaxNode = Modifier<'db>;
11589 fn untyped(self) -> SyntaxStablePtrId<'db> {
11590 self.0
11591 }
11592 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11593 Modifier::from_syntax_node(db, self.0.lookup(db))
11594 }
11595}
11596impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11597 fn from(ptr: ModifierPtr<'db>) -> Self {
11598 ptr.untyped()
11599 }
11600}
11601impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11602 fn from(value: TerminalRefPtr<'db>) -> Self {
11603 Self(value.0)
11604 }
11605}
11606impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11607 fn from(value: TerminalMutPtr<'db>) -> Self {
11608 Self(value.0)
11609 }
11610}
11611impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11612 fn from(value: TerminalRefGreen<'db>) -> Self {
11613 Self(value.0)
11614 }
11615}
11616impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11617 fn from(value: TerminalMutGreen<'db>) -> Self {
11618 Self(value.0)
11619 }
11620}
11621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11622pub struct ModifierGreen<'db>(pub GreenId<'db>);
11623impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11624 const OPTIONAL_KIND: Option<SyntaxKind> = None;
11625 type StablePtr = ModifierPtr<'db>;
11626 type Green = ModifierGreen<'db>;
11627 fn missing(db: &'db dyn Database) -> Self::Green {
11628 panic!("No missing variant.");
11629 }
11630 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11631 let kind = node.kind(db);
11632 match kind {
11633 SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11634 SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11635 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11636 }
11637 }
11638 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11639 let kind = node.kind(db);
11640 match kind {
11641 SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11642 SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11643 _ => None,
11644 }
11645 }
11646 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11647 match self {
11648 Modifier::Ref(x) => x.as_syntax_node(),
11649 Modifier::Mut(x) => x.as_syntax_node(),
11650 }
11651 }
11652 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11653 ModifierPtr(self.as_syntax_node().long(db).stable_ptr)
11654 }
11655}
11656impl<'db> Modifier<'db> {
11657 pub fn is_variant(kind: SyntaxKind) -> bool {
11659 matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11660 }
11661}
11662#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11663pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11664impl<'db> Deref for ParamList<'db> {
11665 type Target = ElementList<'db, Param<'db>, 2>;
11666 fn deref(&self) -> &Self::Target {
11667 &self.0
11668 }
11669}
11670impl<'db> ParamList<'db> {
11671 pub fn new_green(
11672 db: &'db dyn Database,
11673 children: &[ParamListElementOrSeparatorGreen<'db>],
11674 ) -> ParamListGreen<'db> {
11675 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11676 ParamListGreen(
11677 GreenNode {
11678 kind: SyntaxKind::ParamList,
11679 details: GreenNodeDetails::Node {
11680 children: children.iter().map(|x| x.id()).collect(),
11681 width,
11682 },
11683 }
11684 .intern(db),
11685 )
11686 }
11687}
11688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11689pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11690impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11691 type SyntaxNode = ParamList<'db>;
11692 fn untyped(self) -> SyntaxStablePtrId<'db> {
11693 self.0
11694 }
11695 fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11696 ParamList::from_syntax_node(db, self.0.lookup(db))
11697 }
11698}
11699impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11700 fn from(ptr: ParamListPtr<'db>) -> Self {
11701 ptr.untyped()
11702 }
11703}
11704#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11705pub enum ParamListElementOrSeparatorGreen<'db> {
11706 Separator(TerminalCommaGreen<'db>),
11707 Element(ParamGreen<'db>),
11708}
11709impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11710 fn from(value: TerminalCommaGreen<'db>) -> Self {
11711 ParamListElementOrSeparatorGreen::Separator(value)
11712 }
11713}
11714impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11715 fn from(value: ParamGreen<'db>) -> Self {
11716 ParamListElementOrSeparatorGreen::Element(value)
11717 }
11718}
11719impl<'db> ParamListElementOrSeparatorGreen<'db> {
11720 fn id(&self) -> GreenId<'db> {
11721 match self {
11722 ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11723 ParamListElementOrSeparatorGreen::Element(green) => green.0,
11724 }
11725 }
11726}
11727#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11728pub struct ParamListGreen<'db>(pub GreenId<'db>);
11729impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11730 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11731 type StablePtr = ParamListPtr<'db>;
11732 type Green = ParamListGreen<'db>;
11733 fn missing(db: &'db dyn Database) -> Self::Green {
11734 ParamListGreen(
11735 GreenNode {
11736 kind: SyntaxKind::ParamList,
11737 details: GreenNodeDetails::Node {
11738 children: [].into(),
11739 width: TextWidth::default(),
11740 },
11741 }
11742 .intern(db),
11743 )
11744 }
11745 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11746 Self(ElementList::new(node))
11747 }
11748 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11749 if node.kind(db) == SyntaxKind::ParamList {
11750 Some(Self(ElementList::new(node)))
11751 } else {
11752 None
11753 }
11754 }
11755 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11756 self.node
11757 }
11758 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11759 ParamListPtr(self.node.stable_ptr(db))
11760 }
11761}
11762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11763pub struct ImplicitsClause<'db> {
11764 node: SyntaxNode<'db>,
11765}
11766impl<'db> ImplicitsClause<'db> {
11767 pub const INDEX_IMPLICITS_KW: usize = 0;
11768 pub const INDEX_LPAREN: usize = 1;
11769 pub const INDEX_IMPLICITS: usize = 2;
11770 pub const INDEX_RPAREN: usize = 3;
11771 pub fn new_green(
11772 db: &'db dyn Database,
11773 implicits_kw: TerminalImplicitsGreen<'db>,
11774 lparen: TerminalLParenGreen<'db>,
11775 implicits: ImplicitsListGreen<'db>,
11776 rparen: TerminalRParenGreen<'db>,
11777 ) -> ImplicitsClauseGreen<'db> {
11778 let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11779 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11780 ImplicitsClauseGreen(
11781 GreenNode {
11782 kind: SyntaxKind::ImplicitsClause,
11783 details: GreenNodeDetails::Node { children: children.into(), width },
11784 }
11785 .intern(db),
11786 )
11787 }
11788}
11789impl<'db> ImplicitsClause<'db> {
11790 pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11791 TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11792 }
11793 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11794 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11795 }
11796 pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11797 ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11798 }
11799 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11800 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11801 }
11802}
11803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11804pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11805impl<'db> ImplicitsClausePtr<'db> {}
11806impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11807 type SyntaxNode = ImplicitsClause<'db>;
11808 fn untyped(self) -> SyntaxStablePtrId<'db> {
11809 self.0
11810 }
11811 fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11812 ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11813 }
11814}
11815impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11816 fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11817 ptr.untyped()
11818 }
11819}
11820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11821pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11822impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11823 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11824 type StablePtr = ImplicitsClausePtr<'db>;
11825 type Green = ImplicitsClauseGreen<'db>;
11826 fn missing(db: &'db dyn Database) -> Self::Green {
11827 ImplicitsClauseGreen(
11828 GreenNode {
11829 kind: SyntaxKind::ImplicitsClause,
11830 details: GreenNodeDetails::Node {
11831 children: [
11832 TerminalImplicits::missing(db).0,
11833 TerminalLParen::missing(db).0,
11834 ImplicitsList::missing(db).0,
11835 TerminalRParen::missing(db).0,
11836 ]
11837 .into(),
11838 width: TextWidth::default(),
11839 },
11840 }
11841 .intern(db),
11842 )
11843 }
11844 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11845 let kind = node.kind(db);
11846 assert_eq!(
11847 kind,
11848 SyntaxKind::ImplicitsClause,
11849 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11850 kind,
11851 SyntaxKind::ImplicitsClause
11852 );
11853 Self { node }
11854 }
11855 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11856 let kind = node.kind(db);
11857 if kind == SyntaxKind::ImplicitsClause {
11858 Some(Self::from_syntax_node(db, node))
11859 } else {
11860 None
11861 }
11862 }
11863 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11864 self.node
11865 }
11866 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11867 ImplicitsClausePtr(self.node.stable_ptr(db))
11868 }
11869}
11870#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11871pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11872impl<'db> Deref for ImplicitsList<'db> {
11873 type Target = ElementList<'db, ExprPath<'db>, 2>;
11874 fn deref(&self) -> &Self::Target {
11875 &self.0
11876 }
11877}
11878impl<'db> ImplicitsList<'db> {
11879 pub fn new_green(
11880 db: &'db dyn Database,
11881 children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11882 ) -> ImplicitsListGreen<'db> {
11883 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11884 ImplicitsListGreen(
11885 GreenNode {
11886 kind: SyntaxKind::ImplicitsList,
11887 details: GreenNodeDetails::Node {
11888 children: children.iter().map(|x| x.id()).collect(),
11889 width,
11890 },
11891 }
11892 .intern(db),
11893 )
11894 }
11895}
11896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11897pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11898impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11899 type SyntaxNode = ImplicitsList<'db>;
11900 fn untyped(self) -> SyntaxStablePtrId<'db> {
11901 self.0
11902 }
11903 fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11904 ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11905 }
11906}
11907impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11908 fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11909 ptr.untyped()
11910 }
11911}
11912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11913pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11914 Separator(TerminalCommaGreen<'db>),
11915 Element(ExprPathGreen<'db>),
11916}
11917impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11918 fn from(value: TerminalCommaGreen<'db>) -> Self {
11919 ImplicitsListElementOrSeparatorGreen::Separator(value)
11920 }
11921}
11922impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11923 fn from(value: ExprPathGreen<'db>) -> Self {
11924 ImplicitsListElementOrSeparatorGreen::Element(value)
11925 }
11926}
11927impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11928 fn id(&self) -> GreenId<'db> {
11929 match self {
11930 ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11931 ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11932 }
11933 }
11934}
11935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11936pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11937impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11938 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11939 type StablePtr = ImplicitsListPtr<'db>;
11940 type Green = ImplicitsListGreen<'db>;
11941 fn missing(db: &'db dyn Database) -> Self::Green {
11942 ImplicitsListGreen(
11943 GreenNode {
11944 kind: SyntaxKind::ImplicitsList,
11945 details: GreenNodeDetails::Node {
11946 children: [].into(),
11947 width: TextWidth::default(),
11948 },
11949 }
11950 .intern(db),
11951 )
11952 }
11953 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11954 Self(ElementList::new(node))
11955 }
11956 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11957 if node.kind(db) == SyntaxKind::ImplicitsList {
11958 Some(Self(ElementList::new(node)))
11959 } else {
11960 None
11961 }
11962 }
11963 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11964 self.node
11965 }
11966 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11967 ImplicitsListPtr(self.node.stable_ptr(db))
11968 }
11969}
11970#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11971pub enum OptionImplicitsClause<'db> {
11972 Empty(OptionImplicitsClauseEmpty<'db>),
11973 ImplicitsClause(ImplicitsClause<'db>),
11974}
11975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11976pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11977impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11978 type SyntaxNode = OptionImplicitsClause<'db>;
11979 fn untyped(self) -> SyntaxStablePtrId<'db> {
11980 self.0
11981 }
11982 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11983 OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11984 }
11985}
11986impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11987 fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11988 ptr.untyped()
11989 }
11990}
11991impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11992 fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11993 Self(value.0)
11994 }
11995}
11996impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11997 fn from(value: ImplicitsClausePtr<'db>) -> Self {
11998 Self(value.0)
11999 }
12000}
12001impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
12002 fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
12003 Self(value.0)
12004 }
12005}
12006impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
12007 fn from(value: ImplicitsClauseGreen<'db>) -> Self {
12008 Self(value.0)
12009 }
12010}
12011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12012pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
12013impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
12014 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12015 type StablePtr = OptionImplicitsClausePtr<'db>;
12016 type Green = OptionImplicitsClauseGreen<'db>;
12017 fn missing(db: &'db dyn Database) -> Self::Green {
12018 panic!("No missing variant.");
12019 }
12020 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12021 let kind = node.kind(db);
12022 match kind {
12023 SyntaxKind::OptionImplicitsClauseEmpty => {
12024 OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12025 }
12026 SyntaxKind::ImplicitsClause => {
12027 OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12028 }
12029 _ => panic!(
12030 "Unexpected syntax kind {:?} when constructing {}.",
12031 kind, "OptionImplicitsClause"
12032 ),
12033 }
12034 }
12035 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12036 let kind = node.kind(db);
12037 match kind {
12038 SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12039 OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12040 )),
12041 SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12042 ImplicitsClause::from_syntax_node(db, node),
12043 )),
12044 _ => None,
12045 }
12046 }
12047 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12048 match self {
12049 OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12050 OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12051 }
12052 }
12053 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12054 OptionImplicitsClausePtr(self.as_syntax_node().long(db).stable_ptr)
12055 }
12056}
12057impl<'db> OptionImplicitsClause<'db> {
12058 pub fn is_variant(kind: SyntaxKind) -> bool {
12060 matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12061 }
12062}
12063#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12064pub struct OptionImplicitsClauseEmpty<'db> {
12065 node: SyntaxNode<'db>,
12066}
12067impl<'db> OptionImplicitsClauseEmpty<'db> {
12068 pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
12069 let children = [];
12070 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12071 OptionImplicitsClauseEmptyGreen(
12072 GreenNode {
12073 kind: SyntaxKind::OptionImplicitsClauseEmpty,
12074 details: GreenNodeDetails::Node { children: children.into(), width },
12075 }
12076 .intern(db),
12077 )
12078 }
12079}
12080impl<'db> OptionImplicitsClauseEmpty<'db> {}
12081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12082pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12083impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12084impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12085 type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12086 fn untyped(self) -> SyntaxStablePtrId<'db> {
12087 self.0
12088 }
12089 fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12090 OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12091 }
12092}
12093impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12094 fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12095 ptr.untyped()
12096 }
12097}
12098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12099pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12100impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12101 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12102 type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12103 type Green = OptionImplicitsClauseEmptyGreen<'db>;
12104 fn missing(db: &'db dyn Database) -> Self::Green {
12105 OptionImplicitsClauseEmptyGreen(
12106 GreenNode {
12107 kind: SyntaxKind::OptionImplicitsClauseEmpty,
12108 details: GreenNodeDetails::Node {
12109 children: [].into(),
12110 width: TextWidth::default(),
12111 },
12112 }
12113 .intern(db),
12114 )
12115 }
12116 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12117 let kind = node.kind(db);
12118 assert_eq!(
12119 kind,
12120 SyntaxKind::OptionImplicitsClauseEmpty,
12121 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12122 kind,
12123 SyntaxKind::OptionImplicitsClauseEmpty
12124 );
12125 Self { node }
12126 }
12127 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12128 let kind = node.kind(db);
12129 if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12130 Some(Self::from_syntax_node(db, node))
12131 } else {
12132 None
12133 }
12134 }
12135 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12136 self.node
12137 }
12138 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12139 OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12140 }
12141}
12142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12143pub enum OptionTerminalNoPanic<'db> {
12144 Empty(OptionTerminalNoPanicEmpty<'db>),
12145 TerminalNoPanic(TerminalNoPanic<'db>),
12146}
12147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12148pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12149impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12150 type SyntaxNode = OptionTerminalNoPanic<'db>;
12151 fn untyped(self) -> SyntaxStablePtrId<'db> {
12152 self.0
12153 }
12154 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12155 OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12156 }
12157}
12158impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12159 fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12160 ptr.untyped()
12161 }
12162}
12163impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12164 fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12165 Self(value.0)
12166 }
12167}
12168impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12169 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12170 Self(value.0)
12171 }
12172}
12173impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12174 fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12175 Self(value.0)
12176 }
12177}
12178impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12179 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12180 Self(value.0)
12181 }
12182}
12183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12184pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12185impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12186 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12187 type StablePtr = OptionTerminalNoPanicPtr<'db>;
12188 type Green = OptionTerminalNoPanicGreen<'db>;
12189 fn missing(db: &'db dyn Database) -> Self::Green {
12190 panic!("No missing variant.");
12191 }
12192 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12193 let kind = node.kind(db);
12194 match kind {
12195 SyntaxKind::OptionTerminalNoPanicEmpty => {
12196 OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12197 }
12198 SyntaxKind::TerminalNoPanic => {
12199 OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12200 }
12201 _ => panic!(
12202 "Unexpected syntax kind {:?} when constructing {}.",
12203 kind, "OptionTerminalNoPanic"
12204 ),
12205 }
12206 }
12207 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12208 let kind = node.kind(db);
12209 match kind {
12210 SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12211 OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12212 )),
12213 SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12214 TerminalNoPanic::from_syntax_node(db, node),
12215 )),
12216 _ => None,
12217 }
12218 }
12219 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12220 match self {
12221 OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12222 OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12223 }
12224 }
12225 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12226 OptionTerminalNoPanicPtr(self.as_syntax_node().long(db).stable_ptr)
12227 }
12228}
12229impl<'db> OptionTerminalNoPanic<'db> {
12230 pub fn is_variant(kind: SyntaxKind) -> bool {
12232 matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12233 }
12234}
12235#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12236pub struct OptionTerminalNoPanicEmpty<'db> {
12237 node: SyntaxNode<'db>,
12238}
12239impl<'db> OptionTerminalNoPanicEmpty<'db> {
12240 pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12241 let children = [];
12242 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12243 OptionTerminalNoPanicEmptyGreen(
12244 GreenNode {
12245 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12246 details: GreenNodeDetails::Node { children: children.into(), width },
12247 }
12248 .intern(db),
12249 )
12250 }
12251}
12252impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12254pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12255impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12256impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12257 type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12258 fn untyped(self) -> SyntaxStablePtrId<'db> {
12259 self.0
12260 }
12261 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12262 OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12263 }
12264}
12265impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12266 fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12267 ptr.untyped()
12268 }
12269}
12270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12271pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12272impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12273 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12274 type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12275 type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12276 fn missing(db: &'db dyn Database) -> Self::Green {
12277 OptionTerminalNoPanicEmptyGreen(
12278 GreenNode {
12279 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12280 details: GreenNodeDetails::Node {
12281 children: [].into(),
12282 width: TextWidth::default(),
12283 },
12284 }
12285 .intern(db),
12286 )
12287 }
12288 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12289 let kind = node.kind(db);
12290 assert_eq!(
12291 kind,
12292 SyntaxKind::OptionTerminalNoPanicEmpty,
12293 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12294 kind,
12295 SyntaxKind::OptionTerminalNoPanicEmpty
12296 );
12297 Self { node }
12298 }
12299 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12300 let kind = node.kind(db);
12301 if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12302 Some(Self::from_syntax_node(db, node))
12303 } else {
12304 None
12305 }
12306 }
12307 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12308 self.node
12309 }
12310 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12311 OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12312 }
12313}
12314#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12315pub enum OptionTerminalConst<'db> {
12316 Empty(OptionTerminalConstEmpty<'db>),
12317 TerminalConst(TerminalConst<'db>),
12318}
12319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12320pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12321impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12322 type SyntaxNode = OptionTerminalConst<'db>;
12323 fn untyped(self) -> SyntaxStablePtrId<'db> {
12324 self.0
12325 }
12326 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12327 OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12328 }
12329}
12330impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12331 fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12332 ptr.untyped()
12333 }
12334}
12335impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12336 fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12337 Self(value.0)
12338 }
12339}
12340impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12341 fn from(value: TerminalConstPtr<'db>) -> Self {
12342 Self(value.0)
12343 }
12344}
12345impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12346 fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12347 Self(value.0)
12348 }
12349}
12350impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12351 fn from(value: TerminalConstGreen<'db>) -> Self {
12352 Self(value.0)
12353 }
12354}
12355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12356pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12357impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12358 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12359 type StablePtr = OptionTerminalConstPtr<'db>;
12360 type Green = OptionTerminalConstGreen<'db>;
12361 fn missing(db: &'db dyn Database) -> Self::Green {
12362 panic!("No missing variant.");
12363 }
12364 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12365 let kind = node.kind(db);
12366 match kind {
12367 SyntaxKind::OptionTerminalConstEmpty => {
12368 OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12369 }
12370 SyntaxKind::TerminalConst => {
12371 OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12372 }
12373 _ => panic!(
12374 "Unexpected syntax kind {:?} when constructing {}.",
12375 kind, "OptionTerminalConst"
12376 ),
12377 }
12378 }
12379 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12380 let kind = node.kind(db);
12381 match kind {
12382 SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12383 OptionTerminalConstEmpty::from_syntax_node(db, node),
12384 )),
12385 SyntaxKind::TerminalConst => {
12386 Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12387 }
12388 _ => None,
12389 }
12390 }
12391 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12392 match self {
12393 OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12394 OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12395 }
12396 }
12397 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12398 OptionTerminalConstPtr(self.as_syntax_node().long(db).stable_ptr)
12399 }
12400}
12401impl<'db> OptionTerminalConst<'db> {
12402 pub fn is_variant(kind: SyntaxKind) -> bool {
12404 matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12405 }
12406}
12407#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12408pub struct OptionTerminalConstEmpty<'db> {
12409 node: SyntaxNode<'db>,
12410}
12411impl<'db> OptionTerminalConstEmpty<'db> {
12412 pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12413 let children = [];
12414 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12415 OptionTerminalConstEmptyGreen(
12416 GreenNode {
12417 kind: SyntaxKind::OptionTerminalConstEmpty,
12418 details: GreenNodeDetails::Node { children: children.into(), width },
12419 }
12420 .intern(db),
12421 )
12422 }
12423}
12424impl<'db> OptionTerminalConstEmpty<'db> {}
12425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12426pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12427impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12428impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12429 type SyntaxNode = OptionTerminalConstEmpty<'db>;
12430 fn untyped(self) -> SyntaxStablePtrId<'db> {
12431 self.0
12432 }
12433 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12434 OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12435 }
12436}
12437impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12438 fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12439 ptr.untyped()
12440 }
12441}
12442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12443pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12444impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12445 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12446 type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12447 type Green = OptionTerminalConstEmptyGreen<'db>;
12448 fn missing(db: &'db dyn Database) -> Self::Green {
12449 OptionTerminalConstEmptyGreen(
12450 GreenNode {
12451 kind: SyntaxKind::OptionTerminalConstEmpty,
12452 details: GreenNodeDetails::Node {
12453 children: [].into(),
12454 width: TextWidth::default(),
12455 },
12456 }
12457 .intern(db),
12458 )
12459 }
12460 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12461 let kind = node.kind(db);
12462 assert_eq!(
12463 kind,
12464 SyntaxKind::OptionTerminalConstEmpty,
12465 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12466 kind,
12467 SyntaxKind::OptionTerminalConstEmpty
12468 );
12469 Self { node }
12470 }
12471 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12472 let kind = node.kind(db);
12473 if kind == SyntaxKind::OptionTerminalConstEmpty {
12474 Some(Self::from_syntax_node(db, node))
12475 } else {
12476 None
12477 }
12478 }
12479 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12480 self.node
12481 }
12482 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12483 OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12484 }
12485}
12486#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12487pub struct FunctionSignature<'db> {
12488 node: SyntaxNode<'db>,
12489}
12490impl<'db> FunctionSignature<'db> {
12491 pub const INDEX_LPAREN: usize = 0;
12492 pub const INDEX_PARAMETERS: usize = 1;
12493 pub const INDEX_RPAREN: usize = 2;
12494 pub const INDEX_RET_TY: usize = 3;
12495 pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12496 pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12497 pub fn new_green(
12498 db: &'db dyn Database,
12499 lparen: TerminalLParenGreen<'db>,
12500 parameters: ParamListGreen<'db>,
12501 rparen: TerminalRParenGreen<'db>,
12502 ret_ty: OptionReturnTypeClauseGreen<'db>,
12503 implicits_clause: OptionImplicitsClauseGreen<'db>,
12504 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12505 ) -> FunctionSignatureGreen<'db> {
12506 let children =
12507 [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12508 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12509 FunctionSignatureGreen(
12510 GreenNode {
12511 kind: SyntaxKind::FunctionSignature,
12512 details: GreenNodeDetails::Node { children: children.into(), width },
12513 }
12514 .intern(db),
12515 )
12516 }
12517}
12518impl<'db> FunctionSignature<'db> {
12519 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12520 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12521 }
12522 pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12523 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12524 }
12525 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12526 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12527 }
12528 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12529 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12530 }
12531 pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12532 OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12533 }
12534 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12535 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12536 }
12537}
12538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12539pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12540impl<'db> FunctionSignaturePtr<'db> {}
12541impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12542 type SyntaxNode = FunctionSignature<'db>;
12543 fn untyped(self) -> SyntaxStablePtrId<'db> {
12544 self.0
12545 }
12546 fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12547 FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12548 }
12549}
12550impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12551 fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12552 ptr.untyped()
12553 }
12554}
12555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12556pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12557impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12558 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12559 type StablePtr = FunctionSignaturePtr<'db>;
12560 type Green = FunctionSignatureGreen<'db>;
12561 fn missing(db: &'db dyn Database) -> Self::Green {
12562 FunctionSignatureGreen(
12563 GreenNode {
12564 kind: SyntaxKind::FunctionSignature,
12565 details: GreenNodeDetails::Node {
12566 children: [
12567 TerminalLParen::missing(db).0,
12568 ParamList::missing(db).0,
12569 TerminalRParen::missing(db).0,
12570 OptionReturnTypeClause::missing(db).0,
12571 OptionImplicitsClause::missing(db).0,
12572 OptionTerminalNoPanic::missing(db).0,
12573 ]
12574 .into(),
12575 width: TextWidth::default(),
12576 },
12577 }
12578 .intern(db),
12579 )
12580 }
12581 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12582 let kind = node.kind(db);
12583 assert_eq!(
12584 kind,
12585 SyntaxKind::FunctionSignature,
12586 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12587 kind,
12588 SyntaxKind::FunctionSignature
12589 );
12590 Self { node }
12591 }
12592 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12593 let kind = node.kind(db);
12594 if kind == SyntaxKind::FunctionSignature {
12595 Some(Self::from_syntax_node(db, node))
12596 } else {
12597 None
12598 }
12599 }
12600 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12601 self.node
12602 }
12603 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12604 FunctionSignaturePtr(self.node.stable_ptr(db))
12605 }
12606}
12607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12608pub struct Member<'db> {
12609 node: SyntaxNode<'db>,
12610}
12611impl<'db> Member<'db> {
12612 pub const INDEX_ATTRIBUTES: usize = 0;
12613 pub const INDEX_VISIBILITY: usize = 1;
12614 pub const INDEX_NAME: usize = 2;
12615 pub const INDEX_TYPE_CLAUSE: usize = 3;
12616 pub fn new_green(
12617 db: &'db dyn Database,
12618 attributes: AttributeListGreen<'db>,
12619 visibility: VisibilityGreen<'db>,
12620 name: TerminalIdentifierGreen<'db>,
12621 type_clause: TypeClauseGreen<'db>,
12622 ) -> MemberGreen<'db> {
12623 let children = [attributes.0, visibility.0, name.0, type_clause.0];
12624 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12625 MemberGreen(
12626 GreenNode {
12627 kind: SyntaxKind::Member,
12628 details: GreenNodeDetails::Node { children: children.into(), width },
12629 }
12630 .intern(db),
12631 )
12632 }
12633}
12634impl<'db> Member<'db> {
12635 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12636 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12637 }
12638 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12639 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12640 }
12641 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12642 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12643 }
12644 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12645 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12646 }
12647}
12648#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12649pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12650impl<'db> MemberPtr<'db> {
12651 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12652 let ptr = self.0.long(db);
12653 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12654 TerminalIdentifierGreen(key_fields[0])
12655 } else {
12656 panic!("Unexpected key field query on root.");
12657 }
12658 }
12659}
12660impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12661 type SyntaxNode = Member<'db>;
12662 fn untyped(self) -> SyntaxStablePtrId<'db> {
12663 self.0
12664 }
12665 fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12666 Member::from_syntax_node(db, self.0.lookup(db))
12667 }
12668}
12669impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12670 fn from(ptr: MemberPtr<'db>) -> Self {
12671 ptr.untyped()
12672 }
12673}
12674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12675pub struct MemberGreen<'db>(pub GreenId<'db>);
12676impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12677 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12678 type StablePtr = MemberPtr<'db>;
12679 type Green = MemberGreen<'db>;
12680 fn missing(db: &'db dyn Database) -> Self::Green {
12681 MemberGreen(
12682 GreenNode {
12683 kind: SyntaxKind::Member,
12684 details: GreenNodeDetails::Node {
12685 children: [
12686 AttributeList::missing(db).0,
12687 Visibility::missing(db).0,
12688 TerminalIdentifier::missing(db).0,
12689 TypeClause::missing(db).0,
12690 ]
12691 .into(),
12692 width: TextWidth::default(),
12693 },
12694 }
12695 .intern(db),
12696 )
12697 }
12698 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12699 let kind = node.kind(db);
12700 assert_eq!(
12701 kind,
12702 SyntaxKind::Member,
12703 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12704 kind,
12705 SyntaxKind::Member
12706 );
12707 Self { node }
12708 }
12709 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12710 let kind = node.kind(db);
12711 if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12712 }
12713 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12714 self.node
12715 }
12716 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12717 MemberPtr(self.node.stable_ptr(db))
12718 }
12719}
12720#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12721pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12722impl<'db> Deref for MemberList<'db> {
12723 type Target = ElementList<'db, Member<'db>, 2>;
12724 fn deref(&self) -> &Self::Target {
12725 &self.0
12726 }
12727}
12728impl<'db> MemberList<'db> {
12729 pub fn new_green(
12730 db: &'db dyn Database,
12731 children: &[MemberListElementOrSeparatorGreen<'db>],
12732 ) -> MemberListGreen<'db> {
12733 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12734 MemberListGreen(
12735 GreenNode {
12736 kind: SyntaxKind::MemberList,
12737 details: GreenNodeDetails::Node {
12738 children: children.iter().map(|x| x.id()).collect(),
12739 width,
12740 },
12741 }
12742 .intern(db),
12743 )
12744 }
12745}
12746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12747pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12748impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12749 type SyntaxNode = MemberList<'db>;
12750 fn untyped(self) -> SyntaxStablePtrId<'db> {
12751 self.0
12752 }
12753 fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12754 MemberList::from_syntax_node(db, self.0.lookup(db))
12755 }
12756}
12757impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12758 fn from(ptr: MemberListPtr<'db>) -> Self {
12759 ptr.untyped()
12760 }
12761}
12762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12763pub enum MemberListElementOrSeparatorGreen<'db> {
12764 Separator(TerminalCommaGreen<'db>),
12765 Element(MemberGreen<'db>),
12766}
12767impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12768 fn from(value: TerminalCommaGreen<'db>) -> Self {
12769 MemberListElementOrSeparatorGreen::Separator(value)
12770 }
12771}
12772impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12773 fn from(value: MemberGreen<'db>) -> Self {
12774 MemberListElementOrSeparatorGreen::Element(value)
12775 }
12776}
12777impl<'db> MemberListElementOrSeparatorGreen<'db> {
12778 fn id(&self) -> GreenId<'db> {
12779 match self {
12780 MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12781 MemberListElementOrSeparatorGreen::Element(green) => green.0,
12782 }
12783 }
12784}
12785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12786pub struct MemberListGreen<'db>(pub GreenId<'db>);
12787impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12788 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12789 type StablePtr = MemberListPtr<'db>;
12790 type Green = MemberListGreen<'db>;
12791 fn missing(db: &'db dyn Database) -> Self::Green {
12792 MemberListGreen(
12793 GreenNode {
12794 kind: SyntaxKind::MemberList,
12795 details: GreenNodeDetails::Node {
12796 children: [].into(),
12797 width: TextWidth::default(),
12798 },
12799 }
12800 .intern(db),
12801 )
12802 }
12803 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12804 Self(ElementList::new(node))
12805 }
12806 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12807 if node.kind(db) == SyntaxKind::MemberList {
12808 Some(Self(ElementList::new(node)))
12809 } else {
12810 None
12811 }
12812 }
12813 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12814 self.node
12815 }
12816 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12817 MemberListPtr(self.node.stable_ptr(db))
12818 }
12819}
12820#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12821pub struct Variant<'db> {
12822 node: SyntaxNode<'db>,
12823}
12824impl<'db> Variant<'db> {
12825 pub const INDEX_ATTRIBUTES: usize = 0;
12826 pub const INDEX_NAME: usize = 1;
12827 pub const INDEX_TYPE_CLAUSE: usize = 2;
12828 pub fn new_green(
12829 db: &'db dyn Database,
12830 attributes: AttributeListGreen<'db>,
12831 name: TerminalIdentifierGreen<'db>,
12832 type_clause: OptionTypeClauseGreen<'db>,
12833 ) -> VariantGreen<'db> {
12834 let children = [attributes.0, name.0, type_clause.0];
12835 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12836 VariantGreen(
12837 GreenNode {
12838 kind: SyntaxKind::Variant,
12839 details: GreenNodeDetails::Node { children: children.into(), width },
12840 }
12841 .intern(db),
12842 )
12843 }
12844}
12845impl<'db> Variant<'db> {
12846 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12847 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12848 }
12849 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12850 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12851 }
12852 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12853 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12854 }
12855}
12856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12857pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12858impl<'db> VariantPtr<'db> {
12859 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12860 let ptr = self.0.long(db);
12861 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12862 TerminalIdentifierGreen(key_fields[0])
12863 } else {
12864 panic!("Unexpected key field query on root.");
12865 }
12866 }
12867}
12868impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12869 type SyntaxNode = Variant<'db>;
12870 fn untyped(self) -> SyntaxStablePtrId<'db> {
12871 self.0
12872 }
12873 fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12874 Variant::from_syntax_node(db, self.0.lookup(db))
12875 }
12876}
12877impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12878 fn from(ptr: VariantPtr<'db>) -> Self {
12879 ptr.untyped()
12880 }
12881}
12882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12883pub struct VariantGreen<'db>(pub GreenId<'db>);
12884impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12885 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12886 type StablePtr = VariantPtr<'db>;
12887 type Green = VariantGreen<'db>;
12888 fn missing(db: &'db dyn Database) -> Self::Green {
12889 VariantGreen(
12890 GreenNode {
12891 kind: SyntaxKind::Variant,
12892 details: GreenNodeDetails::Node {
12893 children: [
12894 AttributeList::missing(db).0,
12895 TerminalIdentifier::missing(db).0,
12896 OptionTypeClause::missing(db).0,
12897 ]
12898 .into(),
12899 width: TextWidth::default(),
12900 },
12901 }
12902 .intern(db),
12903 )
12904 }
12905 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12906 let kind = node.kind(db);
12907 assert_eq!(
12908 kind,
12909 SyntaxKind::Variant,
12910 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12911 kind,
12912 SyntaxKind::Variant
12913 );
12914 Self { node }
12915 }
12916 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12917 let kind = node.kind(db);
12918 if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12919 }
12920 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12921 self.node
12922 }
12923 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12924 VariantPtr(self.node.stable_ptr(db))
12925 }
12926}
12927#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12928pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12929impl<'db> Deref for VariantList<'db> {
12930 type Target = ElementList<'db, Variant<'db>, 2>;
12931 fn deref(&self) -> &Self::Target {
12932 &self.0
12933 }
12934}
12935impl<'db> VariantList<'db> {
12936 pub fn new_green(
12937 db: &'db dyn Database,
12938 children: &[VariantListElementOrSeparatorGreen<'db>],
12939 ) -> VariantListGreen<'db> {
12940 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12941 VariantListGreen(
12942 GreenNode {
12943 kind: SyntaxKind::VariantList,
12944 details: GreenNodeDetails::Node {
12945 children: children.iter().map(|x| x.id()).collect(),
12946 width,
12947 },
12948 }
12949 .intern(db),
12950 )
12951 }
12952}
12953#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12954pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12955impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12956 type SyntaxNode = VariantList<'db>;
12957 fn untyped(self) -> SyntaxStablePtrId<'db> {
12958 self.0
12959 }
12960 fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12961 VariantList::from_syntax_node(db, self.0.lookup(db))
12962 }
12963}
12964impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12965 fn from(ptr: VariantListPtr<'db>) -> Self {
12966 ptr.untyped()
12967 }
12968}
12969#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12970pub enum VariantListElementOrSeparatorGreen<'db> {
12971 Separator(TerminalCommaGreen<'db>),
12972 Element(VariantGreen<'db>),
12973}
12974impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12975 fn from(value: TerminalCommaGreen<'db>) -> Self {
12976 VariantListElementOrSeparatorGreen::Separator(value)
12977 }
12978}
12979impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12980 fn from(value: VariantGreen<'db>) -> Self {
12981 VariantListElementOrSeparatorGreen::Element(value)
12982 }
12983}
12984impl<'db> VariantListElementOrSeparatorGreen<'db> {
12985 fn id(&self) -> GreenId<'db> {
12986 match self {
12987 VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12988 VariantListElementOrSeparatorGreen::Element(green) => green.0,
12989 }
12990 }
12991}
12992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12993pub struct VariantListGreen<'db>(pub GreenId<'db>);
12994impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12995 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12996 type StablePtr = VariantListPtr<'db>;
12997 type Green = VariantListGreen<'db>;
12998 fn missing(db: &'db dyn Database) -> Self::Green {
12999 VariantListGreen(
13000 GreenNode {
13001 kind: SyntaxKind::VariantList,
13002 details: GreenNodeDetails::Node {
13003 children: [].into(),
13004 width: TextWidth::default(),
13005 },
13006 }
13007 .intern(db),
13008 )
13009 }
13010 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13011 Self(ElementList::new(node))
13012 }
13013 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13014 if node.kind(db) == SyntaxKind::VariantList {
13015 Some(Self(ElementList::new(node)))
13016 } else {
13017 None
13018 }
13019 }
13020 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13021 self.node
13022 }
13023 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13024 VariantListPtr(self.node.stable_ptr(db))
13025 }
13026}
13027#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13028pub enum ModuleItem<'db> {
13029 Constant(ItemConstant<'db>),
13030 Module(ItemModule<'db>),
13031 Use(ItemUse<'db>),
13032 FreeFunction(FunctionWithBody<'db>),
13033 ExternFunction(ItemExternFunction<'db>),
13034 ExternType(ItemExternType<'db>),
13035 Trait(ItemTrait<'db>),
13036 Impl(ItemImpl<'db>),
13037 ImplAlias(ItemImplAlias<'db>),
13038 Struct(ItemStruct<'db>),
13039 Enum(ItemEnum<'db>),
13040 TypeAlias(ItemTypeAlias<'db>),
13041 InlineMacro(ItemInlineMacro<'db>),
13042 MacroDeclaration(ItemMacroDeclaration<'db>),
13043 HeaderDoc(ItemHeaderDoc<'db>),
13044 Missing(ModuleItemMissing<'db>),
13045}
13046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13047pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
13048impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
13049 type SyntaxNode = ModuleItem<'db>;
13050 fn untyped(self) -> SyntaxStablePtrId<'db> {
13051 self.0
13052 }
13053 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13054 ModuleItem::from_syntax_node(db, self.0.lookup(db))
13055 }
13056}
13057impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
13058 fn from(ptr: ModuleItemPtr<'db>) -> Self {
13059 ptr.untyped()
13060 }
13061}
13062impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
13063 fn from(value: ItemConstantPtr<'db>) -> Self {
13064 Self(value.0)
13065 }
13066}
13067impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
13068 fn from(value: ItemModulePtr<'db>) -> Self {
13069 Self(value.0)
13070 }
13071}
13072impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
13073 fn from(value: ItemUsePtr<'db>) -> Self {
13074 Self(value.0)
13075 }
13076}
13077impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
13078 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
13079 Self(value.0)
13080 }
13081}
13082impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
13083 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
13084 Self(value.0)
13085 }
13086}
13087impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
13088 fn from(value: ItemExternTypePtr<'db>) -> Self {
13089 Self(value.0)
13090 }
13091}
13092impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
13093 fn from(value: ItemTraitPtr<'db>) -> Self {
13094 Self(value.0)
13095 }
13096}
13097impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13098 fn from(value: ItemImplPtr<'db>) -> Self {
13099 Self(value.0)
13100 }
13101}
13102impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13103 fn from(value: ItemImplAliasPtr<'db>) -> Self {
13104 Self(value.0)
13105 }
13106}
13107impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13108 fn from(value: ItemStructPtr<'db>) -> Self {
13109 Self(value.0)
13110 }
13111}
13112impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13113 fn from(value: ItemEnumPtr<'db>) -> Self {
13114 Self(value.0)
13115 }
13116}
13117impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13118 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13119 Self(value.0)
13120 }
13121}
13122impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13123 fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13124 Self(value.0)
13125 }
13126}
13127impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13128 fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13129 Self(value.0)
13130 }
13131}
13132impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13133 fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13134 Self(value.0)
13135 }
13136}
13137impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13138 fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13139 Self(value.0)
13140 }
13141}
13142impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13143 fn from(value: ItemConstantGreen<'db>) -> Self {
13144 Self(value.0)
13145 }
13146}
13147impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13148 fn from(value: ItemModuleGreen<'db>) -> Self {
13149 Self(value.0)
13150 }
13151}
13152impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13153 fn from(value: ItemUseGreen<'db>) -> Self {
13154 Self(value.0)
13155 }
13156}
13157impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13158 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13159 Self(value.0)
13160 }
13161}
13162impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13163 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13164 Self(value.0)
13165 }
13166}
13167impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13168 fn from(value: ItemExternTypeGreen<'db>) -> Self {
13169 Self(value.0)
13170 }
13171}
13172impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13173 fn from(value: ItemTraitGreen<'db>) -> Self {
13174 Self(value.0)
13175 }
13176}
13177impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13178 fn from(value: ItemImplGreen<'db>) -> Self {
13179 Self(value.0)
13180 }
13181}
13182impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13183 fn from(value: ItemImplAliasGreen<'db>) -> Self {
13184 Self(value.0)
13185 }
13186}
13187impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13188 fn from(value: ItemStructGreen<'db>) -> Self {
13189 Self(value.0)
13190 }
13191}
13192impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13193 fn from(value: ItemEnumGreen<'db>) -> Self {
13194 Self(value.0)
13195 }
13196}
13197impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13198 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13199 Self(value.0)
13200 }
13201}
13202impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13203 fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13204 Self(value.0)
13205 }
13206}
13207impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13208 fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13209 Self(value.0)
13210 }
13211}
13212impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13213 fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13214 Self(value.0)
13215 }
13216}
13217impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13218 fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13219 Self(value.0)
13220 }
13221}
13222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13223pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13224impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13225 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13226 type StablePtr = ModuleItemPtr<'db>;
13227 type Green = ModuleItemGreen<'db>;
13228 fn missing(db: &'db dyn Database) -> Self::Green {
13229 ModuleItemGreen(ModuleItemMissing::missing(db).0)
13230 }
13231 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13232 let kind = node.kind(db);
13233 match kind {
13234 SyntaxKind::ItemConstant => {
13235 ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13236 }
13237 SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13238 SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13239 SyntaxKind::FunctionWithBody => {
13240 ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13241 }
13242 SyntaxKind::ItemExternFunction => {
13243 ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13244 }
13245 SyntaxKind::ItemExternType => {
13246 ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13247 }
13248 SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13249 SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13250 SyntaxKind::ItemImplAlias => {
13251 ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13252 }
13253 SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13254 SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13255 SyntaxKind::ItemTypeAlias => {
13256 ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13257 }
13258 SyntaxKind::ItemInlineMacro => {
13259 ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13260 }
13261 SyntaxKind::ItemMacroDeclaration => {
13262 ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13263 }
13264 SyntaxKind::ItemHeaderDoc => {
13265 ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13266 }
13267 SyntaxKind::ModuleItemMissing => {
13268 ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13269 }
13270 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13271 }
13272 }
13273 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13274 let kind = node.kind(db);
13275 match kind {
13276 SyntaxKind::ItemConstant => {
13277 Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13278 }
13279 SyntaxKind::ItemModule => {
13280 Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13281 }
13282 SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13283 SyntaxKind::FunctionWithBody => {
13284 Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13285 }
13286 SyntaxKind::ItemExternFunction => {
13287 Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13288 }
13289 SyntaxKind::ItemExternType => {
13290 Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13291 }
13292 SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13293 SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13294 SyntaxKind::ItemImplAlias => {
13295 Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13296 }
13297 SyntaxKind::ItemStruct => {
13298 Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13299 }
13300 SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13301 SyntaxKind::ItemTypeAlias => {
13302 Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13303 }
13304 SyntaxKind::ItemInlineMacro => {
13305 Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13306 }
13307 SyntaxKind::ItemMacroDeclaration => {
13308 Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13309 }
13310 SyntaxKind::ItemHeaderDoc => {
13311 Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13312 }
13313 SyntaxKind::ModuleItemMissing => {
13314 Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13315 }
13316 _ => None,
13317 }
13318 }
13319 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13320 match self {
13321 ModuleItem::Constant(x) => x.as_syntax_node(),
13322 ModuleItem::Module(x) => x.as_syntax_node(),
13323 ModuleItem::Use(x) => x.as_syntax_node(),
13324 ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13325 ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13326 ModuleItem::ExternType(x) => x.as_syntax_node(),
13327 ModuleItem::Trait(x) => x.as_syntax_node(),
13328 ModuleItem::Impl(x) => x.as_syntax_node(),
13329 ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13330 ModuleItem::Struct(x) => x.as_syntax_node(),
13331 ModuleItem::Enum(x) => x.as_syntax_node(),
13332 ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13333 ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13334 ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13335 ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13336 ModuleItem::Missing(x) => x.as_syntax_node(),
13337 }
13338 }
13339 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13340 ModuleItemPtr(self.as_syntax_node().long(db).stable_ptr)
13341 }
13342}
13343impl<'db> ModuleItem<'db> {
13344 pub fn is_variant(kind: SyntaxKind) -> bool {
13346 matches!(
13347 kind,
13348 SyntaxKind::ItemConstant
13349 | SyntaxKind::ItemModule
13350 | SyntaxKind::ItemUse
13351 | SyntaxKind::FunctionWithBody
13352 | SyntaxKind::ItemExternFunction
13353 | SyntaxKind::ItemExternType
13354 | SyntaxKind::ItemTrait
13355 | SyntaxKind::ItemImpl
13356 | SyntaxKind::ItemImplAlias
13357 | SyntaxKind::ItemStruct
13358 | SyntaxKind::ItemEnum
13359 | SyntaxKind::ItemTypeAlias
13360 | SyntaxKind::ItemInlineMacro
13361 | SyntaxKind::ItemMacroDeclaration
13362 | SyntaxKind::ItemHeaderDoc
13363 | SyntaxKind::ModuleItemMissing
13364 )
13365 }
13366}
13367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13368pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13369impl<'db> Deref for ModuleItemList<'db> {
13370 type Target = ElementList<'db, ModuleItem<'db>, 1>;
13371 fn deref(&self) -> &Self::Target {
13372 &self.0
13373 }
13374}
13375impl<'db> ModuleItemList<'db> {
13376 pub fn new_green(
13377 db: &'db dyn Database,
13378 children: &[ModuleItemGreen<'db>],
13379 ) -> ModuleItemListGreen<'db> {
13380 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13381 ModuleItemListGreen(
13382 GreenNode {
13383 kind: SyntaxKind::ModuleItemList,
13384 details: GreenNodeDetails::Node {
13385 children: children.iter().map(|x| x.0).collect(),
13386 width,
13387 },
13388 }
13389 .intern(db),
13390 )
13391 }
13392}
13393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13394pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13395impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13396 type SyntaxNode = ModuleItemList<'db>;
13397 fn untyped(self) -> SyntaxStablePtrId<'db> {
13398 self.0
13399 }
13400 fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13401 ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13402 }
13403}
13404impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13405 fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13406 ptr.untyped()
13407 }
13408}
13409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13410pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13411impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13412 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13413 type StablePtr = ModuleItemListPtr<'db>;
13414 type Green = ModuleItemListGreen<'db>;
13415 fn missing(db: &'db dyn Database) -> Self::Green {
13416 ModuleItemListGreen(
13417 GreenNode {
13418 kind: SyntaxKind::ModuleItemList,
13419 details: GreenNodeDetails::Node {
13420 children: [].into(),
13421 width: TextWidth::default(),
13422 },
13423 }
13424 .intern(db),
13425 )
13426 }
13427 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13428 Self(ElementList::new(node))
13429 }
13430 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13431 if node.kind(db) == SyntaxKind::ModuleItemList {
13432 Some(Self(ElementList::new(node)))
13433 } else {
13434 None
13435 }
13436 }
13437 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13438 self.node
13439 }
13440 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13441 ModuleItemListPtr(self.node.stable_ptr(db))
13442 }
13443}
13444#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13445pub struct ModuleItemMissing<'db> {
13446 node: SyntaxNode<'db>,
13447}
13448impl<'db> ModuleItemMissing<'db> {
13449 pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13450 let children = [];
13451 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13452 ModuleItemMissingGreen(
13453 GreenNode {
13454 kind: SyntaxKind::ModuleItemMissing,
13455 details: GreenNodeDetails::Node { children: children.into(), width },
13456 }
13457 .intern(db),
13458 )
13459 }
13460}
13461impl<'db> ModuleItemMissing<'db> {}
13462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13463pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13464impl<'db> ModuleItemMissingPtr<'db> {}
13465impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13466 type SyntaxNode = ModuleItemMissing<'db>;
13467 fn untyped(self) -> SyntaxStablePtrId<'db> {
13468 self.0
13469 }
13470 fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13471 ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13472 }
13473}
13474impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13475 fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13476 ptr.untyped()
13477 }
13478}
13479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13480pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13481impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13482 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13483 type StablePtr = ModuleItemMissingPtr<'db>;
13484 type Green = ModuleItemMissingGreen<'db>;
13485 fn missing(db: &'db dyn Database) -> Self::Green {
13486 ModuleItemMissingGreen(
13487 GreenNode {
13488 kind: SyntaxKind::ModuleItemMissing,
13489 details: GreenNodeDetails::Node {
13490 children: [].into(),
13491 width: TextWidth::default(),
13492 },
13493 }
13494 .intern(db),
13495 )
13496 }
13497 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13498 let kind = node.kind(db);
13499 assert_eq!(
13500 kind,
13501 SyntaxKind::ModuleItemMissing,
13502 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13503 kind,
13504 SyntaxKind::ModuleItemMissing
13505 );
13506 Self { node }
13507 }
13508 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13509 let kind = node.kind(db);
13510 if kind == SyntaxKind::ModuleItemMissing {
13511 Some(Self::from_syntax_node(db, node))
13512 } else {
13513 None
13514 }
13515 }
13516 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13517 self.node
13518 }
13519 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13520 ModuleItemMissingPtr(self.node.stable_ptr(db))
13521 }
13522}
13523#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13524pub struct Attribute<'db> {
13525 node: SyntaxNode<'db>,
13526}
13527impl<'db> Attribute<'db> {
13528 pub const INDEX_HASH: usize = 0;
13529 pub const INDEX_LBRACK: usize = 1;
13530 pub const INDEX_ATTR: usize = 2;
13531 pub const INDEX_ARGUMENTS: usize = 3;
13532 pub const INDEX_RBRACK: usize = 4;
13533 pub fn new_green(
13534 db: &'db dyn Database,
13535 hash: TerminalHashGreen<'db>,
13536 lbrack: TerminalLBrackGreen<'db>,
13537 attr: ExprPathGreen<'db>,
13538 arguments: OptionArgListParenthesizedGreen<'db>,
13539 rbrack: TerminalRBrackGreen<'db>,
13540 ) -> AttributeGreen<'db> {
13541 let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13542 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13543 AttributeGreen(
13544 GreenNode {
13545 kind: SyntaxKind::Attribute,
13546 details: GreenNodeDetails::Node { children: children.into(), width },
13547 }
13548 .intern(db),
13549 )
13550 }
13551}
13552impl<'db> Attribute<'db> {
13553 pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13554 TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13555 }
13556 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13557 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13558 }
13559 pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13560 ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13561 }
13562 pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13563 OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13564 }
13565 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13566 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13567 }
13568}
13569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13570pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13571impl<'db> AttributePtr<'db> {}
13572impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13573 type SyntaxNode = Attribute<'db>;
13574 fn untyped(self) -> SyntaxStablePtrId<'db> {
13575 self.0
13576 }
13577 fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13578 Attribute::from_syntax_node(db, self.0.lookup(db))
13579 }
13580}
13581impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13582 fn from(ptr: AttributePtr<'db>) -> Self {
13583 ptr.untyped()
13584 }
13585}
13586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13587pub struct AttributeGreen<'db>(pub GreenId<'db>);
13588impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13589 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13590 type StablePtr = AttributePtr<'db>;
13591 type Green = AttributeGreen<'db>;
13592 fn missing(db: &'db dyn Database) -> Self::Green {
13593 AttributeGreen(
13594 GreenNode {
13595 kind: SyntaxKind::Attribute,
13596 details: GreenNodeDetails::Node {
13597 children: [
13598 TerminalHash::missing(db).0,
13599 TerminalLBrack::missing(db).0,
13600 ExprPath::missing(db).0,
13601 OptionArgListParenthesized::missing(db).0,
13602 TerminalRBrack::missing(db).0,
13603 ]
13604 .into(),
13605 width: TextWidth::default(),
13606 },
13607 }
13608 .intern(db),
13609 )
13610 }
13611 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13612 let kind = node.kind(db);
13613 assert_eq!(
13614 kind,
13615 SyntaxKind::Attribute,
13616 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13617 kind,
13618 SyntaxKind::Attribute
13619 );
13620 Self { node }
13621 }
13622 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13623 let kind = node.kind(db);
13624 if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13625 }
13626 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13627 self.node
13628 }
13629 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13630 AttributePtr(self.node.stable_ptr(db))
13631 }
13632}
13633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13634pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13635impl<'db> Deref for AttributeList<'db> {
13636 type Target = ElementList<'db, Attribute<'db>, 1>;
13637 fn deref(&self) -> &Self::Target {
13638 &self.0
13639 }
13640}
13641impl<'db> AttributeList<'db> {
13642 pub fn new_green(
13643 db: &'db dyn Database,
13644 children: &[AttributeGreen<'db>],
13645 ) -> AttributeListGreen<'db> {
13646 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13647 AttributeListGreen(
13648 GreenNode {
13649 kind: SyntaxKind::AttributeList,
13650 details: GreenNodeDetails::Node {
13651 children: children.iter().map(|x| x.0).collect(),
13652 width,
13653 },
13654 }
13655 .intern(db),
13656 )
13657 }
13658}
13659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13660pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13661impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13662 type SyntaxNode = AttributeList<'db>;
13663 fn untyped(self) -> SyntaxStablePtrId<'db> {
13664 self.0
13665 }
13666 fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13667 AttributeList::from_syntax_node(db, self.0.lookup(db))
13668 }
13669}
13670impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13671 fn from(ptr: AttributeListPtr<'db>) -> Self {
13672 ptr.untyped()
13673 }
13674}
13675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13676pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13677impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13678 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13679 type StablePtr = AttributeListPtr<'db>;
13680 type Green = AttributeListGreen<'db>;
13681 fn missing(db: &'db dyn Database) -> Self::Green {
13682 AttributeListGreen(
13683 GreenNode {
13684 kind: SyntaxKind::AttributeList,
13685 details: GreenNodeDetails::Node {
13686 children: [].into(),
13687 width: TextWidth::default(),
13688 },
13689 }
13690 .intern(db),
13691 )
13692 }
13693 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13694 Self(ElementList::new(node))
13695 }
13696 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13697 if node.kind(db) == SyntaxKind::AttributeList {
13698 Some(Self(ElementList::new(node)))
13699 } else {
13700 None
13701 }
13702 }
13703 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13704 self.node
13705 }
13706 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13707 AttributeListPtr(self.node.stable_ptr(db))
13708 }
13709}
13710#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13711pub struct VisibilityDefault<'db> {
13712 node: SyntaxNode<'db>,
13713}
13714impl<'db> VisibilityDefault<'db> {
13715 pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13716 let children = [];
13717 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13718 VisibilityDefaultGreen(
13719 GreenNode {
13720 kind: SyntaxKind::VisibilityDefault,
13721 details: GreenNodeDetails::Node { children: children.into(), width },
13722 }
13723 .intern(db),
13724 )
13725 }
13726}
13727impl<'db> VisibilityDefault<'db> {}
13728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13729pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13730impl<'db> VisibilityDefaultPtr<'db> {}
13731impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13732 type SyntaxNode = VisibilityDefault<'db>;
13733 fn untyped(self) -> SyntaxStablePtrId<'db> {
13734 self.0
13735 }
13736 fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13737 VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13738 }
13739}
13740impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13741 fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13742 ptr.untyped()
13743 }
13744}
13745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13746pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13747impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13748 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13749 type StablePtr = VisibilityDefaultPtr<'db>;
13750 type Green = VisibilityDefaultGreen<'db>;
13751 fn missing(db: &'db dyn Database) -> Self::Green {
13752 VisibilityDefaultGreen(
13753 GreenNode {
13754 kind: SyntaxKind::VisibilityDefault,
13755 details: GreenNodeDetails::Node {
13756 children: [].into(),
13757 width: TextWidth::default(),
13758 },
13759 }
13760 .intern(db),
13761 )
13762 }
13763 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13764 let kind = node.kind(db);
13765 assert_eq!(
13766 kind,
13767 SyntaxKind::VisibilityDefault,
13768 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13769 kind,
13770 SyntaxKind::VisibilityDefault
13771 );
13772 Self { node }
13773 }
13774 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13775 let kind = node.kind(db);
13776 if kind == SyntaxKind::VisibilityDefault {
13777 Some(Self::from_syntax_node(db, node))
13778 } else {
13779 None
13780 }
13781 }
13782 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13783 self.node
13784 }
13785 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13786 VisibilityDefaultPtr(self.node.stable_ptr(db))
13787 }
13788}
13789#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13790pub struct VisibilityPubArgumentClause<'db> {
13791 node: SyntaxNode<'db>,
13792}
13793impl<'db> VisibilityPubArgumentClause<'db> {
13794 pub const INDEX_LPAREN: usize = 0;
13795 pub const INDEX_ARGUMENT: usize = 1;
13796 pub const INDEX_RPAREN: usize = 2;
13797 pub fn new_green(
13798 db: &'db dyn Database,
13799 lparen: TerminalLParenGreen<'db>,
13800 argument: TerminalIdentifierGreen<'db>,
13801 rparen: TerminalRParenGreen<'db>,
13802 ) -> VisibilityPubArgumentClauseGreen<'db> {
13803 let children = [lparen.0, argument.0, rparen.0];
13804 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13805 VisibilityPubArgumentClauseGreen(
13806 GreenNode {
13807 kind: SyntaxKind::VisibilityPubArgumentClause,
13808 details: GreenNodeDetails::Node { children: children.into(), width },
13809 }
13810 .intern(db),
13811 )
13812 }
13813}
13814impl<'db> VisibilityPubArgumentClause<'db> {
13815 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13816 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13817 }
13818 pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13819 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13820 }
13821 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13822 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13823 }
13824}
13825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13826pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13827impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13828impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13829 type SyntaxNode = VisibilityPubArgumentClause<'db>;
13830 fn untyped(self) -> SyntaxStablePtrId<'db> {
13831 self.0
13832 }
13833 fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13834 VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13835 }
13836}
13837impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13838 fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13839 ptr.untyped()
13840 }
13841}
13842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13843pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13844impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13845 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13846 type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13847 type Green = VisibilityPubArgumentClauseGreen<'db>;
13848 fn missing(db: &'db dyn Database) -> Self::Green {
13849 VisibilityPubArgumentClauseGreen(
13850 GreenNode {
13851 kind: SyntaxKind::VisibilityPubArgumentClause,
13852 details: GreenNodeDetails::Node {
13853 children: [
13854 TerminalLParen::missing(db).0,
13855 TerminalIdentifier::missing(db).0,
13856 TerminalRParen::missing(db).0,
13857 ]
13858 .into(),
13859 width: TextWidth::default(),
13860 },
13861 }
13862 .intern(db),
13863 )
13864 }
13865 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13866 let kind = node.kind(db);
13867 assert_eq!(
13868 kind,
13869 SyntaxKind::VisibilityPubArgumentClause,
13870 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13871 kind,
13872 SyntaxKind::VisibilityPubArgumentClause
13873 );
13874 Self { node }
13875 }
13876 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13877 let kind = node.kind(db);
13878 if kind == SyntaxKind::VisibilityPubArgumentClause {
13879 Some(Self::from_syntax_node(db, node))
13880 } else {
13881 None
13882 }
13883 }
13884 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13885 self.node
13886 }
13887 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13888 VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13889 }
13890}
13891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13892pub enum OptionVisibilityPubArgumentClause<'db> {
13893 Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13894 VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13895}
13896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13897pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13898impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13899 type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13900 fn untyped(self) -> SyntaxStablePtrId<'db> {
13901 self.0
13902 }
13903 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13904 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13905 }
13906}
13907impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13908 fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13909 ptr.untyped()
13910 }
13911}
13912impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13913 for OptionVisibilityPubArgumentClausePtr<'db>
13914{
13915 fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13916 Self(value.0)
13917 }
13918}
13919impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13920 fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13921 Self(value.0)
13922 }
13923}
13924impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13925 for OptionVisibilityPubArgumentClauseGreen<'db>
13926{
13927 fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13928 Self(value.0)
13929 }
13930}
13931impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13932 for OptionVisibilityPubArgumentClauseGreen<'db>
13933{
13934 fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13935 Self(value.0)
13936 }
13937}
13938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13939pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13940impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13941 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13942 type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13943 type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13944 fn missing(db: &'db dyn Database) -> Self::Green {
13945 panic!("No missing variant.");
13946 }
13947 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13948 let kind = node.kind(db);
13949 match kind {
13950 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13951 OptionVisibilityPubArgumentClause::Empty(
13952 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13953 )
13954 }
13955 SyntaxKind::VisibilityPubArgumentClause => {
13956 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13957 VisibilityPubArgumentClause::from_syntax_node(db, node),
13958 )
13959 }
13960 _ => panic!(
13961 "Unexpected syntax kind {:?} when constructing {}.",
13962 kind, "OptionVisibilityPubArgumentClause"
13963 ),
13964 }
13965 }
13966 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13967 let kind = node.kind(db);
13968 match kind {
13969 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13970 Some(OptionVisibilityPubArgumentClause::Empty(
13971 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13972 ))
13973 }
13974 SyntaxKind::VisibilityPubArgumentClause => {
13975 Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13976 VisibilityPubArgumentClause::from_syntax_node(db, node),
13977 ))
13978 }
13979 _ => None,
13980 }
13981 }
13982 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13983 match self {
13984 OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13985 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13986 }
13987 }
13988 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13989 OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().long(db).stable_ptr)
13990 }
13991}
13992impl<'db> OptionVisibilityPubArgumentClause<'db> {
13993 pub fn is_variant(kind: SyntaxKind) -> bool {
13995 matches!(
13996 kind,
13997 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13998 | SyntaxKind::VisibilityPubArgumentClause
13999 )
14000 }
14001}
14002#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14003pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
14004 node: SyntaxNode<'db>,
14005}
14006impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
14007 pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
14008 let children = [];
14009 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14010 OptionVisibilityPubArgumentClauseEmptyGreen(
14011 GreenNode {
14012 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14013 details: GreenNodeDetails::Node { children: children.into(), width },
14014 }
14015 .intern(db),
14016 )
14017 }
14018}
14019impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
14020#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14021pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
14022impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
14023impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
14024 type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
14025 fn untyped(self) -> SyntaxStablePtrId<'db> {
14026 self.0
14027 }
14028 fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
14029 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14030 }
14031}
14032impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
14033 fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
14034 ptr.untyped()
14035 }
14036}
14037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14038pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
14039impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
14040 const OPTIONAL_KIND: Option<SyntaxKind> =
14041 Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14042 type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
14043 type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
14044 fn missing(db: &'db dyn Database) -> Self::Green {
14045 OptionVisibilityPubArgumentClauseEmptyGreen(
14046 GreenNode {
14047 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14048 details: GreenNodeDetails::Node {
14049 children: [].into(),
14050 width: TextWidth::default(),
14051 },
14052 }
14053 .intern(db),
14054 )
14055 }
14056 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14057 let kind = node.kind(db);
14058 assert_eq!(
14059 kind,
14060 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14061 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14062 kind,
14063 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14064 );
14065 Self { node }
14066 }
14067 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14068 let kind = node.kind(db);
14069 if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14070 Some(Self::from_syntax_node(db, node))
14071 } else {
14072 None
14073 }
14074 }
14075 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14076 self.node
14077 }
14078 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14079 OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
14080 }
14081}
14082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14083pub struct VisibilityPub<'db> {
14084 node: SyntaxNode<'db>,
14085}
14086impl<'db> VisibilityPub<'db> {
14087 pub const INDEX_PUB_KW: usize = 0;
14088 pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14089 pub fn new_green(
14090 db: &'db dyn Database,
14091 pub_kw: TerminalPubGreen<'db>,
14092 argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
14093 ) -> VisibilityPubGreen<'db> {
14094 let children = [pub_kw.0, argument_clause.0];
14095 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14096 VisibilityPubGreen(
14097 GreenNode {
14098 kind: SyntaxKind::VisibilityPub,
14099 details: GreenNodeDetails::Node { children: children.into(), width },
14100 }
14101 .intern(db),
14102 )
14103 }
14104}
14105impl<'db> VisibilityPub<'db> {
14106 pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14107 TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14108 }
14109 pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14110 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14111 }
14112}
14113#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14114pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14115impl<'db> VisibilityPubPtr<'db> {}
14116impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14117 type SyntaxNode = VisibilityPub<'db>;
14118 fn untyped(self) -> SyntaxStablePtrId<'db> {
14119 self.0
14120 }
14121 fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14122 VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14123 }
14124}
14125impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14126 fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14127 ptr.untyped()
14128 }
14129}
14130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14131pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14132impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14133 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14134 type StablePtr = VisibilityPubPtr<'db>;
14135 type Green = VisibilityPubGreen<'db>;
14136 fn missing(db: &'db dyn Database) -> Self::Green {
14137 VisibilityPubGreen(
14138 GreenNode {
14139 kind: SyntaxKind::VisibilityPub,
14140 details: GreenNodeDetails::Node {
14141 children: [
14142 TerminalPub::missing(db).0,
14143 OptionVisibilityPubArgumentClause::missing(db).0,
14144 ]
14145 .into(),
14146 width: TextWidth::default(),
14147 },
14148 }
14149 .intern(db),
14150 )
14151 }
14152 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14153 let kind = node.kind(db);
14154 assert_eq!(
14155 kind,
14156 SyntaxKind::VisibilityPub,
14157 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14158 kind,
14159 SyntaxKind::VisibilityPub
14160 );
14161 Self { node }
14162 }
14163 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14164 let kind = node.kind(db);
14165 if kind == SyntaxKind::VisibilityPub {
14166 Some(Self::from_syntax_node(db, node))
14167 } else {
14168 None
14169 }
14170 }
14171 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14172 self.node
14173 }
14174 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14175 VisibilityPubPtr(self.node.stable_ptr(db))
14176 }
14177}
14178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14179pub enum Visibility<'db> {
14180 Default(VisibilityDefault<'db>),
14181 Pub(VisibilityPub<'db>),
14182}
14183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14184pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14185impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14186 type SyntaxNode = Visibility<'db>;
14187 fn untyped(self) -> SyntaxStablePtrId<'db> {
14188 self.0
14189 }
14190 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14191 Visibility::from_syntax_node(db, self.0.lookup(db))
14192 }
14193}
14194impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14195 fn from(ptr: VisibilityPtr<'db>) -> Self {
14196 ptr.untyped()
14197 }
14198}
14199impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14200 fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14201 Self(value.0)
14202 }
14203}
14204impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14205 fn from(value: VisibilityPubPtr<'db>) -> Self {
14206 Self(value.0)
14207 }
14208}
14209impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14210 fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14211 Self(value.0)
14212 }
14213}
14214impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14215 fn from(value: VisibilityPubGreen<'db>) -> Self {
14216 Self(value.0)
14217 }
14218}
14219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14220pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14221impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14222 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14223 type StablePtr = VisibilityPtr<'db>;
14224 type Green = VisibilityGreen<'db>;
14225 fn missing(db: &'db dyn Database) -> Self::Green {
14226 panic!("No missing variant.");
14227 }
14228 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14229 let kind = node.kind(db);
14230 match kind {
14231 SyntaxKind::VisibilityDefault => {
14232 Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14233 }
14234 SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14235 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14236 }
14237 }
14238 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14239 let kind = node.kind(db);
14240 match kind {
14241 SyntaxKind::VisibilityDefault => {
14242 Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14243 }
14244 SyntaxKind::VisibilityPub => {
14245 Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14246 }
14247 _ => None,
14248 }
14249 }
14250 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14251 match self {
14252 Visibility::Default(x) => x.as_syntax_node(),
14253 Visibility::Pub(x) => x.as_syntax_node(),
14254 }
14255 }
14256 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14257 VisibilityPtr(self.as_syntax_node().long(db).stable_ptr)
14258 }
14259}
14260impl<'db> Visibility<'db> {
14261 pub fn is_variant(kind: SyntaxKind) -> bool {
14263 matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14264 }
14265}
14266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14267pub struct ItemModule<'db> {
14268 node: SyntaxNode<'db>,
14269}
14270impl<'db> ItemModule<'db> {
14271 pub const INDEX_ATTRIBUTES: usize = 0;
14272 pub const INDEX_VISIBILITY: usize = 1;
14273 pub const INDEX_MODULE_KW: usize = 2;
14274 pub const INDEX_NAME: usize = 3;
14275 pub const INDEX_BODY: usize = 4;
14276 pub fn new_green(
14277 db: &'db dyn Database,
14278 attributes: AttributeListGreen<'db>,
14279 visibility: VisibilityGreen<'db>,
14280 module_kw: TerminalModuleGreen<'db>,
14281 name: TerminalIdentifierGreen<'db>,
14282 body: MaybeModuleBodyGreen<'db>,
14283 ) -> ItemModuleGreen<'db> {
14284 let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14285 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14286 ItemModuleGreen(
14287 GreenNode {
14288 kind: SyntaxKind::ItemModule,
14289 details: GreenNodeDetails::Node { children: children.into(), width },
14290 }
14291 .intern(db),
14292 )
14293 }
14294}
14295impl<'db> ItemModule<'db> {
14296 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14297 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14298 }
14299 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14300 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14301 }
14302 pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14303 TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14304 }
14305 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14306 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14307 }
14308 pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14309 MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14310 }
14311}
14312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14313pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14314impl<'db> ItemModulePtr<'db> {
14315 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14316 let ptr = self.0.long(db);
14317 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14318 TerminalIdentifierGreen(key_fields[0])
14319 } else {
14320 panic!("Unexpected key field query on root.");
14321 }
14322 }
14323}
14324impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14325 type SyntaxNode = ItemModule<'db>;
14326 fn untyped(self) -> SyntaxStablePtrId<'db> {
14327 self.0
14328 }
14329 fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14330 ItemModule::from_syntax_node(db, self.0.lookup(db))
14331 }
14332}
14333impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14334 fn from(ptr: ItemModulePtr<'db>) -> Self {
14335 ptr.untyped()
14336 }
14337}
14338#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14339pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14340impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14341 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14342 type StablePtr = ItemModulePtr<'db>;
14343 type Green = ItemModuleGreen<'db>;
14344 fn missing(db: &'db dyn Database) -> Self::Green {
14345 ItemModuleGreen(
14346 GreenNode {
14347 kind: SyntaxKind::ItemModule,
14348 details: GreenNodeDetails::Node {
14349 children: [
14350 AttributeList::missing(db).0,
14351 Visibility::missing(db).0,
14352 TerminalModule::missing(db).0,
14353 TerminalIdentifier::missing(db).0,
14354 MaybeModuleBody::missing(db).0,
14355 ]
14356 .into(),
14357 width: TextWidth::default(),
14358 },
14359 }
14360 .intern(db),
14361 )
14362 }
14363 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14364 let kind = node.kind(db);
14365 assert_eq!(
14366 kind,
14367 SyntaxKind::ItemModule,
14368 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14369 kind,
14370 SyntaxKind::ItemModule
14371 );
14372 Self { node }
14373 }
14374 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14375 let kind = node.kind(db);
14376 if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14377 }
14378 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14379 self.node
14380 }
14381 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14382 ItemModulePtr(self.node.stable_ptr(db))
14383 }
14384}
14385#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14386pub enum MaybeModuleBody<'db> {
14387 Some(ModuleBody<'db>),
14388 None(TerminalSemicolon<'db>),
14389}
14390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14391pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14392impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14393 type SyntaxNode = MaybeModuleBody<'db>;
14394 fn untyped(self) -> SyntaxStablePtrId<'db> {
14395 self.0
14396 }
14397 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14398 MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14399 }
14400}
14401impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14402 fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14403 ptr.untyped()
14404 }
14405}
14406impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14407 fn from(value: ModuleBodyPtr<'db>) -> Self {
14408 Self(value.0)
14409 }
14410}
14411impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14412 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14413 Self(value.0)
14414 }
14415}
14416impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14417 fn from(value: ModuleBodyGreen<'db>) -> Self {
14418 Self(value.0)
14419 }
14420}
14421impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14422 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14423 Self(value.0)
14424 }
14425}
14426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14427pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14428impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14429 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14430 type StablePtr = MaybeModuleBodyPtr<'db>;
14431 type Green = MaybeModuleBodyGreen<'db>;
14432 fn missing(db: &'db dyn Database) -> Self::Green {
14433 panic!("No missing variant.");
14434 }
14435 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14436 let kind = node.kind(db);
14437 match kind {
14438 SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14439 SyntaxKind::TerminalSemicolon => {
14440 MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14441 }
14442 _ => {
14443 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14444 }
14445 }
14446 }
14447 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14448 let kind = node.kind(db);
14449 match kind {
14450 SyntaxKind::ModuleBody => {
14451 Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14452 }
14453 SyntaxKind::TerminalSemicolon => {
14454 Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14455 }
14456 _ => None,
14457 }
14458 }
14459 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14460 match self {
14461 MaybeModuleBody::Some(x) => x.as_syntax_node(),
14462 MaybeModuleBody::None(x) => x.as_syntax_node(),
14463 }
14464 }
14465 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14466 MaybeModuleBodyPtr(self.as_syntax_node().long(db).stable_ptr)
14467 }
14468}
14469impl<'db> MaybeModuleBody<'db> {
14470 pub fn is_variant(kind: SyntaxKind) -> bool {
14472 matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14473 }
14474}
14475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14476pub struct ModuleBody<'db> {
14477 node: SyntaxNode<'db>,
14478}
14479impl<'db> ModuleBody<'db> {
14480 pub const INDEX_LBRACE: usize = 0;
14481 pub const INDEX_ITEMS: usize = 1;
14482 pub const INDEX_RBRACE: usize = 2;
14483 pub fn new_green(
14484 db: &'db dyn Database,
14485 lbrace: TerminalLBraceGreen<'db>,
14486 items: ModuleItemListGreen<'db>,
14487 rbrace: TerminalRBraceGreen<'db>,
14488 ) -> ModuleBodyGreen<'db> {
14489 let children = [lbrace.0, items.0, rbrace.0];
14490 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14491 ModuleBodyGreen(
14492 GreenNode {
14493 kind: SyntaxKind::ModuleBody,
14494 details: GreenNodeDetails::Node { children: children.into(), width },
14495 }
14496 .intern(db),
14497 )
14498 }
14499}
14500impl<'db> ModuleBody<'db> {
14501 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14502 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14503 }
14504 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14505 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14506 }
14507 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14508 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14509 }
14510}
14511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14512pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14513impl<'db> ModuleBodyPtr<'db> {}
14514impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14515 type SyntaxNode = ModuleBody<'db>;
14516 fn untyped(self) -> SyntaxStablePtrId<'db> {
14517 self.0
14518 }
14519 fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14520 ModuleBody::from_syntax_node(db, self.0.lookup(db))
14521 }
14522}
14523impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14524 fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14525 ptr.untyped()
14526 }
14527}
14528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14529pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14530impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14531 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14532 type StablePtr = ModuleBodyPtr<'db>;
14533 type Green = ModuleBodyGreen<'db>;
14534 fn missing(db: &'db dyn Database) -> Self::Green {
14535 ModuleBodyGreen(
14536 GreenNode {
14537 kind: SyntaxKind::ModuleBody,
14538 details: GreenNodeDetails::Node {
14539 children: [
14540 TerminalLBrace::missing(db).0,
14541 ModuleItemList::missing(db).0,
14542 TerminalRBrace::missing(db).0,
14543 ]
14544 .into(),
14545 width: TextWidth::default(),
14546 },
14547 }
14548 .intern(db),
14549 )
14550 }
14551 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14552 let kind = node.kind(db);
14553 assert_eq!(
14554 kind,
14555 SyntaxKind::ModuleBody,
14556 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14557 kind,
14558 SyntaxKind::ModuleBody
14559 );
14560 Self { node }
14561 }
14562 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14563 let kind = node.kind(db);
14564 if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14565 }
14566 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14567 self.node
14568 }
14569 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14570 ModuleBodyPtr(self.node.stable_ptr(db))
14571 }
14572}
14573#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14574pub struct FunctionDeclaration<'db> {
14575 node: SyntaxNode<'db>,
14576}
14577impl<'db> FunctionDeclaration<'db> {
14578 pub const INDEX_OPTIONAL_CONST: usize = 0;
14579 pub const INDEX_FUNCTION_KW: usize = 1;
14580 pub const INDEX_NAME: usize = 2;
14581 pub const INDEX_GENERIC_PARAMS: usize = 3;
14582 pub const INDEX_SIGNATURE: usize = 4;
14583 pub fn new_green(
14584 db: &'db dyn Database,
14585 optional_const: OptionTerminalConstGreen<'db>,
14586 function_kw: TerminalFunctionGreen<'db>,
14587 name: TerminalIdentifierGreen<'db>,
14588 generic_params: OptionWrappedGenericParamListGreen<'db>,
14589 signature: FunctionSignatureGreen<'db>,
14590 ) -> FunctionDeclarationGreen<'db> {
14591 let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14592 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14593 FunctionDeclarationGreen(
14594 GreenNode {
14595 kind: SyntaxKind::FunctionDeclaration,
14596 details: GreenNodeDetails::Node { children: children.into(), width },
14597 }
14598 .intern(db),
14599 )
14600 }
14601}
14602impl<'db> FunctionDeclaration<'db> {
14603 pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14604 OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14605 }
14606 pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14607 TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14608 }
14609 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14610 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14611 }
14612 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14613 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14614 }
14615 pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14616 FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14617 }
14618}
14619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14620pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14621impl<'db> FunctionDeclarationPtr<'db> {
14622 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14623 let ptr = self.0.long(db);
14624 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14625 TerminalIdentifierGreen(key_fields[0])
14626 } else {
14627 panic!("Unexpected key field query on root.");
14628 }
14629 }
14630}
14631impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14632 type SyntaxNode = FunctionDeclaration<'db>;
14633 fn untyped(self) -> SyntaxStablePtrId<'db> {
14634 self.0
14635 }
14636 fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14637 FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14638 }
14639}
14640impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14641 fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14642 ptr.untyped()
14643 }
14644}
14645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14646pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14647impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14648 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14649 type StablePtr = FunctionDeclarationPtr<'db>;
14650 type Green = FunctionDeclarationGreen<'db>;
14651 fn missing(db: &'db dyn Database) -> Self::Green {
14652 FunctionDeclarationGreen(
14653 GreenNode {
14654 kind: SyntaxKind::FunctionDeclaration,
14655 details: GreenNodeDetails::Node {
14656 children: [
14657 OptionTerminalConst::missing(db).0,
14658 TerminalFunction::missing(db).0,
14659 TerminalIdentifier::missing(db).0,
14660 OptionWrappedGenericParamList::missing(db).0,
14661 FunctionSignature::missing(db).0,
14662 ]
14663 .into(),
14664 width: TextWidth::default(),
14665 },
14666 }
14667 .intern(db),
14668 )
14669 }
14670 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14671 let kind = node.kind(db);
14672 assert_eq!(
14673 kind,
14674 SyntaxKind::FunctionDeclaration,
14675 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14676 kind,
14677 SyntaxKind::FunctionDeclaration
14678 );
14679 Self { node }
14680 }
14681 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14682 let kind = node.kind(db);
14683 if kind == SyntaxKind::FunctionDeclaration {
14684 Some(Self::from_syntax_node(db, node))
14685 } else {
14686 None
14687 }
14688 }
14689 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14690 self.node
14691 }
14692 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14693 FunctionDeclarationPtr(self.node.stable_ptr(db))
14694 }
14695}
14696#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14697pub struct ItemConstant<'db> {
14698 node: SyntaxNode<'db>,
14699}
14700impl<'db> ItemConstant<'db> {
14701 pub const INDEX_ATTRIBUTES: usize = 0;
14702 pub const INDEX_VISIBILITY: usize = 1;
14703 pub const INDEX_CONST_KW: usize = 2;
14704 pub const INDEX_NAME: usize = 3;
14705 pub const INDEX_TYPE_CLAUSE: usize = 4;
14706 pub const INDEX_EQ: usize = 5;
14707 pub const INDEX_VALUE: usize = 6;
14708 pub const INDEX_SEMICOLON: usize = 7;
14709 pub fn new_green(
14710 db: &'db dyn Database,
14711 attributes: AttributeListGreen<'db>,
14712 visibility: VisibilityGreen<'db>,
14713 const_kw: TerminalConstGreen<'db>,
14714 name: TerminalIdentifierGreen<'db>,
14715 type_clause: TypeClauseGreen<'db>,
14716 eq: TerminalEqGreen<'db>,
14717 value: ExprGreen<'db>,
14718 semicolon: TerminalSemicolonGreen<'db>,
14719 ) -> ItemConstantGreen<'db> {
14720 let children = [
14721 attributes.0,
14722 visibility.0,
14723 const_kw.0,
14724 name.0,
14725 type_clause.0,
14726 eq.0,
14727 value.0,
14728 semicolon.0,
14729 ];
14730 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14731 ItemConstantGreen(
14732 GreenNode {
14733 kind: SyntaxKind::ItemConstant,
14734 details: GreenNodeDetails::Node { children: children.into(), width },
14735 }
14736 .intern(db),
14737 )
14738 }
14739}
14740impl<'db> ItemConstant<'db> {
14741 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14742 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14743 }
14744 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14745 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14746 }
14747 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14748 TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14749 }
14750 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14751 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14752 }
14753 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14754 TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14755 }
14756 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14757 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14758 }
14759 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14760 Expr::from_syntax_node(db, self.node.get_children(db)[6])
14761 }
14762 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14763 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14764 }
14765}
14766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14767pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14768impl<'db> ItemConstantPtr<'db> {
14769 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14770 let ptr = self.0.long(db);
14771 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14772 TerminalIdentifierGreen(key_fields[0])
14773 } else {
14774 panic!("Unexpected key field query on root.");
14775 }
14776 }
14777}
14778impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14779 type SyntaxNode = ItemConstant<'db>;
14780 fn untyped(self) -> SyntaxStablePtrId<'db> {
14781 self.0
14782 }
14783 fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14784 ItemConstant::from_syntax_node(db, self.0.lookup(db))
14785 }
14786}
14787impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14788 fn from(ptr: ItemConstantPtr<'db>) -> Self {
14789 ptr.untyped()
14790 }
14791}
14792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14793pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14794impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14795 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14796 type StablePtr = ItemConstantPtr<'db>;
14797 type Green = ItemConstantGreen<'db>;
14798 fn missing(db: &'db dyn Database) -> Self::Green {
14799 ItemConstantGreen(
14800 GreenNode {
14801 kind: SyntaxKind::ItemConstant,
14802 details: GreenNodeDetails::Node {
14803 children: [
14804 AttributeList::missing(db).0,
14805 Visibility::missing(db).0,
14806 TerminalConst::missing(db).0,
14807 TerminalIdentifier::missing(db).0,
14808 TypeClause::missing(db).0,
14809 TerminalEq::missing(db).0,
14810 Expr::missing(db).0,
14811 TerminalSemicolon::missing(db).0,
14812 ]
14813 .into(),
14814 width: TextWidth::default(),
14815 },
14816 }
14817 .intern(db),
14818 )
14819 }
14820 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14821 let kind = node.kind(db);
14822 assert_eq!(
14823 kind,
14824 SyntaxKind::ItemConstant,
14825 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14826 kind,
14827 SyntaxKind::ItemConstant
14828 );
14829 Self { node }
14830 }
14831 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14832 let kind = node.kind(db);
14833 if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14834 }
14835 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14836 self.node
14837 }
14838 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14839 ItemConstantPtr(self.node.stable_ptr(db))
14840 }
14841}
14842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14843pub struct FunctionWithBody<'db> {
14844 node: SyntaxNode<'db>,
14845}
14846impl<'db> FunctionWithBody<'db> {
14847 pub const INDEX_ATTRIBUTES: usize = 0;
14848 pub const INDEX_VISIBILITY: usize = 1;
14849 pub const INDEX_DECLARATION: usize = 2;
14850 pub const INDEX_BODY: usize = 3;
14851 pub fn new_green(
14852 db: &'db dyn Database,
14853 attributes: AttributeListGreen<'db>,
14854 visibility: VisibilityGreen<'db>,
14855 declaration: FunctionDeclarationGreen<'db>,
14856 body: ExprBlockGreen<'db>,
14857 ) -> FunctionWithBodyGreen<'db> {
14858 let children = [attributes.0, visibility.0, declaration.0, body.0];
14859 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14860 FunctionWithBodyGreen(
14861 GreenNode {
14862 kind: SyntaxKind::FunctionWithBody,
14863 details: GreenNodeDetails::Node { children: children.into(), width },
14864 }
14865 .intern(db),
14866 )
14867 }
14868}
14869impl<'db> FunctionWithBody<'db> {
14870 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14871 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14872 }
14873 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14874 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14875 }
14876 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14877 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14878 }
14879 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14880 ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14881 }
14882}
14883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14884pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14885impl<'db> FunctionWithBodyPtr<'db> {
14886 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14887 let ptr = self.0.long(db);
14888 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14889 FunctionDeclarationGreen(key_fields[0])
14890 } else {
14891 panic!("Unexpected key field query on root.");
14892 }
14893 }
14894}
14895impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14896 type SyntaxNode = FunctionWithBody<'db>;
14897 fn untyped(self) -> SyntaxStablePtrId<'db> {
14898 self.0
14899 }
14900 fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14901 FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14902 }
14903}
14904impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14905 fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14906 ptr.untyped()
14907 }
14908}
14909#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14910pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14911impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14912 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14913 type StablePtr = FunctionWithBodyPtr<'db>;
14914 type Green = FunctionWithBodyGreen<'db>;
14915 fn missing(db: &'db dyn Database) -> Self::Green {
14916 FunctionWithBodyGreen(
14917 GreenNode {
14918 kind: SyntaxKind::FunctionWithBody,
14919 details: GreenNodeDetails::Node {
14920 children: [
14921 AttributeList::missing(db).0,
14922 Visibility::missing(db).0,
14923 FunctionDeclaration::missing(db).0,
14924 ExprBlock::missing(db).0,
14925 ]
14926 .into(),
14927 width: TextWidth::default(),
14928 },
14929 }
14930 .intern(db),
14931 )
14932 }
14933 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14934 let kind = node.kind(db);
14935 assert_eq!(
14936 kind,
14937 SyntaxKind::FunctionWithBody,
14938 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14939 kind,
14940 SyntaxKind::FunctionWithBody
14941 );
14942 Self { node }
14943 }
14944 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14945 let kind = node.kind(db);
14946 if kind == SyntaxKind::FunctionWithBody {
14947 Some(Self::from_syntax_node(db, node))
14948 } else {
14949 None
14950 }
14951 }
14952 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14953 self.node
14954 }
14955 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14956 FunctionWithBodyPtr(self.node.stable_ptr(db))
14957 }
14958}
14959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14960pub struct ItemExternFunction<'db> {
14961 node: SyntaxNode<'db>,
14962}
14963impl<'db> ItemExternFunction<'db> {
14964 pub const INDEX_ATTRIBUTES: usize = 0;
14965 pub const INDEX_VISIBILITY: usize = 1;
14966 pub const INDEX_EXTERN_KW: usize = 2;
14967 pub const INDEX_DECLARATION: usize = 3;
14968 pub const INDEX_SEMICOLON: usize = 4;
14969 pub fn new_green(
14970 db: &'db dyn Database,
14971 attributes: AttributeListGreen<'db>,
14972 visibility: VisibilityGreen<'db>,
14973 extern_kw: TerminalExternGreen<'db>,
14974 declaration: FunctionDeclarationGreen<'db>,
14975 semicolon: TerminalSemicolonGreen<'db>,
14976 ) -> ItemExternFunctionGreen<'db> {
14977 let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14978 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14979 ItemExternFunctionGreen(
14980 GreenNode {
14981 kind: SyntaxKind::ItemExternFunction,
14982 details: GreenNodeDetails::Node { children: children.into(), width },
14983 }
14984 .intern(db),
14985 )
14986 }
14987}
14988impl<'db> ItemExternFunction<'db> {
14989 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14990 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14991 }
14992 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14993 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14994 }
14995 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14996 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14997 }
14998 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14999 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
15000 }
15001 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15002 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15003 }
15004}
15005#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15006pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15007impl<'db> ItemExternFunctionPtr<'db> {
15008 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15009 let ptr = self.0.long(db);
15010 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15011 FunctionDeclarationGreen(key_fields[0])
15012 } else {
15013 panic!("Unexpected key field query on root.");
15014 }
15015 }
15016}
15017impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
15018 type SyntaxNode = ItemExternFunction<'db>;
15019 fn untyped(self) -> SyntaxStablePtrId<'db> {
15020 self.0
15021 }
15022 fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
15023 ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
15024 }
15025}
15026impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15027 fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
15028 ptr.untyped()
15029 }
15030}
15031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15032pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
15033impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
15034 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
15035 type StablePtr = ItemExternFunctionPtr<'db>;
15036 type Green = ItemExternFunctionGreen<'db>;
15037 fn missing(db: &'db dyn Database) -> Self::Green {
15038 ItemExternFunctionGreen(
15039 GreenNode {
15040 kind: SyntaxKind::ItemExternFunction,
15041 details: GreenNodeDetails::Node {
15042 children: [
15043 AttributeList::missing(db).0,
15044 Visibility::missing(db).0,
15045 TerminalExtern::missing(db).0,
15046 FunctionDeclaration::missing(db).0,
15047 TerminalSemicolon::missing(db).0,
15048 ]
15049 .into(),
15050 width: TextWidth::default(),
15051 },
15052 }
15053 .intern(db),
15054 )
15055 }
15056 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15057 let kind = node.kind(db);
15058 assert_eq!(
15059 kind,
15060 SyntaxKind::ItemExternFunction,
15061 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15062 kind,
15063 SyntaxKind::ItemExternFunction
15064 );
15065 Self { node }
15066 }
15067 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15068 let kind = node.kind(db);
15069 if kind == SyntaxKind::ItemExternFunction {
15070 Some(Self::from_syntax_node(db, node))
15071 } else {
15072 None
15073 }
15074 }
15075 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15076 self.node
15077 }
15078 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15079 ItemExternFunctionPtr(self.node.stable_ptr(db))
15080 }
15081}
15082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15083pub struct ItemExternType<'db> {
15084 node: SyntaxNode<'db>,
15085}
15086impl<'db> ItemExternType<'db> {
15087 pub const INDEX_ATTRIBUTES: usize = 0;
15088 pub const INDEX_VISIBILITY: usize = 1;
15089 pub const INDEX_EXTERN_KW: usize = 2;
15090 pub const INDEX_TYPE_KW: usize = 3;
15091 pub const INDEX_NAME: usize = 4;
15092 pub const INDEX_GENERIC_PARAMS: usize = 5;
15093 pub const INDEX_SEMICOLON: usize = 6;
15094 pub fn new_green(
15095 db: &'db dyn Database,
15096 attributes: AttributeListGreen<'db>,
15097 visibility: VisibilityGreen<'db>,
15098 extern_kw: TerminalExternGreen<'db>,
15099 type_kw: TerminalTypeGreen<'db>,
15100 name: TerminalIdentifierGreen<'db>,
15101 generic_params: OptionWrappedGenericParamListGreen<'db>,
15102 semicolon: TerminalSemicolonGreen<'db>,
15103 ) -> ItemExternTypeGreen<'db> {
15104 let children = [
15105 attributes.0,
15106 visibility.0,
15107 extern_kw.0,
15108 type_kw.0,
15109 name.0,
15110 generic_params.0,
15111 semicolon.0,
15112 ];
15113 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15114 ItemExternTypeGreen(
15115 GreenNode {
15116 kind: SyntaxKind::ItemExternType,
15117 details: GreenNodeDetails::Node { children: children.into(), width },
15118 }
15119 .intern(db),
15120 )
15121 }
15122}
15123impl<'db> ItemExternType<'db> {
15124 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15125 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15126 }
15127 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15128 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15129 }
15130 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15131 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15132 }
15133 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15134 TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15135 }
15136 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15137 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15138 }
15139 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15140 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15141 }
15142 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15143 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15144 }
15145}
15146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15147pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15148impl<'db> ItemExternTypePtr<'db> {
15149 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15150 let ptr = self.0.long(db);
15151 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15152 TerminalIdentifierGreen(key_fields[0])
15153 } else {
15154 panic!("Unexpected key field query on root.");
15155 }
15156 }
15157}
15158impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15159 type SyntaxNode = ItemExternType<'db>;
15160 fn untyped(self) -> SyntaxStablePtrId<'db> {
15161 self.0
15162 }
15163 fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15164 ItemExternType::from_syntax_node(db, self.0.lookup(db))
15165 }
15166}
15167impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15168 fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15169 ptr.untyped()
15170 }
15171}
15172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15173pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15174impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15175 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15176 type StablePtr = ItemExternTypePtr<'db>;
15177 type Green = ItemExternTypeGreen<'db>;
15178 fn missing(db: &'db dyn Database) -> Self::Green {
15179 ItemExternTypeGreen(
15180 GreenNode {
15181 kind: SyntaxKind::ItemExternType,
15182 details: GreenNodeDetails::Node {
15183 children: [
15184 AttributeList::missing(db).0,
15185 Visibility::missing(db).0,
15186 TerminalExtern::missing(db).0,
15187 TerminalType::missing(db).0,
15188 TerminalIdentifier::missing(db).0,
15189 OptionWrappedGenericParamList::missing(db).0,
15190 TerminalSemicolon::missing(db).0,
15191 ]
15192 .into(),
15193 width: TextWidth::default(),
15194 },
15195 }
15196 .intern(db),
15197 )
15198 }
15199 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15200 let kind = node.kind(db);
15201 assert_eq!(
15202 kind,
15203 SyntaxKind::ItemExternType,
15204 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15205 kind,
15206 SyntaxKind::ItemExternType
15207 );
15208 Self { node }
15209 }
15210 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15211 let kind = node.kind(db);
15212 if kind == SyntaxKind::ItemExternType {
15213 Some(Self::from_syntax_node(db, node))
15214 } else {
15215 None
15216 }
15217 }
15218 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15219 self.node
15220 }
15221 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15222 ItemExternTypePtr(self.node.stable_ptr(db))
15223 }
15224}
15225#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15226pub struct ItemTrait<'db> {
15227 node: SyntaxNode<'db>,
15228}
15229impl<'db> ItemTrait<'db> {
15230 pub const INDEX_ATTRIBUTES: usize = 0;
15231 pub const INDEX_VISIBILITY: usize = 1;
15232 pub const INDEX_TRAIT_KW: usize = 2;
15233 pub const INDEX_NAME: usize = 3;
15234 pub const INDEX_GENERIC_PARAMS: usize = 4;
15235 pub const INDEX_BODY: usize = 5;
15236 pub fn new_green(
15237 db: &'db dyn Database,
15238 attributes: AttributeListGreen<'db>,
15239 visibility: VisibilityGreen<'db>,
15240 trait_kw: TerminalTraitGreen<'db>,
15241 name: TerminalIdentifierGreen<'db>,
15242 generic_params: OptionWrappedGenericParamListGreen<'db>,
15243 body: MaybeTraitBodyGreen<'db>,
15244 ) -> ItemTraitGreen<'db> {
15245 let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15246 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15247 ItemTraitGreen(
15248 GreenNode {
15249 kind: SyntaxKind::ItemTrait,
15250 details: GreenNodeDetails::Node { children: children.into(), width },
15251 }
15252 .intern(db),
15253 )
15254 }
15255}
15256impl<'db> ItemTrait<'db> {
15257 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15258 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15259 }
15260 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15261 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15262 }
15263 pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15264 TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15265 }
15266 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15267 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15268 }
15269 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15270 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15271 }
15272 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15273 MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15274 }
15275}
15276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15277pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15278impl<'db> ItemTraitPtr<'db> {
15279 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15280 let ptr = self.0.long(db);
15281 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15282 TerminalIdentifierGreen(key_fields[0])
15283 } else {
15284 panic!("Unexpected key field query on root.");
15285 }
15286 }
15287}
15288impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15289 type SyntaxNode = ItemTrait<'db>;
15290 fn untyped(self) -> SyntaxStablePtrId<'db> {
15291 self.0
15292 }
15293 fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15294 ItemTrait::from_syntax_node(db, self.0.lookup(db))
15295 }
15296}
15297impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15298 fn from(ptr: ItemTraitPtr<'db>) -> Self {
15299 ptr.untyped()
15300 }
15301}
15302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15303pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15304impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15305 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15306 type StablePtr = ItemTraitPtr<'db>;
15307 type Green = ItemTraitGreen<'db>;
15308 fn missing(db: &'db dyn Database) -> Self::Green {
15309 ItemTraitGreen(
15310 GreenNode {
15311 kind: SyntaxKind::ItemTrait,
15312 details: GreenNodeDetails::Node {
15313 children: [
15314 AttributeList::missing(db).0,
15315 Visibility::missing(db).0,
15316 TerminalTrait::missing(db).0,
15317 TerminalIdentifier::missing(db).0,
15318 OptionWrappedGenericParamList::missing(db).0,
15319 MaybeTraitBody::missing(db).0,
15320 ]
15321 .into(),
15322 width: TextWidth::default(),
15323 },
15324 }
15325 .intern(db),
15326 )
15327 }
15328 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15329 let kind = node.kind(db);
15330 assert_eq!(
15331 kind,
15332 SyntaxKind::ItemTrait,
15333 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15334 kind,
15335 SyntaxKind::ItemTrait
15336 );
15337 Self { node }
15338 }
15339 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15340 let kind = node.kind(db);
15341 if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15342 }
15343 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15344 self.node
15345 }
15346 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15347 ItemTraitPtr(self.node.stable_ptr(db))
15348 }
15349}
15350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15351pub enum MaybeTraitBody<'db> {
15352 Some(TraitBody<'db>),
15353 None(TerminalSemicolon<'db>),
15354}
15355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15356pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15357impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15358 type SyntaxNode = MaybeTraitBody<'db>;
15359 fn untyped(self) -> SyntaxStablePtrId<'db> {
15360 self.0
15361 }
15362 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15363 MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15364 }
15365}
15366impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15367 fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15368 ptr.untyped()
15369 }
15370}
15371impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15372 fn from(value: TraitBodyPtr<'db>) -> Self {
15373 Self(value.0)
15374 }
15375}
15376impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15377 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15378 Self(value.0)
15379 }
15380}
15381impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15382 fn from(value: TraitBodyGreen<'db>) -> Self {
15383 Self(value.0)
15384 }
15385}
15386impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15387 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15388 Self(value.0)
15389 }
15390}
15391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15392pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15393impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15394 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15395 type StablePtr = MaybeTraitBodyPtr<'db>;
15396 type Green = MaybeTraitBodyGreen<'db>;
15397 fn missing(db: &'db dyn Database) -> Self::Green {
15398 panic!("No missing variant.");
15399 }
15400 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15401 let kind = node.kind(db);
15402 match kind {
15403 SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15404 SyntaxKind::TerminalSemicolon => {
15405 MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15406 }
15407 _ => {
15408 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15409 }
15410 }
15411 }
15412 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15413 let kind = node.kind(db);
15414 match kind {
15415 SyntaxKind::TraitBody => {
15416 Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15417 }
15418 SyntaxKind::TerminalSemicolon => {
15419 Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15420 }
15421 _ => None,
15422 }
15423 }
15424 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15425 match self {
15426 MaybeTraitBody::Some(x) => x.as_syntax_node(),
15427 MaybeTraitBody::None(x) => x.as_syntax_node(),
15428 }
15429 }
15430 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15431 MaybeTraitBodyPtr(self.as_syntax_node().long(db).stable_ptr)
15432 }
15433}
15434impl<'db> MaybeTraitBody<'db> {
15435 pub fn is_variant(kind: SyntaxKind) -> bool {
15437 matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15438 }
15439}
15440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15441pub struct TraitBody<'db> {
15442 node: SyntaxNode<'db>,
15443}
15444impl<'db> TraitBody<'db> {
15445 pub const INDEX_LBRACE: usize = 0;
15446 pub const INDEX_ITEMS: usize = 1;
15447 pub const INDEX_RBRACE: usize = 2;
15448 pub fn new_green(
15449 db: &'db dyn Database,
15450 lbrace: TerminalLBraceGreen<'db>,
15451 items: TraitItemListGreen<'db>,
15452 rbrace: TerminalRBraceGreen<'db>,
15453 ) -> TraitBodyGreen<'db> {
15454 let children = [lbrace.0, items.0, rbrace.0];
15455 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15456 TraitBodyGreen(
15457 GreenNode {
15458 kind: SyntaxKind::TraitBody,
15459 details: GreenNodeDetails::Node { children: children.into(), width },
15460 }
15461 .intern(db),
15462 )
15463 }
15464}
15465impl<'db> TraitBody<'db> {
15466 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15467 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15468 }
15469 pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15470 TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15471 }
15472 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15473 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15474 }
15475}
15476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15477pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15478impl<'db> TraitBodyPtr<'db> {}
15479impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15480 type SyntaxNode = TraitBody<'db>;
15481 fn untyped(self) -> SyntaxStablePtrId<'db> {
15482 self.0
15483 }
15484 fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15485 TraitBody::from_syntax_node(db, self.0.lookup(db))
15486 }
15487}
15488impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15489 fn from(ptr: TraitBodyPtr<'db>) -> Self {
15490 ptr.untyped()
15491 }
15492}
15493#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15494pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15495impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15496 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15497 type StablePtr = TraitBodyPtr<'db>;
15498 type Green = TraitBodyGreen<'db>;
15499 fn missing(db: &'db dyn Database) -> Self::Green {
15500 TraitBodyGreen(
15501 GreenNode {
15502 kind: SyntaxKind::TraitBody,
15503 details: GreenNodeDetails::Node {
15504 children: [
15505 TerminalLBrace::missing(db).0,
15506 TraitItemList::missing(db).0,
15507 TerminalRBrace::missing(db).0,
15508 ]
15509 .into(),
15510 width: TextWidth::default(),
15511 },
15512 }
15513 .intern(db),
15514 )
15515 }
15516 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15517 let kind = node.kind(db);
15518 assert_eq!(
15519 kind,
15520 SyntaxKind::TraitBody,
15521 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15522 kind,
15523 SyntaxKind::TraitBody
15524 );
15525 Self { node }
15526 }
15527 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15528 let kind = node.kind(db);
15529 if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15530 }
15531 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15532 self.node
15533 }
15534 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15535 TraitBodyPtr(self.node.stable_ptr(db))
15536 }
15537}
15538#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15539pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15540impl<'db> Deref for TraitItemList<'db> {
15541 type Target = ElementList<'db, TraitItem<'db>, 1>;
15542 fn deref(&self) -> &Self::Target {
15543 &self.0
15544 }
15545}
15546impl<'db> TraitItemList<'db> {
15547 pub fn new_green(
15548 db: &'db dyn Database,
15549 children: &[TraitItemGreen<'db>],
15550 ) -> TraitItemListGreen<'db> {
15551 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15552 TraitItemListGreen(
15553 GreenNode {
15554 kind: SyntaxKind::TraitItemList,
15555 details: GreenNodeDetails::Node {
15556 children: children.iter().map(|x| x.0).collect(),
15557 width,
15558 },
15559 }
15560 .intern(db),
15561 )
15562 }
15563}
15564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15565pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15566impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15567 type SyntaxNode = TraitItemList<'db>;
15568 fn untyped(self) -> SyntaxStablePtrId<'db> {
15569 self.0
15570 }
15571 fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15572 TraitItemList::from_syntax_node(db, self.0.lookup(db))
15573 }
15574}
15575impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15576 fn from(ptr: TraitItemListPtr<'db>) -> Self {
15577 ptr.untyped()
15578 }
15579}
15580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15581pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15582impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15583 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15584 type StablePtr = TraitItemListPtr<'db>;
15585 type Green = TraitItemListGreen<'db>;
15586 fn missing(db: &'db dyn Database) -> Self::Green {
15587 TraitItemListGreen(
15588 GreenNode {
15589 kind: SyntaxKind::TraitItemList,
15590 details: GreenNodeDetails::Node {
15591 children: [].into(),
15592 width: TextWidth::default(),
15593 },
15594 }
15595 .intern(db),
15596 )
15597 }
15598 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15599 Self(ElementList::new(node))
15600 }
15601 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15602 if node.kind(db) == SyntaxKind::TraitItemList {
15603 Some(Self(ElementList::new(node)))
15604 } else {
15605 None
15606 }
15607 }
15608 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15609 self.node
15610 }
15611 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15612 TraitItemListPtr(self.node.stable_ptr(db))
15613 }
15614}
15615#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15616pub enum TraitItem<'db> {
15617 Function(TraitItemFunction<'db>),
15618 Type(TraitItemType<'db>),
15619 Constant(TraitItemConstant<'db>),
15620 Impl(TraitItemImpl<'db>),
15621 Missing(TraitItemMissing<'db>),
15622}
15623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15624pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15625impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15626 type SyntaxNode = TraitItem<'db>;
15627 fn untyped(self) -> SyntaxStablePtrId<'db> {
15628 self.0
15629 }
15630 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15631 TraitItem::from_syntax_node(db, self.0.lookup(db))
15632 }
15633}
15634impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15635 fn from(ptr: TraitItemPtr<'db>) -> Self {
15636 ptr.untyped()
15637 }
15638}
15639impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15640 fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15641 Self(value.0)
15642 }
15643}
15644impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15645 fn from(value: TraitItemTypePtr<'db>) -> Self {
15646 Self(value.0)
15647 }
15648}
15649impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15650 fn from(value: TraitItemConstantPtr<'db>) -> Self {
15651 Self(value.0)
15652 }
15653}
15654impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15655 fn from(value: TraitItemImplPtr<'db>) -> Self {
15656 Self(value.0)
15657 }
15658}
15659impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15660 fn from(value: TraitItemMissingPtr<'db>) -> Self {
15661 Self(value.0)
15662 }
15663}
15664impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15665 fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15666 Self(value.0)
15667 }
15668}
15669impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15670 fn from(value: TraitItemTypeGreen<'db>) -> Self {
15671 Self(value.0)
15672 }
15673}
15674impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15675 fn from(value: TraitItemConstantGreen<'db>) -> Self {
15676 Self(value.0)
15677 }
15678}
15679impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15680 fn from(value: TraitItemImplGreen<'db>) -> Self {
15681 Self(value.0)
15682 }
15683}
15684impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15685 fn from(value: TraitItemMissingGreen<'db>) -> Self {
15686 Self(value.0)
15687 }
15688}
15689#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15690pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15691impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15692 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15693 type StablePtr = TraitItemPtr<'db>;
15694 type Green = TraitItemGreen<'db>;
15695 fn missing(db: &'db dyn Database) -> Self::Green {
15696 TraitItemGreen(TraitItemMissing::missing(db).0)
15697 }
15698 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15699 let kind = node.kind(db);
15700 match kind {
15701 SyntaxKind::TraitItemFunction => {
15702 TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15703 }
15704 SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15705 SyntaxKind::TraitItemConstant => {
15706 TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15707 }
15708 SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15709 SyntaxKind::TraitItemMissing => {
15710 TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15711 }
15712 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15713 }
15714 }
15715 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15716 let kind = node.kind(db);
15717 match kind {
15718 SyntaxKind::TraitItemFunction => {
15719 Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15720 }
15721 SyntaxKind::TraitItemType => {
15722 Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15723 }
15724 SyntaxKind::TraitItemConstant => {
15725 Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15726 }
15727 SyntaxKind::TraitItemImpl => {
15728 Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15729 }
15730 SyntaxKind::TraitItemMissing => {
15731 Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15732 }
15733 _ => None,
15734 }
15735 }
15736 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15737 match self {
15738 TraitItem::Function(x) => x.as_syntax_node(),
15739 TraitItem::Type(x) => x.as_syntax_node(),
15740 TraitItem::Constant(x) => x.as_syntax_node(),
15741 TraitItem::Impl(x) => x.as_syntax_node(),
15742 TraitItem::Missing(x) => x.as_syntax_node(),
15743 }
15744 }
15745 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15746 TraitItemPtr(self.as_syntax_node().long(db).stable_ptr)
15747 }
15748}
15749impl<'db> TraitItem<'db> {
15750 pub fn is_variant(kind: SyntaxKind) -> bool {
15752 matches!(
15753 kind,
15754 SyntaxKind::TraitItemFunction
15755 | SyntaxKind::TraitItemType
15756 | SyntaxKind::TraitItemConstant
15757 | SyntaxKind::TraitItemImpl
15758 | SyntaxKind::TraitItemMissing
15759 )
15760 }
15761}
15762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15763pub struct TraitItemMissing<'db> {
15764 node: SyntaxNode<'db>,
15765}
15766impl<'db> TraitItemMissing<'db> {
15767 pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15768 let children = [];
15769 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15770 TraitItemMissingGreen(
15771 GreenNode {
15772 kind: SyntaxKind::TraitItemMissing,
15773 details: GreenNodeDetails::Node { children: children.into(), width },
15774 }
15775 .intern(db),
15776 )
15777 }
15778}
15779impl<'db> TraitItemMissing<'db> {}
15780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15781pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15782impl<'db> TraitItemMissingPtr<'db> {}
15783impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15784 type SyntaxNode = TraitItemMissing<'db>;
15785 fn untyped(self) -> SyntaxStablePtrId<'db> {
15786 self.0
15787 }
15788 fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15789 TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15790 }
15791}
15792impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15793 fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15794 ptr.untyped()
15795 }
15796}
15797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15798pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15799impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15800 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15801 type StablePtr = TraitItemMissingPtr<'db>;
15802 type Green = TraitItemMissingGreen<'db>;
15803 fn missing(db: &'db dyn Database) -> Self::Green {
15804 TraitItemMissingGreen(
15805 GreenNode {
15806 kind: SyntaxKind::TraitItemMissing,
15807 details: GreenNodeDetails::Node {
15808 children: [].into(),
15809 width: TextWidth::default(),
15810 },
15811 }
15812 .intern(db),
15813 )
15814 }
15815 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15816 let kind = node.kind(db);
15817 assert_eq!(
15818 kind,
15819 SyntaxKind::TraitItemMissing,
15820 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15821 kind,
15822 SyntaxKind::TraitItemMissing
15823 );
15824 Self { node }
15825 }
15826 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15827 let kind = node.kind(db);
15828 if kind == SyntaxKind::TraitItemMissing {
15829 Some(Self::from_syntax_node(db, node))
15830 } else {
15831 None
15832 }
15833 }
15834 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15835 self.node
15836 }
15837 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15838 TraitItemMissingPtr(self.node.stable_ptr(db))
15839 }
15840}
15841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15842pub struct TraitItemFunction<'db> {
15843 node: SyntaxNode<'db>,
15844}
15845impl<'db> TraitItemFunction<'db> {
15846 pub const INDEX_ATTRIBUTES: usize = 0;
15847 pub const INDEX_DECLARATION: usize = 1;
15848 pub const INDEX_BODY: usize = 2;
15849 pub fn new_green(
15850 db: &'db dyn Database,
15851 attributes: AttributeListGreen<'db>,
15852 declaration: FunctionDeclarationGreen<'db>,
15853 body: MaybeTraitFunctionBodyGreen<'db>,
15854 ) -> TraitItemFunctionGreen<'db> {
15855 let children = [attributes.0, declaration.0, body.0];
15856 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15857 TraitItemFunctionGreen(
15858 GreenNode {
15859 kind: SyntaxKind::TraitItemFunction,
15860 details: GreenNodeDetails::Node { children: children.into(), width },
15861 }
15862 .intern(db),
15863 )
15864 }
15865}
15866impl<'db> TraitItemFunction<'db> {
15867 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15868 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15869 }
15870 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15871 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15872 }
15873 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15874 MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15875 }
15876}
15877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15878pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15879impl<'db> TraitItemFunctionPtr<'db> {
15880 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15881 let ptr = self.0.long(db);
15882 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15883 FunctionDeclarationGreen(key_fields[0])
15884 } else {
15885 panic!("Unexpected key field query on root.");
15886 }
15887 }
15888}
15889impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15890 type SyntaxNode = TraitItemFunction<'db>;
15891 fn untyped(self) -> SyntaxStablePtrId<'db> {
15892 self.0
15893 }
15894 fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15895 TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15896 }
15897}
15898impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15899 fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15900 ptr.untyped()
15901 }
15902}
15903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15904pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15905impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15906 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15907 type StablePtr = TraitItemFunctionPtr<'db>;
15908 type Green = TraitItemFunctionGreen<'db>;
15909 fn missing(db: &'db dyn Database) -> Self::Green {
15910 TraitItemFunctionGreen(
15911 GreenNode {
15912 kind: SyntaxKind::TraitItemFunction,
15913 details: GreenNodeDetails::Node {
15914 children: [
15915 AttributeList::missing(db).0,
15916 FunctionDeclaration::missing(db).0,
15917 MaybeTraitFunctionBody::missing(db).0,
15918 ]
15919 .into(),
15920 width: TextWidth::default(),
15921 },
15922 }
15923 .intern(db),
15924 )
15925 }
15926 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15927 let kind = node.kind(db);
15928 assert_eq!(
15929 kind,
15930 SyntaxKind::TraitItemFunction,
15931 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15932 kind,
15933 SyntaxKind::TraitItemFunction
15934 );
15935 Self { node }
15936 }
15937 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15938 let kind = node.kind(db);
15939 if kind == SyntaxKind::TraitItemFunction {
15940 Some(Self::from_syntax_node(db, node))
15941 } else {
15942 None
15943 }
15944 }
15945 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15946 self.node
15947 }
15948 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15949 TraitItemFunctionPtr(self.node.stable_ptr(db))
15950 }
15951}
15952#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15953pub struct TraitItemType<'db> {
15954 node: SyntaxNode<'db>,
15955}
15956impl<'db> TraitItemType<'db> {
15957 pub const INDEX_ATTRIBUTES: usize = 0;
15958 pub const INDEX_TYPE_KW: usize = 1;
15959 pub const INDEX_NAME: usize = 2;
15960 pub const INDEX_GENERIC_PARAMS: usize = 3;
15961 pub const INDEX_SEMICOLON: usize = 4;
15962 pub fn new_green(
15963 db: &'db dyn Database,
15964 attributes: AttributeListGreen<'db>,
15965 type_kw: TerminalTypeGreen<'db>,
15966 name: TerminalIdentifierGreen<'db>,
15967 generic_params: OptionWrappedGenericParamListGreen<'db>,
15968 semicolon: TerminalSemicolonGreen<'db>,
15969 ) -> TraitItemTypeGreen<'db> {
15970 let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15971 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15972 TraitItemTypeGreen(
15973 GreenNode {
15974 kind: SyntaxKind::TraitItemType,
15975 details: GreenNodeDetails::Node { children: children.into(), width },
15976 }
15977 .intern(db),
15978 )
15979 }
15980}
15981impl<'db> TraitItemType<'db> {
15982 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15983 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15984 }
15985 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15986 TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15987 }
15988 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15989 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15990 }
15991 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15992 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15993 }
15994 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15995 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15996 }
15997}
15998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15999pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
16000impl<'db> TraitItemTypePtr<'db> {
16001 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16002 let ptr = self.0.long(db);
16003 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16004 TerminalIdentifierGreen(key_fields[0])
16005 } else {
16006 panic!("Unexpected key field query on root.");
16007 }
16008 }
16009}
16010impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
16011 type SyntaxNode = TraitItemType<'db>;
16012 fn untyped(self) -> SyntaxStablePtrId<'db> {
16013 self.0
16014 }
16015 fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
16016 TraitItemType::from_syntax_node(db, self.0.lookup(db))
16017 }
16018}
16019impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
16020 fn from(ptr: TraitItemTypePtr<'db>) -> Self {
16021 ptr.untyped()
16022 }
16023}
16024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16025pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
16026impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
16027 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
16028 type StablePtr = TraitItemTypePtr<'db>;
16029 type Green = TraitItemTypeGreen<'db>;
16030 fn missing(db: &'db dyn Database) -> Self::Green {
16031 TraitItemTypeGreen(
16032 GreenNode {
16033 kind: SyntaxKind::TraitItemType,
16034 details: GreenNodeDetails::Node {
16035 children: [
16036 AttributeList::missing(db).0,
16037 TerminalType::missing(db).0,
16038 TerminalIdentifier::missing(db).0,
16039 OptionWrappedGenericParamList::missing(db).0,
16040 TerminalSemicolon::missing(db).0,
16041 ]
16042 .into(),
16043 width: TextWidth::default(),
16044 },
16045 }
16046 .intern(db),
16047 )
16048 }
16049 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16050 let kind = node.kind(db);
16051 assert_eq!(
16052 kind,
16053 SyntaxKind::TraitItemType,
16054 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16055 kind,
16056 SyntaxKind::TraitItemType
16057 );
16058 Self { node }
16059 }
16060 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16061 let kind = node.kind(db);
16062 if kind == SyntaxKind::TraitItemType {
16063 Some(Self::from_syntax_node(db, node))
16064 } else {
16065 None
16066 }
16067 }
16068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16069 self.node
16070 }
16071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16072 TraitItemTypePtr(self.node.stable_ptr(db))
16073 }
16074}
16075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16076pub struct TraitItemConstant<'db> {
16077 node: SyntaxNode<'db>,
16078}
16079impl<'db> TraitItemConstant<'db> {
16080 pub const INDEX_ATTRIBUTES: usize = 0;
16081 pub const INDEX_CONST_KW: usize = 1;
16082 pub const INDEX_NAME: usize = 2;
16083 pub const INDEX_TYPE_CLAUSE: usize = 3;
16084 pub const INDEX_SEMICOLON: usize = 4;
16085 pub fn new_green(
16086 db: &'db dyn Database,
16087 attributes: AttributeListGreen<'db>,
16088 const_kw: TerminalConstGreen<'db>,
16089 name: TerminalIdentifierGreen<'db>,
16090 type_clause: TypeClauseGreen<'db>,
16091 semicolon: TerminalSemicolonGreen<'db>,
16092 ) -> TraitItemConstantGreen<'db> {
16093 let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16094 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16095 TraitItemConstantGreen(
16096 GreenNode {
16097 kind: SyntaxKind::TraitItemConstant,
16098 details: GreenNodeDetails::Node { children: children.into(), width },
16099 }
16100 .intern(db),
16101 )
16102 }
16103}
16104impl<'db> TraitItemConstant<'db> {
16105 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16106 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16107 }
16108 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
16109 TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
16110 }
16111 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16112 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16113 }
16114 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
16115 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
16116 }
16117 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16118 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16119 }
16120}
16121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16122pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
16123impl<'db> TraitItemConstantPtr<'db> {
16124 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16125 let ptr = self.0.long(db);
16126 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16127 TerminalIdentifierGreen(key_fields[0])
16128 } else {
16129 panic!("Unexpected key field query on root.");
16130 }
16131 }
16132}
16133impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
16134 type SyntaxNode = TraitItemConstant<'db>;
16135 fn untyped(self) -> SyntaxStablePtrId<'db> {
16136 self.0
16137 }
16138 fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
16139 TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16140 }
16141}
16142impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
16143 fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16144 ptr.untyped()
16145 }
16146}
16147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16148pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16149impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16150 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16151 type StablePtr = TraitItemConstantPtr<'db>;
16152 type Green = TraitItemConstantGreen<'db>;
16153 fn missing(db: &'db dyn Database) -> Self::Green {
16154 TraitItemConstantGreen(
16155 GreenNode {
16156 kind: SyntaxKind::TraitItemConstant,
16157 details: GreenNodeDetails::Node {
16158 children: [
16159 AttributeList::missing(db).0,
16160 TerminalConst::missing(db).0,
16161 TerminalIdentifier::missing(db).0,
16162 TypeClause::missing(db).0,
16163 TerminalSemicolon::missing(db).0,
16164 ]
16165 .into(),
16166 width: TextWidth::default(),
16167 },
16168 }
16169 .intern(db),
16170 )
16171 }
16172 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16173 let kind = node.kind(db);
16174 assert_eq!(
16175 kind,
16176 SyntaxKind::TraitItemConstant,
16177 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16178 kind,
16179 SyntaxKind::TraitItemConstant
16180 );
16181 Self { node }
16182 }
16183 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16184 let kind = node.kind(db);
16185 if kind == SyntaxKind::TraitItemConstant {
16186 Some(Self::from_syntax_node(db, node))
16187 } else {
16188 None
16189 }
16190 }
16191 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16192 self.node
16193 }
16194 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16195 TraitItemConstantPtr(self.node.stable_ptr(db))
16196 }
16197}
16198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16199pub struct TraitItemImpl<'db> {
16200 node: SyntaxNode<'db>,
16201}
16202impl<'db> TraitItemImpl<'db> {
16203 pub const INDEX_ATTRIBUTES: usize = 0;
16204 pub const INDEX_IMPL_KW: usize = 1;
16205 pub const INDEX_NAME: usize = 2;
16206 pub const INDEX_COLON: usize = 3;
16207 pub const INDEX_TRAIT_PATH: usize = 4;
16208 pub const INDEX_SEMICOLON: usize = 5;
16209 pub fn new_green(
16210 db: &'db dyn Database,
16211 attributes: AttributeListGreen<'db>,
16212 impl_kw: TerminalImplGreen<'db>,
16213 name: TerminalIdentifierGreen<'db>,
16214 colon: TerminalColonGreen<'db>,
16215 trait_path: ExprPathGreen<'db>,
16216 semicolon: TerminalSemicolonGreen<'db>,
16217 ) -> TraitItemImplGreen<'db> {
16218 let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16219 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16220 TraitItemImplGreen(
16221 GreenNode {
16222 kind: SyntaxKind::TraitItemImpl,
16223 details: GreenNodeDetails::Node { children: children.into(), width },
16224 }
16225 .intern(db),
16226 )
16227 }
16228}
16229impl<'db> TraitItemImpl<'db> {
16230 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16231 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16232 }
16233 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16234 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16235 }
16236 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16237 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16238 }
16239 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16240 TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16241 }
16242 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16243 ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16244 }
16245 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16246 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16247 }
16248}
16249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16250pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16251impl<'db> TraitItemImplPtr<'db> {
16252 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16253 let ptr = self.0.long(db);
16254 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16255 TerminalIdentifierGreen(key_fields[0])
16256 } else {
16257 panic!("Unexpected key field query on root.");
16258 }
16259 }
16260}
16261impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16262 type SyntaxNode = TraitItemImpl<'db>;
16263 fn untyped(self) -> SyntaxStablePtrId<'db> {
16264 self.0
16265 }
16266 fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16267 TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16268 }
16269}
16270impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16271 fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16272 ptr.untyped()
16273 }
16274}
16275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16276pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16277impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16278 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16279 type StablePtr = TraitItemImplPtr<'db>;
16280 type Green = TraitItemImplGreen<'db>;
16281 fn missing(db: &'db dyn Database) -> Self::Green {
16282 TraitItemImplGreen(
16283 GreenNode {
16284 kind: SyntaxKind::TraitItemImpl,
16285 details: GreenNodeDetails::Node {
16286 children: [
16287 AttributeList::missing(db).0,
16288 TerminalImpl::missing(db).0,
16289 TerminalIdentifier::missing(db).0,
16290 TerminalColon::missing(db).0,
16291 ExprPath::missing(db).0,
16292 TerminalSemicolon::missing(db).0,
16293 ]
16294 .into(),
16295 width: TextWidth::default(),
16296 },
16297 }
16298 .intern(db),
16299 )
16300 }
16301 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16302 let kind = node.kind(db);
16303 assert_eq!(
16304 kind,
16305 SyntaxKind::TraitItemImpl,
16306 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16307 kind,
16308 SyntaxKind::TraitItemImpl
16309 );
16310 Self { node }
16311 }
16312 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16313 let kind = node.kind(db);
16314 if kind == SyntaxKind::TraitItemImpl {
16315 Some(Self::from_syntax_node(db, node))
16316 } else {
16317 None
16318 }
16319 }
16320 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16321 self.node
16322 }
16323 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16324 TraitItemImplPtr(self.node.stable_ptr(db))
16325 }
16326}
16327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16328pub enum MaybeTraitFunctionBody<'db> {
16329 Some(ExprBlock<'db>),
16330 None(TerminalSemicolon<'db>),
16331}
16332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16333pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16334impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16335 type SyntaxNode = MaybeTraitFunctionBody<'db>;
16336 fn untyped(self) -> SyntaxStablePtrId<'db> {
16337 self.0
16338 }
16339 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16340 MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16341 }
16342}
16343impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16344 fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16345 ptr.untyped()
16346 }
16347}
16348impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16349 fn from(value: ExprBlockPtr<'db>) -> Self {
16350 Self(value.0)
16351 }
16352}
16353impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16354 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16355 Self(value.0)
16356 }
16357}
16358impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16359 fn from(value: ExprBlockGreen<'db>) -> Self {
16360 Self(value.0)
16361 }
16362}
16363impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16364 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16365 Self(value.0)
16366 }
16367}
16368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16369pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16370impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16371 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16372 type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16373 type Green = MaybeTraitFunctionBodyGreen<'db>;
16374 fn missing(db: &'db dyn Database) -> Self::Green {
16375 panic!("No missing variant.");
16376 }
16377 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16378 let kind = node.kind(db);
16379 match kind {
16380 SyntaxKind::ExprBlock => {
16381 MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16382 }
16383 SyntaxKind::TerminalSemicolon => {
16384 MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16385 }
16386 _ => panic!(
16387 "Unexpected syntax kind {:?} when constructing {}.",
16388 kind, "MaybeTraitFunctionBody"
16389 ),
16390 }
16391 }
16392 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16393 let kind = node.kind(db);
16394 match kind {
16395 SyntaxKind::ExprBlock => {
16396 Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16397 }
16398 SyntaxKind::TerminalSemicolon => {
16399 Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16400 }
16401 _ => None,
16402 }
16403 }
16404 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16405 match self {
16406 MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16407 MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16408 }
16409 }
16410 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16411 MaybeTraitFunctionBodyPtr(self.as_syntax_node().long(db).stable_ptr)
16412 }
16413}
16414impl<'db> MaybeTraitFunctionBody<'db> {
16415 pub fn is_variant(kind: SyntaxKind) -> bool {
16417 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16418 }
16419}
16420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16421pub struct ItemImpl<'db> {
16422 node: SyntaxNode<'db>,
16423}
16424impl<'db> ItemImpl<'db> {
16425 pub const INDEX_ATTRIBUTES: usize = 0;
16426 pub const INDEX_VISIBILITY: usize = 1;
16427 pub const INDEX_IMPL_KW: usize = 2;
16428 pub const INDEX_NAME: usize = 3;
16429 pub const INDEX_GENERIC_PARAMS: usize = 4;
16430 pub const INDEX_OF_KW: usize = 5;
16431 pub const INDEX_TRAIT_PATH: usize = 6;
16432 pub const INDEX_BODY: usize = 7;
16433 pub fn new_green(
16434 db: &'db dyn Database,
16435 attributes: AttributeListGreen<'db>,
16436 visibility: VisibilityGreen<'db>,
16437 impl_kw: TerminalImplGreen<'db>,
16438 name: TerminalIdentifierGreen<'db>,
16439 generic_params: OptionWrappedGenericParamListGreen<'db>,
16440 of_kw: TerminalOfGreen<'db>,
16441 trait_path: ExprPathGreen<'db>,
16442 body: MaybeImplBodyGreen<'db>,
16443 ) -> ItemImplGreen<'db> {
16444 let children = [
16445 attributes.0,
16446 visibility.0,
16447 impl_kw.0,
16448 name.0,
16449 generic_params.0,
16450 of_kw.0,
16451 trait_path.0,
16452 body.0,
16453 ];
16454 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16455 ItemImplGreen(
16456 GreenNode {
16457 kind: SyntaxKind::ItemImpl,
16458 details: GreenNodeDetails::Node { children: children.into(), width },
16459 }
16460 .intern(db),
16461 )
16462 }
16463}
16464impl<'db> ItemImpl<'db> {
16465 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16466 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16467 }
16468 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16469 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16470 }
16471 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16472 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16473 }
16474 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16475 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16476 }
16477 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16478 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16479 }
16480 pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16481 TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16482 }
16483 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16484 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16485 }
16486 pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16487 MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16488 }
16489}
16490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16491pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16492impl<'db> ItemImplPtr<'db> {
16493 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16494 let ptr = self.0.long(db);
16495 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16496 TerminalIdentifierGreen(key_fields[0])
16497 } else {
16498 panic!("Unexpected key field query on root.");
16499 }
16500 }
16501}
16502impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16503 type SyntaxNode = ItemImpl<'db>;
16504 fn untyped(self) -> SyntaxStablePtrId<'db> {
16505 self.0
16506 }
16507 fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16508 ItemImpl::from_syntax_node(db, self.0.lookup(db))
16509 }
16510}
16511impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16512 fn from(ptr: ItemImplPtr<'db>) -> Self {
16513 ptr.untyped()
16514 }
16515}
16516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16517pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16518impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16519 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16520 type StablePtr = ItemImplPtr<'db>;
16521 type Green = ItemImplGreen<'db>;
16522 fn missing(db: &'db dyn Database) -> Self::Green {
16523 ItemImplGreen(
16524 GreenNode {
16525 kind: SyntaxKind::ItemImpl,
16526 details: GreenNodeDetails::Node {
16527 children: [
16528 AttributeList::missing(db).0,
16529 Visibility::missing(db).0,
16530 TerminalImpl::missing(db).0,
16531 TerminalIdentifier::missing(db).0,
16532 OptionWrappedGenericParamList::missing(db).0,
16533 TerminalOf::missing(db).0,
16534 ExprPath::missing(db).0,
16535 MaybeImplBody::missing(db).0,
16536 ]
16537 .into(),
16538 width: TextWidth::default(),
16539 },
16540 }
16541 .intern(db),
16542 )
16543 }
16544 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16545 let kind = node.kind(db);
16546 assert_eq!(
16547 kind,
16548 SyntaxKind::ItemImpl,
16549 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16550 kind,
16551 SyntaxKind::ItemImpl
16552 );
16553 Self { node }
16554 }
16555 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16556 let kind = node.kind(db);
16557 if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16558 }
16559 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16560 self.node
16561 }
16562 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16563 ItemImplPtr(self.node.stable_ptr(db))
16564 }
16565}
16566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16567pub struct ItemHeaderDoc<'db> {
16568 node: SyntaxNode<'db>,
16569}
16570impl<'db> ItemHeaderDoc<'db> {
16571 pub const INDEX_EMPTY: usize = 0;
16572 pub fn new_green(
16573 db: &'db dyn Database,
16574 empty: TerminalEmptyGreen<'db>,
16575 ) -> ItemHeaderDocGreen<'db> {
16576 let children = [empty.0];
16577 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16578 ItemHeaderDocGreen(
16579 GreenNode {
16580 kind: SyntaxKind::ItemHeaderDoc,
16581 details: GreenNodeDetails::Node { children: children.into(), width },
16582 }
16583 .intern(db),
16584 )
16585 }
16586}
16587impl<'db> ItemHeaderDoc<'db> {
16588 pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16589 TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16590 }
16591}
16592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16593pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16594impl<'db> ItemHeaderDocPtr<'db> {}
16595impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16596 type SyntaxNode = ItemHeaderDoc<'db>;
16597 fn untyped(self) -> SyntaxStablePtrId<'db> {
16598 self.0
16599 }
16600 fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16601 ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16602 }
16603}
16604impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16605 fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16606 ptr.untyped()
16607 }
16608}
16609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16610pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16611impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16612 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16613 type StablePtr = ItemHeaderDocPtr<'db>;
16614 type Green = ItemHeaderDocGreen<'db>;
16615 fn missing(db: &'db dyn Database) -> Self::Green {
16616 ItemHeaderDocGreen(
16617 GreenNode {
16618 kind: SyntaxKind::ItemHeaderDoc,
16619 details: GreenNodeDetails::Node {
16620 children: [TerminalEmpty::missing(db).0].into(),
16621 width: TextWidth::default(),
16622 },
16623 }
16624 .intern(db),
16625 )
16626 }
16627 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16628 let kind = node.kind(db);
16629 assert_eq!(
16630 kind,
16631 SyntaxKind::ItemHeaderDoc,
16632 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16633 kind,
16634 SyntaxKind::ItemHeaderDoc
16635 );
16636 Self { node }
16637 }
16638 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16639 let kind = node.kind(db);
16640 if kind == SyntaxKind::ItemHeaderDoc {
16641 Some(Self::from_syntax_node(db, node))
16642 } else {
16643 None
16644 }
16645 }
16646 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16647 self.node
16648 }
16649 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16650 ItemHeaderDocPtr(self.node.stable_ptr(db))
16651 }
16652}
16653#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16654pub enum MaybeImplBody<'db> {
16655 Some(ImplBody<'db>),
16656 None(TerminalSemicolon<'db>),
16657}
16658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16659pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16660impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16661 type SyntaxNode = MaybeImplBody<'db>;
16662 fn untyped(self) -> SyntaxStablePtrId<'db> {
16663 self.0
16664 }
16665 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16666 MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16667 }
16668}
16669impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16670 fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16671 ptr.untyped()
16672 }
16673}
16674impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16675 fn from(value: ImplBodyPtr<'db>) -> Self {
16676 Self(value.0)
16677 }
16678}
16679impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16680 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16681 Self(value.0)
16682 }
16683}
16684impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16685 fn from(value: ImplBodyGreen<'db>) -> Self {
16686 Self(value.0)
16687 }
16688}
16689impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16690 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16691 Self(value.0)
16692 }
16693}
16694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16695pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16696impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16697 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16698 type StablePtr = MaybeImplBodyPtr<'db>;
16699 type Green = MaybeImplBodyGreen<'db>;
16700 fn missing(db: &'db dyn Database) -> Self::Green {
16701 panic!("No missing variant.");
16702 }
16703 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16704 let kind = node.kind(db);
16705 match kind {
16706 SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16707 SyntaxKind::TerminalSemicolon => {
16708 MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16709 }
16710 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16711 }
16712 }
16713 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16714 let kind = node.kind(db);
16715 match kind {
16716 SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16717 SyntaxKind::TerminalSemicolon => {
16718 Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16719 }
16720 _ => None,
16721 }
16722 }
16723 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16724 match self {
16725 MaybeImplBody::Some(x) => x.as_syntax_node(),
16726 MaybeImplBody::None(x) => x.as_syntax_node(),
16727 }
16728 }
16729 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16730 MaybeImplBodyPtr(self.as_syntax_node().long(db).stable_ptr)
16731 }
16732}
16733impl<'db> MaybeImplBody<'db> {
16734 pub fn is_variant(kind: SyntaxKind) -> bool {
16736 matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16737 }
16738}
16739#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16740pub struct ImplBody<'db> {
16741 node: SyntaxNode<'db>,
16742}
16743impl<'db> ImplBody<'db> {
16744 pub const INDEX_LBRACE: usize = 0;
16745 pub const INDEX_ITEMS: usize = 1;
16746 pub const INDEX_RBRACE: usize = 2;
16747 pub fn new_green(
16748 db: &'db dyn Database,
16749 lbrace: TerminalLBraceGreen<'db>,
16750 items: ImplItemListGreen<'db>,
16751 rbrace: TerminalRBraceGreen<'db>,
16752 ) -> ImplBodyGreen<'db> {
16753 let children = [lbrace.0, items.0, rbrace.0];
16754 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16755 ImplBodyGreen(
16756 GreenNode {
16757 kind: SyntaxKind::ImplBody,
16758 details: GreenNodeDetails::Node { children: children.into(), width },
16759 }
16760 .intern(db),
16761 )
16762 }
16763}
16764impl<'db> ImplBody<'db> {
16765 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16766 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16767 }
16768 pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16769 ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16770 }
16771 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16772 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16773 }
16774}
16775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16776pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16777impl<'db> ImplBodyPtr<'db> {}
16778impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16779 type SyntaxNode = ImplBody<'db>;
16780 fn untyped(self) -> SyntaxStablePtrId<'db> {
16781 self.0
16782 }
16783 fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16784 ImplBody::from_syntax_node(db, self.0.lookup(db))
16785 }
16786}
16787impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16788 fn from(ptr: ImplBodyPtr<'db>) -> Self {
16789 ptr.untyped()
16790 }
16791}
16792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16793pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16794impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16795 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16796 type StablePtr = ImplBodyPtr<'db>;
16797 type Green = ImplBodyGreen<'db>;
16798 fn missing(db: &'db dyn Database) -> Self::Green {
16799 ImplBodyGreen(
16800 GreenNode {
16801 kind: SyntaxKind::ImplBody,
16802 details: GreenNodeDetails::Node {
16803 children: [
16804 TerminalLBrace::missing(db).0,
16805 ImplItemList::missing(db).0,
16806 TerminalRBrace::missing(db).0,
16807 ]
16808 .into(),
16809 width: TextWidth::default(),
16810 },
16811 }
16812 .intern(db),
16813 )
16814 }
16815 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16816 let kind = node.kind(db);
16817 assert_eq!(
16818 kind,
16819 SyntaxKind::ImplBody,
16820 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16821 kind,
16822 SyntaxKind::ImplBody
16823 );
16824 Self { node }
16825 }
16826 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16827 let kind = node.kind(db);
16828 if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16829 }
16830 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16831 self.node
16832 }
16833 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16834 ImplBodyPtr(self.node.stable_ptr(db))
16835 }
16836}
16837#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16838pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16839impl<'db> Deref for ImplItemList<'db> {
16840 type Target = ElementList<'db, ImplItem<'db>, 1>;
16841 fn deref(&self) -> &Self::Target {
16842 &self.0
16843 }
16844}
16845impl<'db> ImplItemList<'db> {
16846 pub fn new_green(
16847 db: &'db dyn Database,
16848 children: &[ImplItemGreen<'db>],
16849 ) -> ImplItemListGreen<'db> {
16850 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16851 ImplItemListGreen(
16852 GreenNode {
16853 kind: SyntaxKind::ImplItemList,
16854 details: GreenNodeDetails::Node {
16855 children: children.iter().map(|x| x.0).collect(),
16856 width,
16857 },
16858 }
16859 .intern(db),
16860 )
16861 }
16862}
16863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16864pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16865impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16866 type SyntaxNode = ImplItemList<'db>;
16867 fn untyped(self) -> SyntaxStablePtrId<'db> {
16868 self.0
16869 }
16870 fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16871 ImplItemList::from_syntax_node(db, self.0.lookup(db))
16872 }
16873}
16874impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16875 fn from(ptr: ImplItemListPtr<'db>) -> Self {
16876 ptr.untyped()
16877 }
16878}
16879#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16880pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16881impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16882 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16883 type StablePtr = ImplItemListPtr<'db>;
16884 type Green = ImplItemListGreen<'db>;
16885 fn missing(db: &'db dyn Database) -> Self::Green {
16886 ImplItemListGreen(
16887 GreenNode {
16888 kind: SyntaxKind::ImplItemList,
16889 details: GreenNodeDetails::Node {
16890 children: [].into(),
16891 width: TextWidth::default(),
16892 },
16893 }
16894 .intern(db),
16895 )
16896 }
16897 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16898 Self(ElementList::new(node))
16899 }
16900 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16901 if node.kind(db) == SyntaxKind::ImplItemList {
16902 Some(Self(ElementList::new(node)))
16903 } else {
16904 None
16905 }
16906 }
16907 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16908 self.node
16909 }
16910 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16911 ImplItemListPtr(self.node.stable_ptr(db))
16912 }
16913}
16914#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16915pub enum ImplItem<'db> {
16916 Function(FunctionWithBody<'db>),
16917 Type(ItemTypeAlias<'db>),
16918 Constant(ItemConstant<'db>),
16919 Impl(ItemImplAlias<'db>),
16920 Module(ItemModule<'db>),
16921 Use(ItemUse<'db>),
16922 ExternFunction(ItemExternFunction<'db>),
16923 ExternType(ItemExternType<'db>),
16924 Trait(ItemTrait<'db>),
16925 Struct(ItemStruct<'db>),
16926 Enum(ItemEnum<'db>),
16927 Missing(ImplItemMissing<'db>),
16928}
16929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16930pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16931impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16932 type SyntaxNode = ImplItem<'db>;
16933 fn untyped(self) -> SyntaxStablePtrId<'db> {
16934 self.0
16935 }
16936 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16937 ImplItem::from_syntax_node(db, self.0.lookup(db))
16938 }
16939}
16940impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16941 fn from(ptr: ImplItemPtr<'db>) -> Self {
16942 ptr.untyped()
16943 }
16944}
16945impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16946 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16947 Self(value.0)
16948 }
16949}
16950impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16951 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16952 Self(value.0)
16953 }
16954}
16955impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16956 fn from(value: ItemConstantPtr<'db>) -> Self {
16957 Self(value.0)
16958 }
16959}
16960impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16961 fn from(value: ItemImplAliasPtr<'db>) -> Self {
16962 Self(value.0)
16963 }
16964}
16965impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16966 fn from(value: ItemModulePtr<'db>) -> Self {
16967 Self(value.0)
16968 }
16969}
16970impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16971 fn from(value: ItemUsePtr<'db>) -> Self {
16972 Self(value.0)
16973 }
16974}
16975impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16976 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16977 Self(value.0)
16978 }
16979}
16980impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16981 fn from(value: ItemExternTypePtr<'db>) -> Self {
16982 Self(value.0)
16983 }
16984}
16985impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16986 fn from(value: ItemTraitPtr<'db>) -> Self {
16987 Self(value.0)
16988 }
16989}
16990impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16991 fn from(value: ItemStructPtr<'db>) -> Self {
16992 Self(value.0)
16993 }
16994}
16995impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16996 fn from(value: ItemEnumPtr<'db>) -> Self {
16997 Self(value.0)
16998 }
16999}
17000impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
17001 fn from(value: ImplItemMissingPtr<'db>) -> Self {
17002 Self(value.0)
17003 }
17004}
17005impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
17006 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
17007 Self(value.0)
17008 }
17009}
17010impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
17011 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
17012 Self(value.0)
17013 }
17014}
17015impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
17016 fn from(value: ItemConstantGreen<'db>) -> Self {
17017 Self(value.0)
17018 }
17019}
17020impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
17021 fn from(value: ItemImplAliasGreen<'db>) -> Self {
17022 Self(value.0)
17023 }
17024}
17025impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
17026 fn from(value: ItemModuleGreen<'db>) -> Self {
17027 Self(value.0)
17028 }
17029}
17030impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
17031 fn from(value: ItemUseGreen<'db>) -> Self {
17032 Self(value.0)
17033 }
17034}
17035impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
17036 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
17037 Self(value.0)
17038 }
17039}
17040impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
17041 fn from(value: ItemExternTypeGreen<'db>) -> Self {
17042 Self(value.0)
17043 }
17044}
17045impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
17046 fn from(value: ItemTraitGreen<'db>) -> Self {
17047 Self(value.0)
17048 }
17049}
17050impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
17051 fn from(value: ItemStructGreen<'db>) -> Self {
17052 Self(value.0)
17053 }
17054}
17055impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
17056 fn from(value: ItemEnumGreen<'db>) -> Self {
17057 Self(value.0)
17058 }
17059}
17060impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
17061 fn from(value: ImplItemMissingGreen<'db>) -> Self {
17062 Self(value.0)
17063 }
17064}
17065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17066pub struct ImplItemGreen<'db>(pub GreenId<'db>);
17067impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
17068 const OPTIONAL_KIND: Option<SyntaxKind> = None;
17069 type StablePtr = ImplItemPtr<'db>;
17070 type Green = ImplItemGreen<'db>;
17071 fn missing(db: &'db dyn Database) -> Self::Green {
17072 ImplItemGreen(ImplItemMissing::missing(db).0)
17073 }
17074 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17075 let kind = node.kind(db);
17076 match kind {
17077 SyntaxKind::FunctionWithBody => {
17078 ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
17079 }
17080 SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17081 SyntaxKind::ItemConstant => {
17082 ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17083 }
17084 SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17085 SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17086 SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17087 SyntaxKind::ItemExternFunction => {
17088 ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17089 }
17090 SyntaxKind::ItemExternType => {
17091 ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17092 }
17093 SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17094 SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17095 SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17096 SyntaxKind::ImplItemMissing => {
17097 ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17098 }
17099 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17100 }
17101 }
17102 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17103 let kind = node.kind(db);
17104 match kind {
17105 SyntaxKind::FunctionWithBody => {
17106 Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17107 }
17108 SyntaxKind::ItemTypeAlias => {
17109 Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17110 }
17111 SyntaxKind::ItemConstant => {
17112 Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17113 }
17114 SyntaxKind::ItemImplAlias => {
17115 Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17116 }
17117 SyntaxKind::ItemModule => {
17118 Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17119 }
17120 SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17121 SyntaxKind::ItemExternFunction => {
17122 Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17123 }
17124 SyntaxKind::ItemExternType => {
17125 Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17126 }
17127 SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17128 SyntaxKind::ItemStruct => {
17129 Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17130 }
17131 SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17132 SyntaxKind::ImplItemMissing => {
17133 Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17134 }
17135 _ => None,
17136 }
17137 }
17138 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17139 match self {
17140 ImplItem::Function(x) => x.as_syntax_node(),
17141 ImplItem::Type(x) => x.as_syntax_node(),
17142 ImplItem::Constant(x) => x.as_syntax_node(),
17143 ImplItem::Impl(x) => x.as_syntax_node(),
17144 ImplItem::Module(x) => x.as_syntax_node(),
17145 ImplItem::Use(x) => x.as_syntax_node(),
17146 ImplItem::ExternFunction(x) => x.as_syntax_node(),
17147 ImplItem::ExternType(x) => x.as_syntax_node(),
17148 ImplItem::Trait(x) => x.as_syntax_node(),
17149 ImplItem::Struct(x) => x.as_syntax_node(),
17150 ImplItem::Enum(x) => x.as_syntax_node(),
17151 ImplItem::Missing(x) => x.as_syntax_node(),
17152 }
17153 }
17154 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17155 ImplItemPtr(self.as_syntax_node().long(db).stable_ptr)
17156 }
17157}
17158impl<'db> ImplItem<'db> {
17159 pub fn is_variant(kind: SyntaxKind) -> bool {
17161 matches!(
17162 kind,
17163 SyntaxKind::FunctionWithBody
17164 | SyntaxKind::ItemTypeAlias
17165 | SyntaxKind::ItemConstant
17166 | SyntaxKind::ItemImplAlias
17167 | SyntaxKind::ItemModule
17168 | SyntaxKind::ItemUse
17169 | SyntaxKind::ItemExternFunction
17170 | SyntaxKind::ItemExternType
17171 | SyntaxKind::ItemTrait
17172 | SyntaxKind::ItemStruct
17173 | SyntaxKind::ItemEnum
17174 | SyntaxKind::ImplItemMissing
17175 )
17176 }
17177}
17178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17179pub struct ImplItemMissing<'db> {
17180 node: SyntaxNode<'db>,
17181}
17182impl<'db> ImplItemMissing<'db> {
17183 pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17184 let children = [];
17185 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17186 ImplItemMissingGreen(
17187 GreenNode {
17188 kind: SyntaxKind::ImplItemMissing,
17189 details: GreenNodeDetails::Node { children: children.into(), width },
17190 }
17191 .intern(db),
17192 )
17193 }
17194}
17195impl<'db> ImplItemMissing<'db> {}
17196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17197pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17198impl<'db> ImplItemMissingPtr<'db> {}
17199impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17200 type SyntaxNode = ImplItemMissing<'db>;
17201 fn untyped(self) -> SyntaxStablePtrId<'db> {
17202 self.0
17203 }
17204 fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17205 ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17206 }
17207}
17208impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17209 fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17210 ptr.untyped()
17211 }
17212}
17213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17214pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17215impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17216 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17217 type StablePtr = ImplItemMissingPtr<'db>;
17218 type Green = ImplItemMissingGreen<'db>;
17219 fn missing(db: &'db dyn Database) -> Self::Green {
17220 ImplItemMissingGreen(
17221 GreenNode {
17222 kind: SyntaxKind::ImplItemMissing,
17223 details: GreenNodeDetails::Node {
17224 children: [].into(),
17225 width: TextWidth::default(),
17226 },
17227 }
17228 .intern(db),
17229 )
17230 }
17231 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17232 let kind = node.kind(db);
17233 assert_eq!(
17234 kind,
17235 SyntaxKind::ImplItemMissing,
17236 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17237 kind,
17238 SyntaxKind::ImplItemMissing
17239 );
17240 Self { node }
17241 }
17242 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17243 let kind = node.kind(db);
17244 if kind == SyntaxKind::ImplItemMissing {
17245 Some(Self::from_syntax_node(db, node))
17246 } else {
17247 None
17248 }
17249 }
17250 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17251 self.node
17252 }
17253 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17254 ImplItemMissingPtr(self.node.stable_ptr(db))
17255 }
17256}
17257#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17258pub struct ItemImplAlias<'db> {
17259 node: SyntaxNode<'db>,
17260}
17261impl<'db> ItemImplAlias<'db> {
17262 pub const INDEX_ATTRIBUTES: usize = 0;
17263 pub const INDEX_VISIBILITY: usize = 1;
17264 pub const INDEX_IMPL_KW: usize = 2;
17265 pub const INDEX_NAME: usize = 3;
17266 pub const INDEX_GENERIC_PARAMS: usize = 4;
17267 pub const INDEX_EQ: usize = 5;
17268 pub const INDEX_IMPL_PATH: usize = 6;
17269 pub const INDEX_SEMICOLON: usize = 7;
17270 pub fn new_green(
17271 db: &'db dyn Database,
17272 attributes: AttributeListGreen<'db>,
17273 visibility: VisibilityGreen<'db>,
17274 impl_kw: TerminalImplGreen<'db>,
17275 name: TerminalIdentifierGreen<'db>,
17276 generic_params: OptionWrappedGenericParamListGreen<'db>,
17277 eq: TerminalEqGreen<'db>,
17278 impl_path: ExprPathGreen<'db>,
17279 semicolon: TerminalSemicolonGreen<'db>,
17280 ) -> ItemImplAliasGreen<'db> {
17281 let children = [
17282 attributes.0,
17283 visibility.0,
17284 impl_kw.0,
17285 name.0,
17286 generic_params.0,
17287 eq.0,
17288 impl_path.0,
17289 semicolon.0,
17290 ];
17291 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17292 ItemImplAliasGreen(
17293 GreenNode {
17294 kind: SyntaxKind::ItemImplAlias,
17295 details: GreenNodeDetails::Node { children: children.into(), width },
17296 }
17297 .intern(db),
17298 )
17299 }
17300}
17301impl<'db> ItemImplAlias<'db> {
17302 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17303 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17304 }
17305 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17306 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17307 }
17308 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17309 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17310 }
17311 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17312 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17313 }
17314 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17315 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17316 }
17317 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17318 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17319 }
17320 pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17321 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17322 }
17323 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17324 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17325 }
17326}
17327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17328pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17329impl<'db> ItemImplAliasPtr<'db> {
17330 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17331 let ptr = self.0.long(db);
17332 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17333 TerminalIdentifierGreen(key_fields[0])
17334 } else {
17335 panic!("Unexpected key field query on root.");
17336 }
17337 }
17338}
17339impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17340 type SyntaxNode = ItemImplAlias<'db>;
17341 fn untyped(self) -> SyntaxStablePtrId<'db> {
17342 self.0
17343 }
17344 fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17345 ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17346 }
17347}
17348impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17349 fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17350 ptr.untyped()
17351 }
17352}
17353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17354pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17355impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17356 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17357 type StablePtr = ItemImplAliasPtr<'db>;
17358 type Green = ItemImplAliasGreen<'db>;
17359 fn missing(db: &'db dyn Database) -> Self::Green {
17360 ItemImplAliasGreen(
17361 GreenNode {
17362 kind: SyntaxKind::ItemImplAlias,
17363 details: GreenNodeDetails::Node {
17364 children: [
17365 AttributeList::missing(db).0,
17366 Visibility::missing(db).0,
17367 TerminalImpl::missing(db).0,
17368 TerminalIdentifier::missing(db).0,
17369 OptionWrappedGenericParamList::missing(db).0,
17370 TerminalEq::missing(db).0,
17371 ExprPath::missing(db).0,
17372 TerminalSemicolon::missing(db).0,
17373 ]
17374 .into(),
17375 width: TextWidth::default(),
17376 },
17377 }
17378 .intern(db),
17379 )
17380 }
17381 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17382 let kind = node.kind(db);
17383 assert_eq!(
17384 kind,
17385 SyntaxKind::ItemImplAlias,
17386 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17387 kind,
17388 SyntaxKind::ItemImplAlias
17389 );
17390 Self { node }
17391 }
17392 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17393 let kind = node.kind(db);
17394 if kind == SyntaxKind::ItemImplAlias {
17395 Some(Self::from_syntax_node(db, node))
17396 } else {
17397 None
17398 }
17399 }
17400 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17401 self.node
17402 }
17403 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17404 ItemImplAliasPtr(self.node.stable_ptr(db))
17405 }
17406}
17407#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17408pub struct ItemStruct<'db> {
17409 node: SyntaxNode<'db>,
17410}
17411impl<'db> ItemStruct<'db> {
17412 pub const INDEX_ATTRIBUTES: usize = 0;
17413 pub const INDEX_VISIBILITY: usize = 1;
17414 pub const INDEX_STRUCT_KW: usize = 2;
17415 pub const INDEX_NAME: usize = 3;
17416 pub const INDEX_GENERIC_PARAMS: usize = 4;
17417 pub const INDEX_LBRACE: usize = 5;
17418 pub const INDEX_MEMBERS: usize = 6;
17419 pub const INDEX_RBRACE: usize = 7;
17420 pub fn new_green(
17421 db: &'db dyn Database,
17422 attributes: AttributeListGreen<'db>,
17423 visibility: VisibilityGreen<'db>,
17424 struct_kw: TerminalStructGreen<'db>,
17425 name: TerminalIdentifierGreen<'db>,
17426 generic_params: OptionWrappedGenericParamListGreen<'db>,
17427 lbrace: TerminalLBraceGreen<'db>,
17428 members: MemberListGreen<'db>,
17429 rbrace: TerminalRBraceGreen<'db>,
17430 ) -> ItemStructGreen<'db> {
17431 let children = [
17432 attributes.0,
17433 visibility.0,
17434 struct_kw.0,
17435 name.0,
17436 generic_params.0,
17437 lbrace.0,
17438 members.0,
17439 rbrace.0,
17440 ];
17441 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17442 ItemStructGreen(
17443 GreenNode {
17444 kind: SyntaxKind::ItemStruct,
17445 details: GreenNodeDetails::Node { children: children.into(), width },
17446 }
17447 .intern(db),
17448 )
17449 }
17450}
17451impl<'db> ItemStruct<'db> {
17452 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17453 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17454 }
17455 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17456 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17457 }
17458 pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17459 TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17460 }
17461 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17462 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17463 }
17464 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17465 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17466 }
17467 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17468 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17469 }
17470 pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17471 MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17472 }
17473 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17474 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17475 }
17476}
17477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17478pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17479impl<'db> ItemStructPtr<'db> {
17480 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17481 let ptr = self.0.long(db);
17482 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17483 TerminalIdentifierGreen(key_fields[0])
17484 } else {
17485 panic!("Unexpected key field query on root.");
17486 }
17487 }
17488}
17489impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17490 type SyntaxNode = ItemStruct<'db>;
17491 fn untyped(self) -> SyntaxStablePtrId<'db> {
17492 self.0
17493 }
17494 fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17495 ItemStruct::from_syntax_node(db, self.0.lookup(db))
17496 }
17497}
17498impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17499 fn from(ptr: ItemStructPtr<'db>) -> Self {
17500 ptr.untyped()
17501 }
17502}
17503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17504pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17505impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17506 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17507 type StablePtr = ItemStructPtr<'db>;
17508 type Green = ItemStructGreen<'db>;
17509 fn missing(db: &'db dyn Database) -> Self::Green {
17510 ItemStructGreen(
17511 GreenNode {
17512 kind: SyntaxKind::ItemStruct,
17513 details: GreenNodeDetails::Node {
17514 children: [
17515 AttributeList::missing(db).0,
17516 Visibility::missing(db).0,
17517 TerminalStruct::missing(db).0,
17518 TerminalIdentifier::missing(db).0,
17519 OptionWrappedGenericParamList::missing(db).0,
17520 TerminalLBrace::missing(db).0,
17521 MemberList::missing(db).0,
17522 TerminalRBrace::missing(db).0,
17523 ]
17524 .into(),
17525 width: TextWidth::default(),
17526 },
17527 }
17528 .intern(db),
17529 )
17530 }
17531 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17532 let kind = node.kind(db);
17533 assert_eq!(
17534 kind,
17535 SyntaxKind::ItemStruct,
17536 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17537 kind,
17538 SyntaxKind::ItemStruct
17539 );
17540 Self { node }
17541 }
17542 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17543 let kind = node.kind(db);
17544 if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17545 }
17546 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17547 self.node
17548 }
17549 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17550 ItemStructPtr(self.node.stable_ptr(db))
17551 }
17552}
17553#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17554pub struct ItemEnum<'db> {
17555 node: SyntaxNode<'db>,
17556}
17557impl<'db> ItemEnum<'db> {
17558 pub const INDEX_ATTRIBUTES: usize = 0;
17559 pub const INDEX_VISIBILITY: usize = 1;
17560 pub const INDEX_ENUM_KW: usize = 2;
17561 pub const INDEX_NAME: usize = 3;
17562 pub const INDEX_GENERIC_PARAMS: usize = 4;
17563 pub const INDEX_LBRACE: usize = 5;
17564 pub const INDEX_VARIANTS: usize = 6;
17565 pub const INDEX_RBRACE: usize = 7;
17566 pub fn new_green(
17567 db: &'db dyn Database,
17568 attributes: AttributeListGreen<'db>,
17569 visibility: VisibilityGreen<'db>,
17570 enum_kw: TerminalEnumGreen<'db>,
17571 name: TerminalIdentifierGreen<'db>,
17572 generic_params: OptionWrappedGenericParamListGreen<'db>,
17573 lbrace: TerminalLBraceGreen<'db>,
17574 variants: VariantListGreen<'db>,
17575 rbrace: TerminalRBraceGreen<'db>,
17576 ) -> ItemEnumGreen<'db> {
17577 let children = [
17578 attributes.0,
17579 visibility.0,
17580 enum_kw.0,
17581 name.0,
17582 generic_params.0,
17583 lbrace.0,
17584 variants.0,
17585 rbrace.0,
17586 ];
17587 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17588 ItemEnumGreen(
17589 GreenNode {
17590 kind: SyntaxKind::ItemEnum,
17591 details: GreenNodeDetails::Node { children: children.into(), width },
17592 }
17593 .intern(db),
17594 )
17595 }
17596}
17597impl<'db> ItemEnum<'db> {
17598 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17599 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17600 }
17601 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17602 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17603 }
17604 pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17605 TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17606 }
17607 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17608 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17609 }
17610 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17611 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17612 }
17613 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17614 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17615 }
17616 pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17617 VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17618 }
17619 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17620 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17621 }
17622}
17623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17624pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17625impl<'db> ItemEnumPtr<'db> {
17626 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17627 let ptr = self.0.long(db);
17628 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17629 TerminalIdentifierGreen(key_fields[0])
17630 } else {
17631 panic!("Unexpected key field query on root.");
17632 }
17633 }
17634}
17635impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17636 type SyntaxNode = ItemEnum<'db>;
17637 fn untyped(self) -> SyntaxStablePtrId<'db> {
17638 self.0
17639 }
17640 fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17641 ItemEnum::from_syntax_node(db, self.0.lookup(db))
17642 }
17643}
17644impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17645 fn from(ptr: ItemEnumPtr<'db>) -> Self {
17646 ptr.untyped()
17647 }
17648}
17649#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17650pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17651impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17652 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17653 type StablePtr = ItemEnumPtr<'db>;
17654 type Green = ItemEnumGreen<'db>;
17655 fn missing(db: &'db dyn Database) -> Self::Green {
17656 ItemEnumGreen(
17657 GreenNode {
17658 kind: SyntaxKind::ItemEnum,
17659 details: GreenNodeDetails::Node {
17660 children: [
17661 AttributeList::missing(db).0,
17662 Visibility::missing(db).0,
17663 TerminalEnum::missing(db).0,
17664 TerminalIdentifier::missing(db).0,
17665 OptionWrappedGenericParamList::missing(db).0,
17666 TerminalLBrace::missing(db).0,
17667 VariantList::missing(db).0,
17668 TerminalRBrace::missing(db).0,
17669 ]
17670 .into(),
17671 width: TextWidth::default(),
17672 },
17673 }
17674 .intern(db),
17675 )
17676 }
17677 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17678 let kind = node.kind(db);
17679 assert_eq!(
17680 kind,
17681 SyntaxKind::ItemEnum,
17682 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17683 kind,
17684 SyntaxKind::ItemEnum
17685 );
17686 Self { node }
17687 }
17688 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17689 let kind = node.kind(db);
17690 if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17691 }
17692 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17693 self.node
17694 }
17695 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17696 ItemEnumPtr(self.node.stable_ptr(db))
17697 }
17698}
17699#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17700pub struct ItemTypeAlias<'db> {
17701 node: SyntaxNode<'db>,
17702}
17703impl<'db> ItemTypeAlias<'db> {
17704 pub const INDEX_ATTRIBUTES: usize = 0;
17705 pub const INDEX_VISIBILITY: usize = 1;
17706 pub const INDEX_TYPE_KW: usize = 2;
17707 pub const INDEX_NAME: usize = 3;
17708 pub const INDEX_GENERIC_PARAMS: usize = 4;
17709 pub const INDEX_EQ: usize = 5;
17710 pub const INDEX_TY: usize = 6;
17711 pub const INDEX_SEMICOLON: usize = 7;
17712 pub fn new_green(
17713 db: &'db dyn Database,
17714 attributes: AttributeListGreen<'db>,
17715 visibility: VisibilityGreen<'db>,
17716 type_kw: TerminalTypeGreen<'db>,
17717 name: TerminalIdentifierGreen<'db>,
17718 generic_params: OptionWrappedGenericParamListGreen<'db>,
17719 eq: TerminalEqGreen<'db>,
17720 ty: ExprGreen<'db>,
17721 semicolon: TerminalSemicolonGreen<'db>,
17722 ) -> ItemTypeAliasGreen<'db> {
17723 let children = [
17724 attributes.0,
17725 visibility.0,
17726 type_kw.0,
17727 name.0,
17728 generic_params.0,
17729 eq.0,
17730 ty.0,
17731 semicolon.0,
17732 ];
17733 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17734 ItemTypeAliasGreen(
17735 GreenNode {
17736 kind: SyntaxKind::ItemTypeAlias,
17737 details: GreenNodeDetails::Node { children: children.into(), width },
17738 }
17739 .intern(db),
17740 )
17741 }
17742}
17743impl<'db> ItemTypeAlias<'db> {
17744 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17745 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17746 }
17747 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17748 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17749 }
17750 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17751 TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17752 }
17753 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17754 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17755 }
17756 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17757 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17758 }
17759 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17760 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17761 }
17762 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17763 Expr::from_syntax_node(db, self.node.get_children(db)[6])
17764 }
17765 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17766 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17767 }
17768}
17769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17770pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17771impl<'db> ItemTypeAliasPtr<'db> {
17772 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17773 let ptr = self.0.long(db);
17774 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17775 TerminalIdentifierGreen(key_fields[0])
17776 } else {
17777 panic!("Unexpected key field query on root.");
17778 }
17779 }
17780}
17781impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17782 type SyntaxNode = ItemTypeAlias<'db>;
17783 fn untyped(self) -> SyntaxStablePtrId<'db> {
17784 self.0
17785 }
17786 fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17787 ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17788 }
17789}
17790impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17791 fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17792 ptr.untyped()
17793 }
17794}
17795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17796pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17797impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17798 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17799 type StablePtr = ItemTypeAliasPtr<'db>;
17800 type Green = ItemTypeAliasGreen<'db>;
17801 fn missing(db: &'db dyn Database) -> Self::Green {
17802 ItemTypeAliasGreen(
17803 GreenNode {
17804 kind: SyntaxKind::ItemTypeAlias,
17805 details: GreenNodeDetails::Node {
17806 children: [
17807 AttributeList::missing(db).0,
17808 Visibility::missing(db).0,
17809 TerminalType::missing(db).0,
17810 TerminalIdentifier::missing(db).0,
17811 OptionWrappedGenericParamList::missing(db).0,
17812 TerminalEq::missing(db).0,
17813 Expr::missing(db).0,
17814 TerminalSemicolon::missing(db).0,
17815 ]
17816 .into(),
17817 width: TextWidth::default(),
17818 },
17819 }
17820 .intern(db),
17821 )
17822 }
17823 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17824 let kind = node.kind(db);
17825 assert_eq!(
17826 kind,
17827 SyntaxKind::ItemTypeAlias,
17828 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17829 kind,
17830 SyntaxKind::ItemTypeAlias
17831 );
17832 Self { node }
17833 }
17834 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17835 let kind = node.kind(db);
17836 if kind == SyntaxKind::ItemTypeAlias {
17837 Some(Self::from_syntax_node(db, node))
17838 } else {
17839 None
17840 }
17841 }
17842 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17843 self.node
17844 }
17845 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17846 ItemTypeAliasPtr(self.node.stable_ptr(db))
17847 }
17848}
17849#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17850pub struct ItemUse<'db> {
17851 node: SyntaxNode<'db>,
17852}
17853impl<'db> ItemUse<'db> {
17854 pub const INDEX_ATTRIBUTES: usize = 0;
17855 pub const INDEX_VISIBILITY: usize = 1;
17856 pub const INDEX_USE_KW: usize = 2;
17857 pub const INDEX_DOLLAR: usize = 3;
17858 pub const INDEX_USE_PATH: usize = 4;
17859 pub const INDEX_SEMICOLON: usize = 5;
17860 pub fn new_green(
17861 db: &'db dyn Database,
17862 attributes: AttributeListGreen<'db>,
17863 visibility: VisibilityGreen<'db>,
17864 use_kw: TerminalUseGreen<'db>,
17865 dollar: OptionTerminalDollarGreen<'db>,
17866 use_path: UsePathGreen<'db>,
17867 semicolon: TerminalSemicolonGreen<'db>,
17868 ) -> ItemUseGreen<'db> {
17869 let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17870 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17871 ItemUseGreen(
17872 GreenNode {
17873 kind: SyntaxKind::ItemUse,
17874 details: GreenNodeDetails::Node { children: children.into(), width },
17875 }
17876 .intern(db),
17877 )
17878 }
17879}
17880impl<'db> ItemUse<'db> {
17881 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17882 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17883 }
17884 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17885 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17886 }
17887 pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17888 TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17889 }
17890 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17891 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17892 }
17893 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17894 UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17895 }
17896 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17897 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17898 }
17899}
17900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17901pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17902impl<'db> ItemUsePtr<'db> {
17903 pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17904 let ptr = self.0.long(db);
17905 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17906 UsePathGreen(key_fields[0])
17907 } else {
17908 panic!("Unexpected key field query on root.");
17909 }
17910 }
17911}
17912impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17913 type SyntaxNode = ItemUse<'db>;
17914 fn untyped(self) -> SyntaxStablePtrId<'db> {
17915 self.0
17916 }
17917 fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17918 ItemUse::from_syntax_node(db, self.0.lookup(db))
17919 }
17920}
17921impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17922 fn from(ptr: ItemUsePtr<'db>) -> Self {
17923 ptr.untyped()
17924 }
17925}
17926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17927pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17928impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17929 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17930 type StablePtr = ItemUsePtr<'db>;
17931 type Green = ItemUseGreen<'db>;
17932 fn missing(db: &'db dyn Database) -> Self::Green {
17933 ItemUseGreen(
17934 GreenNode {
17935 kind: SyntaxKind::ItemUse,
17936 details: GreenNodeDetails::Node {
17937 children: [
17938 AttributeList::missing(db).0,
17939 Visibility::missing(db).0,
17940 TerminalUse::missing(db).0,
17941 OptionTerminalDollar::missing(db).0,
17942 UsePath::missing(db).0,
17943 TerminalSemicolon::missing(db).0,
17944 ]
17945 .into(),
17946 width: TextWidth::default(),
17947 },
17948 }
17949 .intern(db),
17950 )
17951 }
17952 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17953 let kind = node.kind(db);
17954 assert_eq!(
17955 kind,
17956 SyntaxKind::ItemUse,
17957 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17958 kind,
17959 SyntaxKind::ItemUse
17960 );
17961 Self { node }
17962 }
17963 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17964 let kind = node.kind(db);
17965 if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17966 }
17967 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17968 self.node
17969 }
17970 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17971 ItemUsePtr(self.node.stable_ptr(db))
17972 }
17973}
17974#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17975pub enum UsePath<'db> {
17976 Leaf(UsePathLeaf<'db>),
17977 Single(UsePathSingle<'db>),
17978 Multi(UsePathMulti<'db>),
17979 Star(UsePathStar<'db>),
17980}
17981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17982pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17983impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17984 type SyntaxNode = UsePath<'db>;
17985 fn untyped(self) -> SyntaxStablePtrId<'db> {
17986 self.0
17987 }
17988 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17989 UsePath::from_syntax_node(db, self.0.lookup(db))
17990 }
17991}
17992impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17993 fn from(ptr: UsePathPtr<'db>) -> Self {
17994 ptr.untyped()
17995 }
17996}
17997impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17998 fn from(value: UsePathLeafPtr<'db>) -> Self {
17999 Self(value.0)
18000 }
18001}
18002impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
18003 fn from(value: UsePathSinglePtr<'db>) -> Self {
18004 Self(value.0)
18005 }
18006}
18007impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
18008 fn from(value: UsePathMultiPtr<'db>) -> Self {
18009 Self(value.0)
18010 }
18011}
18012impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
18013 fn from(value: UsePathStarPtr<'db>) -> Self {
18014 Self(value.0)
18015 }
18016}
18017impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
18018 fn from(value: UsePathLeafGreen<'db>) -> Self {
18019 Self(value.0)
18020 }
18021}
18022impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
18023 fn from(value: UsePathSingleGreen<'db>) -> Self {
18024 Self(value.0)
18025 }
18026}
18027impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
18028 fn from(value: UsePathMultiGreen<'db>) -> Self {
18029 Self(value.0)
18030 }
18031}
18032impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
18033 fn from(value: UsePathStarGreen<'db>) -> Self {
18034 Self(value.0)
18035 }
18036}
18037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18038pub struct UsePathGreen<'db>(pub GreenId<'db>);
18039impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
18040 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18041 type StablePtr = UsePathPtr<'db>;
18042 type Green = UsePathGreen<'db>;
18043 fn missing(db: &'db dyn Database) -> Self::Green {
18044 panic!("No missing variant.");
18045 }
18046 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18047 let kind = node.kind(db);
18048 match kind {
18049 SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
18050 SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
18051 SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
18052 SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
18053 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
18054 }
18055 }
18056 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18057 let kind = node.kind(db);
18058 match kind {
18059 SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
18060 SyntaxKind::UsePathSingle => {
18061 Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
18062 }
18063 SyntaxKind::UsePathMulti => {
18064 Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
18065 }
18066 SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
18067 _ => None,
18068 }
18069 }
18070 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18071 match self {
18072 UsePath::Leaf(x) => x.as_syntax_node(),
18073 UsePath::Single(x) => x.as_syntax_node(),
18074 UsePath::Multi(x) => x.as_syntax_node(),
18075 UsePath::Star(x) => x.as_syntax_node(),
18076 }
18077 }
18078 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18079 UsePathPtr(self.as_syntax_node().long(db).stable_ptr)
18080 }
18081}
18082impl<'db> UsePath<'db> {
18083 pub fn is_variant(kind: SyntaxKind) -> bool {
18085 matches!(
18086 kind,
18087 SyntaxKind::UsePathLeaf
18088 | SyntaxKind::UsePathSingle
18089 | SyntaxKind::UsePathMulti
18090 | SyntaxKind::UsePathStar
18091 )
18092 }
18093}
18094#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18095pub struct UsePathLeaf<'db> {
18096 node: SyntaxNode<'db>,
18097}
18098impl<'db> UsePathLeaf<'db> {
18099 pub const INDEX_IDENT: usize = 0;
18100 pub const INDEX_ALIAS_CLAUSE: usize = 1;
18101 pub fn new_green(
18102 db: &'db dyn Database,
18103 ident: PathSegmentGreen<'db>,
18104 alias_clause: OptionAliasClauseGreen<'db>,
18105 ) -> UsePathLeafGreen<'db> {
18106 let children = [ident.0, alias_clause.0];
18107 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18108 UsePathLeafGreen(
18109 GreenNode {
18110 kind: SyntaxKind::UsePathLeaf,
18111 details: GreenNodeDetails::Node { children: children.into(), width },
18112 }
18113 .intern(db),
18114 )
18115 }
18116}
18117impl<'db> UsePathLeaf<'db> {
18118 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18119 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18120 }
18121 pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
18122 OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
18123 }
18124}
18125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18126pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
18127impl<'db> UsePathLeafPtr<'db> {
18128 pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
18129 let ptr = self.0.long(db);
18130 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18131 PathSegmentGreen(key_fields[0])
18132 } else {
18133 panic!("Unexpected key field query on root.");
18134 }
18135 }
18136 pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
18137 let ptr = self.0.long(db);
18138 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18139 OptionAliasClauseGreen(key_fields[1])
18140 } else {
18141 panic!("Unexpected key field query on root.");
18142 }
18143 }
18144}
18145impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
18146 type SyntaxNode = UsePathLeaf<'db>;
18147 fn untyped(self) -> SyntaxStablePtrId<'db> {
18148 self.0
18149 }
18150 fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
18151 UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18152 }
18153}
18154impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
18155 fn from(ptr: UsePathLeafPtr<'db>) -> Self {
18156 ptr.untyped()
18157 }
18158}
18159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18160pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
18161impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
18162 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18163 type StablePtr = UsePathLeafPtr<'db>;
18164 type Green = UsePathLeafGreen<'db>;
18165 fn missing(db: &'db dyn Database) -> Self::Green {
18166 UsePathLeafGreen(
18167 GreenNode {
18168 kind: SyntaxKind::UsePathLeaf,
18169 details: GreenNodeDetails::Node {
18170 children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
18171 width: TextWidth::default(),
18172 },
18173 }
18174 .intern(db),
18175 )
18176 }
18177 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18178 let kind = node.kind(db);
18179 assert_eq!(
18180 kind,
18181 SyntaxKind::UsePathLeaf,
18182 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18183 kind,
18184 SyntaxKind::UsePathLeaf
18185 );
18186 Self { node }
18187 }
18188 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18189 let kind = node.kind(db);
18190 if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18191 }
18192 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18193 self.node
18194 }
18195 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18196 UsePathLeafPtr(self.node.stable_ptr(db))
18197 }
18198}
18199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18200pub struct UsePathSingle<'db> {
18201 node: SyntaxNode<'db>,
18202}
18203impl<'db> UsePathSingle<'db> {
18204 pub const INDEX_IDENT: usize = 0;
18205 pub const INDEX_COLON_COLON: usize = 1;
18206 pub const INDEX_USE_PATH: usize = 2;
18207 pub fn new_green(
18208 db: &'db dyn Database,
18209 ident: PathSegmentGreen<'db>,
18210 colon_colon: TerminalColonColonGreen<'db>,
18211 use_path: UsePathGreen<'db>,
18212 ) -> UsePathSingleGreen<'db> {
18213 let children = [ident.0, colon_colon.0, use_path.0];
18214 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18215 UsePathSingleGreen(
18216 GreenNode {
18217 kind: SyntaxKind::UsePathSingle,
18218 details: GreenNodeDetails::Node { children: children.into(), width },
18219 }
18220 .intern(db),
18221 )
18222 }
18223}
18224impl<'db> UsePathSingle<'db> {
18225 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18226 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18227 }
18228 pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18229 TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18230 }
18231 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18232 UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18233 }
18234}
18235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18236pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18237impl<'db> UsePathSinglePtr<'db> {}
18238impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18239 type SyntaxNode = UsePathSingle<'db>;
18240 fn untyped(self) -> SyntaxStablePtrId<'db> {
18241 self.0
18242 }
18243 fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18244 UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18245 }
18246}
18247impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18248 fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18249 ptr.untyped()
18250 }
18251}
18252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18253pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18254impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18255 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18256 type StablePtr = UsePathSinglePtr<'db>;
18257 type Green = UsePathSingleGreen<'db>;
18258 fn missing(db: &'db dyn Database) -> Self::Green {
18259 UsePathSingleGreen(
18260 GreenNode {
18261 kind: SyntaxKind::UsePathSingle,
18262 details: GreenNodeDetails::Node {
18263 children: [
18264 PathSegment::missing(db).0,
18265 TerminalColonColon::missing(db).0,
18266 UsePath::missing(db).0,
18267 ]
18268 .into(),
18269 width: TextWidth::default(),
18270 },
18271 }
18272 .intern(db),
18273 )
18274 }
18275 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18276 let kind = node.kind(db);
18277 assert_eq!(
18278 kind,
18279 SyntaxKind::UsePathSingle,
18280 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18281 kind,
18282 SyntaxKind::UsePathSingle
18283 );
18284 Self { node }
18285 }
18286 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18287 let kind = node.kind(db);
18288 if kind == SyntaxKind::UsePathSingle {
18289 Some(Self::from_syntax_node(db, node))
18290 } else {
18291 None
18292 }
18293 }
18294 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18295 self.node
18296 }
18297 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18298 UsePathSinglePtr(self.node.stable_ptr(db))
18299 }
18300}
18301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18302pub struct UsePathMulti<'db> {
18303 node: SyntaxNode<'db>,
18304}
18305impl<'db> UsePathMulti<'db> {
18306 pub const INDEX_LBRACE: usize = 0;
18307 pub const INDEX_USE_PATHS: usize = 1;
18308 pub const INDEX_RBRACE: usize = 2;
18309 pub fn new_green(
18310 db: &'db dyn Database,
18311 lbrace: TerminalLBraceGreen<'db>,
18312 use_paths: UsePathListGreen<'db>,
18313 rbrace: TerminalRBraceGreen<'db>,
18314 ) -> UsePathMultiGreen<'db> {
18315 let children = [lbrace.0, use_paths.0, rbrace.0];
18316 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18317 UsePathMultiGreen(
18318 GreenNode {
18319 kind: SyntaxKind::UsePathMulti,
18320 details: GreenNodeDetails::Node { children: children.into(), width },
18321 }
18322 .intern(db),
18323 )
18324 }
18325}
18326impl<'db> UsePathMulti<'db> {
18327 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18328 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18329 }
18330 pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18331 UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18332 }
18333 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18334 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18335 }
18336}
18337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18338pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18339impl<'db> UsePathMultiPtr<'db> {}
18340impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18341 type SyntaxNode = UsePathMulti<'db>;
18342 fn untyped(self) -> SyntaxStablePtrId<'db> {
18343 self.0
18344 }
18345 fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18346 UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18347 }
18348}
18349impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18350 fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18351 ptr.untyped()
18352 }
18353}
18354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18355pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18356impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18357 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18358 type StablePtr = UsePathMultiPtr<'db>;
18359 type Green = UsePathMultiGreen<'db>;
18360 fn missing(db: &'db dyn Database) -> Self::Green {
18361 UsePathMultiGreen(
18362 GreenNode {
18363 kind: SyntaxKind::UsePathMulti,
18364 details: GreenNodeDetails::Node {
18365 children: [
18366 TerminalLBrace::missing(db).0,
18367 UsePathList::missing(db).0,
18368 TerminalRBrace::missing(db).0,
18369 ]
18370 .into(),
18371 width: TextWidth::default(),
18372 },
18373 }
18374 .intern(db),
18375 )
18376 }
18377 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18378 let kind = node.kind(db);
18379 assert_eq!(
18380 kind,
18381 SyntaxKind::UsePathMulti,
18382 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18383 kind,
18384 SyntaxKind::UsePathMulti
18385 );
18386 Self { node }
18387 }
18388 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18389 let kind = node.kind(db);
18390 if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18391 }
18392 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18393 self.node
18394 }
18395 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18396 UsePathMultiPtr(self.node.stable_ptr(db))
18397 }
18398}
18399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18400pub struct UsePathStar<'db> {
18401 node: SyntaxNode<'db>,
18402}
18403impl<'db> UsePathStar<'db> {
18404 pub const INDEX_STAR: usize = 0;
18405 pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18406 let children = [star.0];
18407 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18408 UsePathStarGreen(
18409 GreenNode {
18410 kind: SyntaxKind::UsePathStar,
18411 details: GreenNodeDetails::Node { children: children.into(), width },
18412 }
18413 .intern(db),
18414 )
18415 }
18416}
18417impl<'db> UsePathStar<'db> {
18418 pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18419 TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18420 }
18421}
18422#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18423pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18424impl<'db> UsePathStarPtr<'db> {}
18425impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18426 type SyntaxNode = UsePathStar<'db>;
18427 fn untyped(self) -> SyntaxStablePtrId<'db> {
18428 self.0
18429 }
18430 fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18431 UsePathStar::from_syntax_node(db, self.0.lookup(db))
18432 }
18433}
18434impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18435 fn from(ptr: UsePathStarPtr<'db>) -> Self {
18436 ptr.untyped()
18437 }
18438}
18439#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18440pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18441impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18442 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18443 type StablePtr = UsePathStarPtr<'db>;
18444 type Green = UsePathStarGreen<'db>;
18445 fn missing(db: &'db dyn Database) -> Self::Green {
18446 UsePathStarGreen(
18447 GreenNode {
18448 kind: SyntaxKind::UsePathStar,
18449 details: GreenNodeDetails::Node {
18450 children: [TerminalMul::missing(db).0].into(),
18451 width: TextWidth::default(),
18452 },
18453 }
18454 .intern(db),
18455 )
18456 }
18457 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18458 let kind = node.kind(db);
18459 assert_eq!(
18460 kind,
18461 SyntaxKind::UsePathStar,
18462 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18463 kind,
18464 SyntaxKind::UsePathStar
18465 );
18466 Self { node }
18467 }
18468 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18469 let kind = node.kind(db);
18470 if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18471 }
18472 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18473 self.node
18474 }
18475 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18476 UsePathStarPtr(self.node.stable_ptr(db))
18477 }
18478}
18479#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18480pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18481impl<'db> Deref for UsePathList<'db> {
18482 type Target = ElementList<'db, UsePath<'db>, 2>;
18483 fn deref(&self) -> &Self::Target {
18484 &self.0
18485 }
18486}
18487impl<'db> UsePathList<'db> {
18488 pub fn new_green(
18489 db: &'db dyn Database,
18490 children: &[UsePathListElementOrSeparatorGreen<'db>],
18491 ) -> UsePathListGreen<'db> {
18492 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18493 UsePathListGreen(
18494 GreenNode {
18495 kind: SyntaxKind::UsePathList,
18496 details: GreenNodeDetails::Node {
18497 children: children.iter().map(|x| x.id()).collect(),
18498 width,
18499 },
18500 }
18501 .intern(db),
18502 )
18503 }
18504}
18505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18506pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18507impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18508 type SyntaxNode = UsePathList<'db>;
18509 fn untyped(self) -> SyntaxStablePtrId<'db> {
18510 self.0
18511 }
18512 fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18513 UsePathList::from_syntax_node(db, self.0.lookup(db))
18514 }
18515}
18516impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18517 fn from(ptr: UsePathListPtr<'db>) -> Self {
18518 ptr.untyped()
18519 }
18520}
18521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18522pub enum UsePathListElementOrSeparatorGreen<'db> {
18523 Separator(TerminalCommaGreen<'db>),
18524 Element(UsePathGreen<'db>),
18525}
18526impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18527 fn from(value: TerminalCommaGreen<'db>) -> Self {
18528 UsePathListElementOrSeparatorGreen::Separator(value)
18529 }
18530}
18531impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18532 fn from(value: UsePathGreen<'db>) -> Self {
18533 UsePathListElementOrSeparatorGreen::Element(value)
18534 }
18535}
18536impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18537 fn id(&self) -> GreenId<'db> {
18538 match self {
18539 UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18540 UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18541 }
18542 }
18543}
18544#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18545pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18546impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18547 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18548 type StablePtr = UsePathListPtr<'db>;
18549 type Green = UsePathListGreen<'db>;
18550 fn missing(db: &'db dyn Database) -> Self::Green {
18551 UsePathListGreen(
18552 GreenNode {
18553 kind: SyntaxKind::UsePathList,
18554 details: GreenNodeDetails::Node {
18555 children: [].into(),
18556 width: TextWidth::default(),
18557 },
18558 }
18559 .intern(db),
18560 )
18561 }
18562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18563 Self(ElementList::new(node))
18564 }
18565 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18566 if node.kind(db) == SyntaxKind::UsePathList {
18567 Some(Self(ElementList::new(node)))
18568 } else {
18569 None
18570 }
18571 }
18572 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18573 self.node
18574 }
18575 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18576 UsePathListPtr(self.node.stable_ptr(db))
18577 }
18578}
18579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18580pub struct AliasClause<'db> {
18581 node: SyntaxNode<'db>,
18582}
18583impl<'db> AliasClause<'db> {
18584 pub const INDEX_AS_KW: usize = 0;
18585 pub const INDEX_ALIAS: usize = 1;
18586 pub fn new_green(
18587 db: &'db dyn Database,
18588 as_kw: TerminalAsGreen<'db>,
18589 alias: TerminalIdentifierGreen<'db>,
18590 ) -> AliasClauseGreen<'db> {
18591 let children = [as_kw.0, alias.0];
18592 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18593 AliasClauseGreen(
18594 GreenNode {
18595 kind: SyntaxKind::AliasClause,
18596 details: GreenNodeDetails::Node { children: children.into(), width },
18597 }
18598 .intern(db),
18599 )
18600 }
18601}
18602impl<'db> AliasClause<'db> {
18603 pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18604 TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18605 }
18606 pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18607 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18608 }
18609}
18610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18611pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18612impl<'db> AliasClausePtr<'db> {
18613 pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18614 let ptr = self.0.long(db);
18615 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18616 TerminalIdentifierGreen(key_fields[0])
18617 } else {
18618 panic!("Unexpected key field query on root.");
18619 }
18620 }
18621}
18622impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18623 type SyntaxNode = AliasClause<'db>;
18624 fn untyped(self) -> SyntaxStablePtrId<'db> {
18625 self.0
18626 }
18627 fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18628 AliasClause::from_syntax_node(db, self.0.lookup(db))
18629 }
18630}
18631impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18632 fn from(ptr: AliasClausePtr<'db>) -> Self {
18633 ptr.untyped()
18634 }
18635}
18636#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18637pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18638impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18639 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18640 type StablePtr = AliasClausePtr<'db>;
18641 type Green = AliasClauseGreen<'db>;
18642 fn missing(db: &'db dyn Database) -> Self::Green {
18643 AliasClauseGreen(
18644 GreenNode {
18645 kind: SyntaxKind::AliasClause,
18646 details: GreenNodeDetails::Node {
18647 children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18648 width: TextWidth::default(),
18649 },
18650 }
18651 .intern(db),
18652 )
18653 }
18654 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18655 let kind = node.kind(db);
18656 assert_eq!(
18657 kind,
18658 SyntaxKind::AliasClause,
18659 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18660 kind,
18661 SyntaxKind::AliasClause
18662 );
18663 Self { node }
18664 }
18665 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18666 let kind = node.kind(db);
18667 if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18668 }
18669 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18670 self.node
18671 }
18672 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18673 AliasClausePtr(self.node.stable_ptr(db))
18674 }
18675}
18676#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18677pub enum OptionAliasClause<'db> {
18678 Empty(OptionAliasClauseEmpty<'db>),
18679 AliasClause(AliasClause<'db>),
18680}
18681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18682pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18683impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18684 type SyntaxNode = OptionAliasClause<'db>;
18685 fn untyped(self) -> SyntaxStablePtrId<'db> {
18686 self.0
18687 }
18688 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18689 OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18690 }
18691}
18692impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18693 fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18694 ptr.untyped()
18695 }
18696}
18697impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18698 fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18699 Self(value.0)
18700 }
18701}
18702impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18703 fn from(value: AliasClausePtr<'db>) -> Self {
18704 Self(value.0)
18705 }
18706}
18707impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18708 fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18709 Self(value.0)
18710 }
18711}
18712impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18713 fn from(value: AliasClauseGreen<'db>) -> Self {
18714 Self(value.0)
18715 }
18716}
18717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18718pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18719impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18720 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18721 type StablePtr = OptionAliasClausePtr<'db>;
18722 type Green = OptionAliasClauseGreen<'db>;
18723 fn missing(db: &'db dyn Database) -> Self::Green {
18724 panic!("No missing variant.");
18725 }
18726 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18727 let kind = node.kind(db);
18728 match kind {
18729 SyntaxKind::OptionAliasClauseEmpty => {
18730 OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18731 }
18732 SyntaxKind::AliasClause => {
18733 OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18734 }
18735 _ => panic!(
18736 "Unexpected syntax kind {:?} when constructing {}.",
18737 kind, "OptionAliasClause"
18738 ),
18739 }
18740 }
18741 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18742 let kind = node.kind(db);
18743 match kind {
18744 SyntaxKind::OptionAliasClauseEmpty => {
18745 Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18746 }
18747 SyntaxKind::AliasClause => {
18748 Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18749 }
18750 _ => None,
18751 }
18752 }
18753 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18754 match self {
18755 OptionAliasClause::Empty(x) => x.as_syntax_node(),
18756 OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18757 }
18758 }
18759 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18760 OptionAliasClausePtr(self.as_syntax_node().long(db).stable_ptr)
18761 }
18762}
18763impl<'db> OptionAliasClause<'db> {
18764 pub fn is_variant(kind: SyntaxKind) -> bool {
18766 matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18767 }
18768}
18769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18770pub struct OptionAliasClauseEmpty<'db> {
18771 node: SyntaxNode<'db>,
18772}
18773impl<'db> OptionAliasClauseEmpty<'db> {
18774 pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18775 let children = [];
18776 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18777 OptionAliasClauseEmptyGreen(
18778 GreenNode {
18779 kind: SyntaxKind::OptionAliasClauseEmpty,
18780 details: GreenNodeDetails::Node { children: children.into(), width },
18781 }
18782 .intern(db),
18783 )
18784 }
18785}
18786impl<'db> OptionAliasClauseEmpty<'db> {}
18787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18788pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18789impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18790impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18791 type SyntaxNode = OptionAliasClauseEmpty<'db>;
18792 fn untyped(self) -> SyntaxStablePtrId<'db> {
18793 self.0
18794 }
18795 fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18796 OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18797 }
18798}
18799impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18800 fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18801 ptr.untyped()
18802 }
18803}
18804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18805pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18806impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18807 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18808 type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18809 type Green = OptionAliasClauseEmptyGreen<'db>;
18810 fn missing(db: &'db dyn Database) -> Self::Green {
18811 OptionAliasClauseEmptyGreen(
18812 GreenNode {
18813 kind: SyntaxKind::OptionAliasClauseEmpty,
18814 details: GreenNodeDetails::Node {
18815 children: [].into(),
18816 width: TextWidth::default(),
18817 },
18818 }
18819 .intern(db),
18820 )
18821 }
18822 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18823 let kind = node.kind(db);
18824 assert_eq!(
18825 kind,
18826 SyntaxKind::OptionAliasClauseEmpty,
18827 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18828 kind,
18829 SyntaxKind::OptionAliasClauseEmpty
18830 );
18831 Self { node }
18832 }
18833 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18834 let kind = node.kind(db);
18835 if kind == SyntaxKind::OptionAliasClauseEmpty {
18836 Some(Self::from_syntax_node(db, node))
18837 } else {
18838 None
18839 }
18840 }
18841 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18842 self.node
18843 }
18844 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18845 OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18846 }
18847}
18848#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18849pub enum GenericArg<'db> {
18850 Unnamed(GenericArgUnnamed<'db>),
18851 Named(GenericArgNamed<'db>),
18852}
18853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18854pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18855impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18856 type SyntaxNode = GenericArg<'db>;
18857 fn untyped(self) -> SyntaxStablePtrId<'db> {
18858 self.0
18859 }
18860 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18861 GenericArg::from_syntax_node(db, self.0.lookup(db))
18862 }
18863}
18864impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18865 fn from(ptr: GenericArgPtr<'db>) -> Self {
18866 ptr.untyped()
18867 }
18868}
18869impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18870 fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18871 Self(value.0)
18872 }
18873}
18874impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18875 fn from(value: GenericArgNamedPtr<'db>) -> Self {
18876 Self(value.0)
18877 }
18878}
18879impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18880 fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18881 Self(value.0)
18882 }
18883}
18884impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18885 fn from(value: GenericArgNamedGreen<'db>) -> Self {
18886 Self(value.0)
18887 }
18888}
18889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18890pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18891impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18892 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18893 type StablePtr = GenericArgPtr<'db>;
18894 type Green = GenericArgGreen<'db>;
18895 fn missing(db: &'db dyn Database) -> Self::Green {
18896 panic!("No missing variant.");
18897 }
18898 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18899 let kind = node.kind(db);
18900 match kind {
18901 SyntaxKind::GenericArgUnnamed => {
18902 GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18903 }
18904 SyntaxKind::GenericArgNamed => {
18905 GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18906 }
18907 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18908 }
18909 }
18910 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18911 let kind = node.kind(db);
18912 match kind {
18913 SyntaxKind::GenericArgUnnamed => {
18914 Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18915 }
18916 SyntaxKind::GenericArgNamed => {
18917 Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18918 }
18919 _ => None,
18920 }
18921 }
18922 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18923 match self {
18924 GenericArg::Unnamed(x) => x.as_syntax_node(),
18925 GenericArg::Named(x) => x.as_syntax_node(),
18926 }
18927 }
18928 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18929 GenericArgPtr(self.as_syntax_node().long(db).stable_ptr)
18930 }
18931}
18932impl<'db> GenericArg<'db> {
18933 pub fn is_variant(kind: SyntaxKind) -> bool {
18935 matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18936 }
18937}
18938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18939pub struct GenericArgNamed<'db> {
18940 node: SyntaxNode<'db>,
18941}
18942impl<'db> GenericArgNamed<'db> {
18943 pub const INDEX_NAME: usize = 0;
18944 pub const INDEX_COLON: usize = 1;
18945 pub const INDEX_VALUE: usize = 2;
18946 pub fn new_green(
18947 db: &'db dyn Database,
18948 name: TerminalIdentifierGreen<'db>,
18949 colon: TerminalColonGreen<'db>,
18950 value: GenericArgValueGreen<'db>,
18951 ) -> GenericArgNamedGreen<'db> {
18952 let children = [name.0, colon.0, value.0];
18953 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18954 GenericArgNamedGreen(
18955 GreenNode {
18956 kind: SyntaxKind::GenericArgNamed,
18957 details: GreenNodeDetails::Node { children: children.into(), width },
18958 }
18959 .intern(db),
18960 )
18961 }
18962}
18963impl<'db> GenericArgNamed<'db> {
18964 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18965 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18966 }
18967 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18968 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18969 }
18970 pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18971 GenericArgValue::from_syntax_node(db, self.node.get_children(db)[2])
18972 }
18973}
18974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18975pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18976impl<'db> GenericArgNamedPtr<'db> {}
18977impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18978 type SyntaxNode = GenericArgNamed<'db>;
18979 fn untyped(self) -> SyntaxStablePtrId<'db> {
18980 self.0
18981 }
18982 fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18983 GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18984 }
18985}
18986impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18987 fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18988 ptr.untyped()
18989 }
18990}
18991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18992pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18993impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18994 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18995 type StablePtr = GenericArgNamedPtr<'db>;
18996 type Green = GenericArgNamedGreen<'db>;
18997 fn missing(db: &'db dyn Database) -> Self::Green {
18998 GenericArgNamedGreen(
18999 GreenNode {
19000 kind: SyntaxKind::GenericArgNamed,
19001 details: GreenNodeDetails::Node {
19002 children: [
19003 TerminalIdentifier::missing(db).0,
19004 TerminalColon::missing(db).0,
19005 GenericArgValue::missing(db).0,
19006 ]
19007 .into(),
19008 width: TextWidth::default(),
19009 },
19010 }
19011 .intern(db),
19012 )
19013 }
19014 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19015 let kind = node.kind(db);
19016 assert_eq!(
19017 kind,
19018 SyntaxKind::GenericArgNamed,
19019 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19020 kind,
19021 SyntaxKind::GenericArgNamed
19022 );
19023 Self { node }
19024 }
19025 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19026 let kind = node.kind(db);
19027 if kind == SyntaxKind::GenericArgNamed {
19028 Some(Self::from_syntax_node(db, node))
19029 } else {
19030 None
19031 }
19032 }
19033 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19034 self.node
19035 }
19036 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19037 GenericArgNamedPtr(self.node.stable_ptr(db))
19038 }
19039}
19040#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19041pub struct GenericArgUnnamed<'db> {
19042 node: SyntaxNode<'db>,
19043}
19044impl<'db> GenericArgUnnamed<'db> {
19045 pub const INDEX_VALUE: usize = 0;
19046 pub fn new_green(
19047 db: &'db dyn Database,
19048 value: GenericArgValueGreen<'db>,
19049 ) -> GenericArgUnnamedGreen<'db> {
19050 let children = [value.0];
19051 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19052 GenericArgUnnamedGreen(
19053 GreenNode {
19054 kind: SyntaxKind::GenericArgUnnamed,
19055 details: GreenNodeDetails::Node { children: children.into(), width },
19056 }
19057 .intern(db),
19058 )
19059 }
19060}
19061impl<'db> GenericArgUnnamed<'db> {
19062 pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
19063 GenericArgValue::from_syntax_node(db, self.node.get_children(db)[0])
19064 }
19065}
19066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19067pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
19068impl<'db> GenericArgUnnamedPtr<'db> {}
19069impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
19070 type SyntaxNode = GenericArgUnnamed<'db>;
19071 fn untyped(self) -> SyntaxStablePtrId<'db> {
19072 self.0
19073 }
19074 fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
19075 GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
19076 }
19077}
19078impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
19079 fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
19080 ptr.untyped()
19081 }
19082}
19083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19084pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
19085impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
19086 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
19087 type StablePtr = GenericArgUnnamedPtr<'db>;
19088 type Green = GenericArgUnnamedGreen<'db>;
19089 fn missing(db: &'db dyn Database) -> Self::Green {
19090 GenericArgUnnamedGreen(
19091 GreenNode {
19092 kind: SyntaxKind::GenericArgUnnamed,
19093 details: GreenNodeDetails::Node {
19094 children: [GenericArgValue::missing(db).0].into(),
19095 width: TextWidth::default(),
19096 },
19097 }
19098 .intern(db),
19099 )
19100 }
19101 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19102 let kind = node.kind(db);
19103 assert_eq!(
19104 kind,
19105 SyntaxKind::GenericArgUnnamed,
19106 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19107 kind,
19108 SyntaxKind::GenericArgUnnamed
19109 );
19110 Self { node }
19111 }
19112 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19113 let kind = node.kind(db);
19114 if kind == SyntaxKind::GenericArgUnnamed {
19115 Some(Self::from_syntax_node(db, node))
19116 } else {
19117 None
19118 }
19119 }
19120 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19121 self.node
19122 }
19123 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19124 GenericArgUnnamedPtr(self.node.stable_ptr(db))
19125 }
19126}
19127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19128pub enum GenericArgValue<'db> {
19129 Expr(GenericArgValueExpr<'db>),
19130 Underscore(TerminalUnderscore<'db>),
19131}
19132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19133pub struct GenericArgValuePtr<'db>(pub SyntaxStablePtrId<'db>);
19134impl<'db> TypedStablePtr<'db> for GenericArgValuePtr<'db> {
19135 type SyntaxNode = GenericArgValue<'db>;
19136 fn untyped(self) -> SyntaxStablePtrId<'db> {
19137 self.0
19138 }
19139 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19140 GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19141 }
19142}
19143impl<'db> From<GenericArgValuePtr<'db>> for SyntaxStablePtrId<'db> {
19144 fn from(ptr: GenericArgValuePtr<'db>) -> Self {
19145 ptr.untyped()
19146 }
19147}
19148impl<'db> From<GenericArgValueExprPtr<'db>> for GenericArgValuePtr<'db> {
19149 fn from(value: GenericArgValueExprPtr<'db>) -> Self {
19150 Self(value.0)
19151 }
19152}
19153impl<'db> From<TerminalUnderscorePtr<'db>> for GenericArgValuePtr<'db> {
19154 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
19155 Self(value.0)
19156 }
19157}
19158impl<'db> From<GenericArgValueExprGreen<'db>> for GenericArgValueGreen<'db> {
19159 fn from(value: GenericArgValueExprGreen<'db>) -> Self {
19160 Self(value.0)
19161 }
19162}
19163impl<'db> From<TerminalUnderscoreGreen<'db>> for GenericArgValueGreen<'db> {
19164 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
19165 Self(value.0)
19166 }
19167}
19168#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19169pub struct GenericArgValueGreen<'db>(pub GreenId<'db>);
19170impl<'db> TypedSyntaxNode<'db> for GenericArgValue<'db> {
19171 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19172 type StablePtr = GenericArgValuePtr<'db>;
19173 type Green = GenericArgValueGreen<'db>;
19174 fn missing(db: &'db dyn Database) -> Self::Green {
19175 panic!("No missing variant.");
19176 }
19177 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19178 let kind = node.kind(db);
19179 match kind {
19180 SyntaxKind::GenericArgValueExpr => {
19181 GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19182 }
19183 SyntaxKind::TerminalUnderscore => {
19184 GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19185 }
19186 _ => {
19187 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19188 }
19189 }
19190 }
19191 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19192 let kind = node.kind(db);
19193 match kind {
19194 SyntaxKind::GenericArgValueExpr => {
19195 Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19196 }
19197 SyntaxKind::TerminalUnderscore => {
19198 Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19199 }
19200 _ => None,
19201 }
19202 }
19203 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19204 match self {
19205 GenericArgValue::Expr(x) => x.as_syntax_node(),
19206 GenericArgValue::Underscore(x) => x.as_syntax_node(),
19207 }
19208 }
19209 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19210 GenericArgValuePtr(self.as_syntax_node().long(db).stable_ptr)
19211 }
19212}
19213impl<'db> GenericArgValue<'db> {
19214 pub fn is_variant(kind: SyntaxKind) -> bool {
19216 matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19217 }
19218}
19219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19220pub struct GenericArgValueExpr<'db> {
19221 node: SyntaxNode<'db>,
19222}
19223impl<'db> GenericArgValueExpr<'db> {
19224 pub const INDEX_EXPR: usize = 0;
19225 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> GenericArgValueExprGreen<'db> {
19226 let children = [expr.0];
19227 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19228 GenericArgValueExprGreen(
19229 GreenNode {
19230 kind: SyntaxKind::GenericArgValueExpr,
19231 details: GreenNodeDetails::Node { children: children.into(), width },
19232 }
19233 .intern(db),
19234 )
19235 }
19236}
19237impl<'db> GenericArgValueExpr<'db> {
19238 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
19239 Expr::from_syntax_node(db, self.node.get_children(db)[0])
19240 }
19241}
19242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19243pub struct GenericArgValueExprPtr<'db>(pub SyntaxStablePtrId<'db>);
19244impl<'db> GenericArgValueExprPtr<'db> {}
19245impl<'db> TypedStablePtr<'db> for GenericArgValueExprPtr<'db> {
19246 type SyntaxNode = GenericArgValueExpr<'db>;
19247 fn untyped(self) -> SyntaxStablePtrId<'db> {
19248 self.0
19249 }
19250 fn lookup(&self, db: &'db dyn Database) -> GenericArgValueExpr<'db> {
19251 GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19252 }
19253}
19254impl<'db> From<GenericArgValueExprPtr<'db>> for SyntaxStablePtrId<'db> {
19255 fn from(ptr: GenericArgValueExprPtr<'db>) -> Self {
19256 ptr.untyped()
19257 }
19258}
19259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19260pub struct GenericArgValueExprGreen<'db>(pub GreenId<'db>);
19261impl<'db> TypedSyntaxNode<'db> for GenericArgValueExpr<'db> {
19262 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19263 type StablePtr = GenericArgValueExprPtr<'db>;
19264 type Green = GenericArgValueExprGreen<'db>;
19265 fn missing(db: &'db dyn Database) -> Self::Green {
19266 GenericArgValueExprGreen(
19267 GreenNode {
19268 kind: SyntaxKind::GenericArgValueExpr,
19269 details: GreenNodeDetails::Node {
19270 children: [Expr::missing(db).0].into(),
19271 width: TextWidth::default(),
19272 },
19273 }
19274 .intern(db),
19275 )
19276 }
19277 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19278 let kind = node.kind(db);
19279 assert_eq!(
19280 kind,
19281 SyntaxKind::GenericArgValueExpr,
19282 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19283 kind,
19284 SyntaxKind::GenericArgValueExpr
19285 );
19286 Self { node }
19287 }
19288 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19289 let kind = node.kind(db);
19290 if kind == SyntaxKind::GenericArgValueExpr {
19291 Some(Self::from_syntax_node(db, node))
19292 } else {
19293 None
19294 }
19295 }
19296 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19297 self.node
19298 }
19299 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19300 GenericArgValueExprPtr(self.node.stable_ptr(db))
19301 }
19302}
19303#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19304pub struct GenericArgs<'db> {
19305 node: SyntaxNode<'db>,
19306}
19307impl<'db> GenericArgs<'db> {
19308 pub const INDEX_LANGLE: usize = 0;
19309 pub const INDEX_GENERIC_ARGS: usize = 1;
19310 pub const INDEX_RANGLE: usize = 2;
19311 pub fn new_green(
19312 db: &'db dyn Database,
19313 langle: TerminalLTGreen<'db>,
19314 generic_args: GenericArgListGreen<'db>,
19315 rangle: TerminalGTGreen<'db>,
19316 ) -> GenericArgsGreen<'db> {
19317 let children = [langle.0, generic_args.0, rangle.0];
19318 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19319 GenericArgsGreen(
19320 GreenNode {
19321 kind: SyntaxKind::GenericArgs,
19322 details: GreenNodeDetails::Node { children: children.into(), width },
19323 }
19324 .intern(db),
19325 )
19326 }
19327}
19328impl<'db> GenericArgs<'db> {
19329 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19330 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19331 }
19332 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19333 GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
19334 }
19335 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19336 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19337 }
19338}
19339#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19340pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
19341impl<'db> GenericArgsPtr<'db> {}
19342impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
19343 type SyntaxNode = GenericArgs<'db>;
19344 fn untyped(self) -> SyntaxStablePtrId<'db> {
19345 self.0
19346 }
19347 fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
19348 GenericArgs::from_syntax_node(db, self.0.lookup(db))
19349 }
19350}
19351impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
19352 fn from(ptr: GenericArgsPtr<'db>) -> Self {
19353 ptr.untyped()
19354 }
19355}
19356#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19357pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
19358impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
19359 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19360 type StablePtr = GenericArgsPtr<'db>;
19361 type Green = GenericArgsGreen<'db>;
19362 fn missing(db: &'db dyn Database) -> Self::Green {
19363 GenericArgsGreen(
19364 GreenNode {
19365 kind: SyntaxKind::GenericArgs,
19366 details: GreenNodeDetails::Node {
19367 children: [
19368 TerminalLT::missing(db).0,
19369 GenericArgList::missing(db).0,
19370 TerminalGT::missing(db).0,
19371 ]
19372 .into(),
19373 width: TextWidth::default(),
19374 },
19375 }
19376 .intern(db),
19377 )
19378 }
19379 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19380 let kind = node.kind(db);
19381 assert_eq!(
19382 kind,
19383 SyntaxKind::GenericArgs,
19384 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19385 kind,
19386 SyntaxKind::GenericArgs
19387 );
19388 Self { node }
19389 }
19390 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19391 let kind = node.kind(db);
19392 if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19393 }
19394 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19395 self.node
19396 }
19397 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19398 GenericArgsPtr(self.node.stable_ptr(db))
19399 }
19400}
19401#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19402pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19403impl<'db> Deref for GenericArgList<'db> {
19404 type Target = ElementList<'db, GenericArg<'db>, 2>;
19405 fn deref(&self) -> &Self::Target {
19406 &self.0
19407 }
19408}
19409impl<'db> GenericArgList<'db> {
19410 pub fn new_green(
19411 db: &'db dyn Database,
19412 children: &[GenericArgListElementOrSeparatorGreen<'db>],
19413 ) -> GenericArgListGreen<'db> {
19414 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19415 GenericArgListGreen(
19416 GreenNode {
19417 kind: SyntaxKind::GenericArgList,
19418 details: GreenNodeDetails::Node {
19419 children: children.iter().map(|x| x.id()).collect(),
19420 width,
19421 },
19422 }
19423 .intern(db),
19424 )
19425 }
19426}
19427#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19428pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19429impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19430 type SyntaxNode = GenericArgList<'db>;
19431 fn untyped(self) -> SyntaxStablePtrId<'db> {
19432 self.0
19433 }
19434 fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19435 GenericArgList::from_syntax_node(db, self.0.lookup(db))
19436 }
19437}
19438impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19439 fn from(ptr: GenericArgListPtr<'db>) -> Self {
19440 ptr.untyped()
19441 }
19442}
19443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19444pub enum GenericArgListElementOrSeparatorGreen<'db> {
19445 Separator(TerminalCommaGreen<'db>),
19446 Element(GenericArgGreen<'db>),
19447}
19448impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19449 fn from(value: TerminalCommaGreen<'db>) -> Self {
19450 GenericArgListElementOrSeparatorGreen::Separator(value)
19451 }
19452}
19453impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19454 fn from(value: GenericArgGreen<'db>) -> Self {
19455 GenericArgListElementOrSeparatorGreen::Element(value)
19456 }
19457}
19458impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19459 fn id(&self) -> GreenId<'db> {
19460 match self {
19461 GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19462 GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19463 }
19464 }
19465}
19466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19467pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19468impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19469 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19470 type StablePtr = GenericArgListPtr<'db>;
19471 type Green = GenericArgListGreen<'db>;
19472 fn missing(db: &'db dyn Database) -> Self::Green {
19473 GenericArgListGreen(
19474 GreenNode {
19475 kind: SyntaxKind::GenericArgList,
19476 details: GreenNodeDetails::Node {
19477 children: [].into(),
19478 width: TextWidth::default(),
19479 },
19480 }
19481 .intern(db),
19482 )
19483 }
19484 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19485 Self(ElementList::new(node))
19486 }
19487 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19488 if node.kind(db) == SyntaxKind::GenericArgList {
19489 Some(Self(ElementList::new(node)))
19490 } else {
19491 None
19492 }
19493 }
19494 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19495 self.node
19496 }
19497 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19498 GenericArgListPtr(self.node.stable_ptr(db))
19499 }
19500}
19501#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19502pub struct AssociatedItemConstraint<'db> {
19503 node: SyntaxNode<'db>,
19504}
19505impl<'db> AssociatedItemConstraint<'db> {
19506 pub const INDEX_ITEM: usize = 0;
19507 pub const INDEX_COLON: usize = 1;
19508 pub const INDEX_VALUE: usize = 2;
19509 pub fn new_green(
19510 db: &'db dyn Database,
19511 item: TerminalIdentifierGreen<'db>,
19512 colon: TerminalColonGreen<'db>,
19513 value: ExprGreen<'db>,
19514 ) -> AssociatedItemConstraintGreen<'db> {
19515 let children = [item.0, colon.0, value.0];
19516 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19517 AssociatedItemConstraintGreen(
19518 GreenNode {
19519 kind: SyntaxKind::AssociatedItemConstraint,
19520 details: GreenNodeDetails::Node { children: children.into(), width },
19521 }
19522 .intern(db),
19523 )
19524 }
19525}
19526impl<'db> AssociatedItemConstraint<'db> {
19527 pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19528 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19529 }
19530 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19531 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19532 }
19533 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19534 Expr::from_syntax_node(db, self.node.get_children(db)[2])
19535 }
19536}
19537#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19538pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19539impl<'db> AssociatedItemConstraintPtr<'db> {}
19540impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19541 type SyntaxNode = AssociatedItemConstraint<'db>;
19542 fn untyped(self) -> SyntaxStablePtrId<'db> {
19543 self.0
19544 }
19545 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19546 AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19547 }
19548}
19549impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19550 fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19551 ptr.untyped()
19552 }
19553}
19554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19555pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19556impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19557 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19558 type StablePtr = AssociatedItemConstraintPtr<'db>;
19559 type Green = AssociatedItemConstraintGreen<'db>;
19560 fn missing(db: &'db dyn Database) -> Self::Green {
19561 AssociatedItemConstraintGreen(
19562 GreenNode {
19563 kind: SyntaxKind::AssociatedItemConstraint,
19564 details: GreenNodeDetails::Node {
19565 children: [
19566 TerminalIdentifier::missing(db).0,
19567 TerminalColon::missing(db).0,
19568 Expr::missing(db).0,
19569 ]
19570 .into(),
19571 width: TextWidth::default(),
19572 },
19573 }
19574 .intern(db),
19575 )
19576 }
19577 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19578 let kind = node.kind(db);
19579 assert_eq!(
19580 kind,
19581 SyntaxKind::AssociatedItemConstraint,
19582 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19583 kind,
19584 SyntaxKind::AssociatedItemConstraint
19585 );
19586 Self { node }
19587 }
19588 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19589 let kind = node.kind(db);
19590 if kind == SyntaxKind::AssociatedItemConstraint {
19591 Some(Self::from_syntax_node(db, node))
19592 } else {
19593 None
19594 }
19595 }
19596 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19597 self.node
19598 }
19599 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19600 AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19601 }
19602}
19603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19604pub struct AssociatedItemConstraints<'db> {
19605 node: SyntaxNode<'db>,
19606}
19607impl<'db> AssociatedItemConstraints<'db> {
19608 pub const INDEX_LBRACK: usize = 0;
19609 pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19610 pub const INDEX_RBRACK: usize = 2;
19611 pub fn new_green(
19612 db: &'db dyn Database,
19613 lbrack: TerminalLBrackGreen<'db>,
19614 associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19615 rbrack: TerminalRBrackGreen<'db>,
19616 ) -> AssociatedItemConstraintsGreen<'db> {
19617 let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19618 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19619 AssociatedItemConstraintsGreen(
19620 GreenNode {
19621 kind: SyntaxKind::AssociatedItemConstraints,
19622 details: GreenNodeDetails::Node { children: children.into(), width },
19623 }
19624 .intern(db),
19625 )
19626 }
19627}
19628impl<'db> AssociatedItemConstraints<'db> {
19629 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19630 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19631 }
19632 pub fn associated_item_constraints(
19633 &self,
19634 db: &'db dyn Database,
19635 ) -> AssociatedItemConstraintList<'db> {
19636 AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19637 }
19638 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19639 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19640 }
19641}
19642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19643pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19644impl<'db> AssociatedItemConstraintsPtr<'db> {}
19645impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19646 type SyntaxNode = AssociatedItemConstraints<'db>;
19647 fn untyped(self) -> SyntaxStablePtrId<'db> {
19648 self.0
19649 }
19650 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19651 AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19652 }
19653}
19654impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19655 fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19656 ptr.untyped()
19657 }
19658}
19659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19660pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19661impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19662 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19663 type StablePtr = AssociatedItemConstraintsPtr<'db>;
19664 type Green = AssociatedItemConstraintsGreen<'db>;
19665 fn missing(db: &'db dyn Database) -> Self::Green {
19666 AssociatedItemConstraintsGreen(
19667 GreenNode {
19668 kind: SyntaxKind::AssociatedItemConstraints,
19669 details: GreenNodeDetails::Node {
19670 children: [
19671 TerminalLBrack::missing(db).0,
19672 AssociatedItemConstraintList::missing(db).0,
19673 TerminalRBrack::missing(db).0,
19674 ]
19675 .into(),
19676 width: TextWidth::default(),
19677 },
19678 }
19679 .intern(db),
19680 )
19681 }
19682 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19683 let kind = node.kind(db);
19684 assert_eq!(
19685 kind,
19686 SyntaxKind::AssociatedItemConstraints,
19687 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19688 kind,
19689 SyntaxKind::AssociatedItemConstraints
19690 );
19691 Self { node }
19692 }
19693 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19694 let kind = node.kind(db);
19695 if kind == SyntaxKind::AssociatedItemConstraints {
19696 Some(Self::from_syntax_node(db, node))
19697 } else {
19698 None
19699 }
19700 }
19701 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19702 self.node
19703 }
19704 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19705 AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19706 }
19707}
19708#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19709pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19710impl<'db> Deref for AssociatedItemConstraintList<'db> {
19711 type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19712 fn deref(&self) -> &Self::Target {
19713 &self.0
19714 }
19715}
19716impl<'db> AssociatedItemConstraintList<'db> {
19717 pub fn new_green(
19718 db: &'db dyn Database,
19719 children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19720 ) -> AssociatedItemConstraintListGreen<'db> {
19721 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19722 AssociatedItemConstraintListGreen(
19723 GreenNode {
19724 kind: SyntaxKind::AssociatedItemConstraintList,
19725 details: GreenNodeDetails::Node {
19726 children: children.iter().map(|x| x.id()).collect(),
19727 width,
19728 },
19729 }
19730 .intern(db),
19731 )
19732 }
19733}
19734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19735pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19736impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19737 type SyntaxNode = AssociatedItemConstraintList<'db>;
19738 fn untyped(self) -> SyntaxStablePtrId<'db> {
19739 self.0
19740 }
19741 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19742 AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19743 }
19744}
19745impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19746 fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19747 ptr.untyped()
19748 }
19749}
19750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19751pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19752 Separator(TerminalCommaGreen<'db>),
19753 Element(AssociatedItemConstraintGreen<'db>),
19754}
19755impl<'db> From<TerminalCommaGreen<'db>>
19756 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19757{
19758 fn from(value: TerminalCommaGreen<'db>) -> Self {
19759 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19760 }
19761}
19762impl<'db> From<AssociatedItemConstraintGreen<'db>>
19763 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19764{
19765 fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19766 AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19767 }
19768}
19769impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19770 fn id(&self) -> GreenId<'db> {
19771 match self {
19772 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19773 AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19774 }
19775 }
19776}
19777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19778pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19779impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19780 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19781 type StablePtr = AssociatedItemConstraintListPtr<'db>;
19782 type Green = AssociatedItemConstraintListGreen<'db>;
19783 fn missing(db: &'db dyn Database) -> Self::Green {
19784 AssociatedItemConstraintListGreen(
19785 GreenNode {
19786 kind: SyntaxKind::AssociatedItemConstraintList,
19787 details: GreenNodeDetails::Node {
19788 children: [].into(),
19789 width: TextWidth::default(),
19790 },
19791 }
19792 .intern(db),
19793 )
19794 }
19795 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19796 Self(ElementList::new(node))
19797 }
19798 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19799 if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19800 Some(Self(ElementList::new(node)))
19801 } else {
19802 None
19803 }
19804 }
19805 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19806 self.node
19807 }
19808 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19809 AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19810 }
19811}
19812#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19813pub enum OptionAssociatedItemConstraints<'db> {
19814 Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19815 AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19816}
19817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19818pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19819impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19820 type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19821 fn untyped(self) -> SyntaxStablePtrId<'db> {
19822 self.0
19823 }
19824 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19825 OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19826 }
19827}
19828impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19829 fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19830 ptr.untyped()
19831 }
19832}
19833impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19834 for OptionAssociatedItemConstraintsPtr<'db>
19835{
19836 fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19837 Self(value.0)
19838 }
19839}
19840impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19841 fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19842 Self(value.0)
19843 }
19844}
19845impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19846 for OptionAssociatedItemConstraintsGreen<'db>
19847{
19848 fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19849 Self(value.0)
19850 }
19851}
19852impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19853 fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19854 Self(value.0)
19855 }
19856}
19857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19858pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19859impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19860 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19861 type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19862 type Green = OptionAssociatedItemConstraintsGreen<'db>;
19863 fn missing(db: &'db dyn Database) -> Self::Green {
19864 panic!("No missing variant.");
19865 }
19866 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19867 let kind = node.kind(db);
19868 match kind {
19869 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19870 OptionAssociatedItemConstraints::Empty(
19871 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19872 )
19873 }
19874 SyntaxKind::AssociatedItemConstraints => {
19875 OptionAssociatedItemConstraints::AssociatedItemConstraints(
19876 AssociatedItemConstraints::from_syntax_node(db, node),
19877 )
19878 }
19879 _ => panic!(
19880 "Unexpected syntax kind {:?} when constructing {}.",
19881 kind, "OptionAssociatedItemConstraints"
19882 ),
19883 }
19884 }
19885 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19886 let kind = node.kind(db);
19887 match kind {
19888 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19889 Some(OptionAssociatedItemConstraints::Empty(
19890 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19891 ))
19892 }
19893 SyntaxKind::AssociatedItemConstraints => {
19894 Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19895 AssociatedItemConstraints::from_syntax_node(db, node),
19896 ))
19897 }
19898 _ => None,
19899 }
19900 }
19901 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19902 match self {
19903 OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19904 OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19905 }
19906 }
19907 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19908 OptionAssociatedItemConstraintsPtr(self.as_syntax_node().long(db).stable_ptr)
19909 }
19910}
19911impl<'db> OptionAssociatedItemConstraints<'db> {
19912 pub fn is_variant(kind: SyntaxKind) -> bool {
19914 matches!(
19915 kind,
19916 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19917 | SyntaxKind::AssociatedItemConstraints
19918 )
19919 }
19920}
19921#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19922pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19923 node: SyntaxNode<'db>,
19924}
19925impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19926 pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19927 let children = [];
19928 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19929 OptionAssociatedItemConstraintsEmptyGreen(
19930 GreenNode {
19931 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19932 details: GreenNodeDetails::Node { children: children.into(), width },
19933 }
19934 .intern(db),
19935 )
19936 }
19937}
19938impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19939#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19940pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19941impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19942impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19943 type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19944 fn untyped(self) -> SyntaxStablePtrId<'db> {
19945 self.0
19946 }
19947 fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19948 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19949 }
19950}
19951impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19952 fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19953 ptr.untyped()
19954 }
19955}
19956#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19957pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19958impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19959 const OPTIONAL_KIND: Option<SyntaxKind> =
19960 Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19961 type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19962 type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19963 fn missing(db: &'db dyn Database) -> Self::Green {
19964 OptionAssociatedItemConstraintsEmptyGreen(
19965 GreenNode {
19966 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19967 details: GreenNodeDetails::Node {
19968 children: [].into(),
19969 width: TextWidth::default(),
19970 },
19971 }
19972 .intern(db),
19973 )
19974 }
19975 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19976 let kind = node.kind(db);
19977 assert_eq!(
19978 kind,
19979 SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19980 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19981 kind,
19982 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19983 );
19984 Self { node }
19985 }
19986 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19987 let kind = node.kind(db);
19988 if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19989 Some(Self::from_syntax_node(db, node))
19990 } else {
19991 None
19992 }
19993 }
19994 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19995 self.node
19996 }
19997 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19998 OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19999 }
20000}
20001#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20002pub enum OptionWrappedGenericParamList<'db> {
20003 Empty(OptionWrappedGenericParamListEmpty<'db>),
20004 WrappedGenericParamList(WrappedGenericParamList<'db>),
20005}
20006#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20007pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20008impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
20009 type SyntaxNode = OptionWrappedGenericParamList<'db>;
20010 fn untyped(self) -> SyntaxStablePtrId<'db> {
20011 self.0
20012 }
20013 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20014 OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20015 }
20016}
20017impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20018 fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
20019 ptr.untyped()
20020 }
20021}
20022impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
20023 for OptionWrappedGenericParamListPtr<'db>
20024{
20025 fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20026 Self(value.0)
20027 }
20028}
20029impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
20030 fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
20031 Self(value.0)
20032 }
20033}
20034impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
20035 for OptionWrappedGenericParamListGreen<'db>
20036{
20037 fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
20038 Self(value.0)
20039 }
20040}
20041impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
20042 fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
20043 Self(value.0)
20044 }
20045}
20046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20047pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20048impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
20049 const OPTIONAL_KIND: Option<SyntaxKind> = None;
20050 type StablePtr = OptionWrappedGenericParamListPtr<'db>;
20051 type Green = OptionWrappedGenericParamListGreen<'db>;
20052 fn missing(db: &'db dyn Database) -> Self::Green {
20053 panic!("No missing variant.");
20054 }
20055 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20056 let kind = node.kind(db);
20057 match kind {
20058 SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
20059 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20060 ),
20061 SyntaxKind::WrappedGenericParamList => {
20062 OptionWrappedGenericParamList::WrappedGenericParamList(
20063 WrappedGenericParamList::from_syntax_node(db, node),
20064 )
20065 }
20066 _ => panic!(
20067 "Unexpected syntax kind {:?} when constructing {}.",
20068 kind, "OptionWrappedGenericParamList"
20069 ),
20070 }
20071 }
20072 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20073 let kind = node.kind(db);
20074 match kind {
20075 SyntaxKind::OptionWrappedGenericParamListEmpty => {
20076 Some(OptionWrappedGenericParamList::Empty(
20077 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20078 ))
20079 }
20080 SyntaxKind::WrappedGenericParamList => {
20081 Some(OptionWrappedGenericParamList::WrappedGenericParamList(
20082 WrappedGenericParamList::from_syntax_node(db, node),
20083 ))
20084 }
20085 _ => None,
20086 }
20087 }
20088 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20089 match self {
20090 OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
20091 OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
20092 }
20093 }
20094 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20095 OptionWrappedGenericParamListPtr(self.as_syntax_node().long(db).stable_ptr)
20096 }
20097}
20098impl<'db> OptionWrappedGenericParamList<'db> {
20099 pub fn is_variant(kind: SyntaxKind) -> bool {
20101 matches!(
20102 kind,
20103 SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
20104 )
20105 }
20106}
20107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20108pub struct OptionWrappedGenericParamListEmpty<'db> {
20109 node: SyntaxNode<'db>,
20110}
20111impl<'db> OptionWrappedGenericParamListEmpty<'db> {
20112 pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
20113 let children = [];
20114 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20115 OptionWrappedGenericParamListEmptyGreen(
20116 GreenNode {
20117 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20118 details: GreenNodeDetails::Node { children: children.into(), width },
20119 }
20120 .intern(db),
20121 )
20122 }
20123}
20124impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
20125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20126pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
20127impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
20128impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
20129 type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
20130 fn untyped(self) -> SyntaxStablePtrId<'db> {
20131 self.0
20132 }
20133 fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
20134 OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20135 }
20136}
20137impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
20138 fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20139 ptr.untyped()
20140 }
20141}
20142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20143pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
20144impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
20145 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20146 type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
20147 type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
20148 fn missing(db: &'db dyn Database) -> Self::Green {
20149 OptionWrappedGenericParamListEmptyGreen(
20150 GreenNode {
20151 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20152 details: GreenNodeDetails::Node {
20153 children: [].into(),
20154 width: TextWidth::default(),
20155 },
20156 }
20157 .intern(db),
20158 )
20159 }
20160 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20161 let kind = node.kind(db);
20162 assert_eq!(
20163 kind,
20164 SyntaxKind::OptionWrappedGenericParamListEmpty,
20165 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20166 kind,
20167 SyntaxKind::OptionWrappedGenericParamListEmpty
20168 );
20169 Self { node }
20170 }
20171 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20172 let kind = node.kind(db);
20173 if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20174 Some(Self::from_syntax_node(db, node))
20175 } else {
20176 None
20177 }
20178 }
20179 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20180 self.node
20181 }
20182 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20183 OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
20184 }
20185}
20186#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20187pub struct WrappedGenericParamList<'db> {
20188 node: SyntaxNode<'db>,
20189}
20190impl<'db> WrappedGenericParamList<'db> {
20191 pub const INDEX_LANGLE: usize = 0;
20192 pub const INDEX_GENERIC_PARAMS: usize = 1;
20193 pub const INDEX_RANGLE: usize = 2;
20194 pub fn new_green(
20195 db: &'db dyn Database,
20196 langle: TerminalLTGreen<'db>,
20197 generic_params: GenericParamListGreen<'db>,
20198 rangle: TerminalGTGreen<'db>,
20199 ) -> WrappedGenericParamListGreen<'db> {
20200 let children = [langle.0, generic_params.0, rangle.0];
20201 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20202 WrappedGenericParamListGreen(
20203 GreenNode {
20204 kind: SyntaxKind::WrappedGenericParamList,
20205 details: GreenNodeDetails::Node { children: children.into(), width },
20206 }
20207 .intern(db),
20208 )
20209 }
20210}
20211impl<'db> WrappedGenericParamList<'db> {
20212 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
20213 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
20214 }
20215 pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20216 GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
20217 }
20218 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
20219 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
20220 }
20221}
20222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20223pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20224impl<'db> WrappedGenericParamListPtr<'db> {}
20225impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
20226 type SyntaxNode = WrappedGenericParamList<'db>;
20227 fn untyped(self) -> SyntaxStablePtrId<'db> {
20228 self.0
20229 }
20230 fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
20231 WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20232 }
20233}
20234impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20235 fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
20236 ptr.untyped()
20237 }
20238}
20239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20240pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20241impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
20242 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20243 type StablePtr = WrappedGenericParamListPtr<'db>;
20244 type Green = WrappedGenericParamListGreen<'db>;
20245 fn missing(db: &'db dyn Database) -> Self::Green {
20246 WrappedGenericParamListGreen(
20247 GreenNode {
20248 kind: SyntaxKind::WrappedGenericParamList,
20249 details: GreenNodeDetails::Node {
20250 children: [
20251 TerminalLT::missing(db).0,
20252 GenericParamList::missing(db).0,
20253 TerminalGT::missing(db).0,
20254 ]
20255 .into(),
20256 width: TextWidth::default(),
20257 },
20258 }
20259 .intern(db),
20260 )
20261 }
20262 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20263 let kind = node.kind(db);
20264 assert_eq!(
20265 kind,
20266 SyntaxKind::WrappedGenericParamList,
20267 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20268 kind,
20269 SyntaxKind::WrappedGenericParamList
20270 );
20271 Self { node }
20272 }
20273 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20274 let kind = node.kind(db);
20275 if kind == SyntaxKind::WrappedGenericParamList {
20276 Some(Self::from_syntax_node(db, node))
20277 } else {
20278 None
20279 }
20280 }
20281 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20282 self.node
20283 }
20284 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20285 WrappedGenericParamListPtr(self.node.stable_ptr(db))
20286 }
20287}
20288#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20289pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
20290impl<'db> Deref for GenericParamList<'db> {
20291 type Target = ElementList<'db, GenericParam<'db>, 2>;
20292 fn deref(&self) -> &Self::Target {
20293 &self.0
20294 }
20295}
20296impl<'db> GenericParamList<'db> {
20297 pub fn new_green(
20298 db: &'db dyn Database,
20299 children: &[GenericParamListElementOrSeparatorGreen<'db>],
20300 ) -> GenericParamListGreen<'db> {
20301 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
20302 GenericParamListGreen(
20303 GreenNode {
20304 kind: SyntaxKind::GenericParamList,
20305 details: GreenNodeDetails::Node {
20306 children: children.iter().map(|x| x.id()).collect(),
20307 width,
20308 },
20309 }
20310 .intern(db),
20311 )
20312 }
20313}
20314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20315pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20316impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
20317 type SyntaxNode = GenericParamList<'db>;
20318 fn untyped(self) -> SyntaxStablePtrId<'db> {
20319 self.0
20320 }
20321 fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20322 GenericParamList::from_syntax_node(db, self.0.lookup(db))
20323 }
20324}
20325impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20326 fn from(ptr: GenericParamListPtr<'db>) -> Self {
20327 ptr.untyped()
20328 }
20329}
20330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20331pub enum GenericParamListElementOrSeparatorGreen<'db> {
20332 Separator(TerminalCommaGreen<'db>),
20333 Element(GenericParamGreen<'db>),
20334}
20335impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20336 fn from(value: TerminalCommaGreen<'db>) -> Self {
20337 GenericParamListElementOrSeparatorGreen::Separator(value)
20338 }
20339}
20340impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20341 fn from(value: GenericParamGreen<'db>) -> Self {
20342 GenericParamListElementOrSeparatorGreen::Element(value)
20343 }
20344}
20345impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
20346 fn id(&self) -> GreenId<'db> {
20347 match self {
20348 GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20349 GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20350 }
20351 }
20352}
20353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20354pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
20355impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
20356 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20357 type StablePtr = GenericParamListPtr<'db>;
20358 type Green = GenericParamListGreen<'db>;
20359 fn missing(db: &'db dyn Database) -> Self::Green {
20360 GenericParamListGreen(
20361 GreenNode {
20362 kind: SyntaxKind::GenericParamList,
20363 details: GreenNodeDetails::Node {
20364 children: [].into(),
20365 width: TextWidth::default(),
20366 },
20367 }
20368 .intern(db),
20369 )
20370 }
20371 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20372 Self(ElementList::new(node))
20373 }
20374 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20375 if node.kind(db) == SyntaxKind::GenericParamList {
20376 Some(Self(ElementList::new(node)))
20377 } else {
20378 None
20379 }
20380 }
20381 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20382 self.node
20383 }
20384 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20385 GenericParamListPtr(self.node.stable_ptr(db))
20386 }
20387}
20388#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20389pub enum GenericParam<'db> {
20390 Type(GenericParamType<'db>),
20391 Const(GenericParamConst<'db>),
20392 ImplNamed(GenericParamImplNamed<'db>),
20393 ImplAnonymous(GenericParamImplAnonymous<'db>),
20394 NegativeImpl(GenericParamNegativeImpl<'db>),
20395}
20396#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20397pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20398impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20399 type SyntaxNode = GenericParam<'db>;
20400 fn untyped(self) -> SyntaxStablePtrId<'db> {
20401 self.0
20402 }
20403 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20404 GenericParam::from_syntax_node(db, self.0.lookup(db))
20405 }
20406}
20407impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20408 fn from(ptr: GenericParamPtr<'db>) -> Self {
20409 ptr.untyped()
20410 }
20411}
20412impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20413 fn from(value: GenericParamTypePtr<'db>) -> Self {
20414 Self(value.0)
20415 }
20416}
20417impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20418 fn from(value: GenericParamConstPtr<'db>) -> Self {
20419 Self(value.0)
20420 }
20421}
20422impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20423 fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20424 Self(value.0)
20425 }
20426}
20427impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20428 fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20429 Self(value.0)
20430 }
20431}
20432impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20433 fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20434 Self(value.0)
20435 }
20436}
20437impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20438 fn from(value: GenericParamTypeGreen<'db>) -> Self {
20439 Self(value.0)
20440 }
20441}
20442impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20443 fn from(value: GenericParamConstGreen<'db>) -> Self {
20444 Self(value.0)
20445 }
20446}
20447impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20448 fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20449 Self(value.0)
20450 }
20451}
20452impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20453 fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20454 Self(value.0)
20455 }
20456}
20457impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20458 fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20459 Self(value.0)
20460 }
20461}
20462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20463pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20464impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20465 const OPTIONAL_KIND: Option<SyntaxKind> = None;
20466 type StablePtr = GenericParamPtr<'db>;
20467 type Green = GenericParamGreen<'db>;
20468 fn missing(db: &'db dyn Database) -> Self::Green {
20469 panic!("No missing variant.");
20470 }
20471 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20472 let kind = node.kind(db);
20473 match kind {
20474 SyntaxKind::GenericParamType => {
20475 GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20476 }
20477 SyntaxKind::GenericParamConst => {
20478 GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20479 }
20480 SyntaxKind::GenericParamImplNamed => {
20481 GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20482 }
20483 SyntaxKind::GenericParamImplAnonymous => {
20484 GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20485 }
20486 SyntaxKind::GenericParamNegativeImpl => {
20487 GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20488 }
20489 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20490 }
20491 }
20492 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20493 let kind = node.kind(db);
20494 match kind {
20495 SyntaxKind::GenericParamType => {
20496 Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20497 }
20498 SyntaxKind::GenericParamConst => {
20499 Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20500 }
20501 SyntaxKind::GenericParamImplNamed => {
20502 Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20503 }
20504 SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20505 GenericParamImplAnonymous::from_syntax_node(db, node),
20506 )),
20507 SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20508 GenericParamNegativeImpl::from_syntax_node(db, node),
20509 )),
20510 _ => None,
20511 }
20512 }
20513 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20514 match self {
20515 GenericParam::Type(x) => x.as_syntax_node(),
20516 GenericParam::Const(x) => x.as_syntax_node(),
20517 GenericParam::ImplNamed(x) => x.as_syntax_node(),
20518 GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20519 GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20520 }
20521 }
20522 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20523 GenericParamPtr(self.as_syntax_node().long(db).stable_ptr)
20524 }
20525}
20526impl<'db> GenericParam<'db> {
20527 pub fn is_variant(kind: SyntaxKind) -> bool {
20529 matches!(
20530 kind,
20531 SyntaxKind::GenericParamType
20532 | SyntaxKind::GenericParamConst
20533 | SyntaxKind::GenericParamImplNamed
20534 | SyntaxKind::GenericParamImplAnonymous
20535 | SyntaxKind::GenericParamNegativeImpl
20536 )
20537 }
20538}
20539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20540pub struct GenericParamType<'db> {
20541 node: SyntaxNode<'db>,
20542}
20543impl<'db> GenericParamType<'db> {
20544 pub const INDEX_NAME: usize = 0;
20545 pub fn new_green(
20546 db: &'db dyn Database,
20547 name: TerminalIdentifierGreen<'db>,
20548 ) -> GenericParamTypeGreen<'db> {
20549 let children = [name.0];
20550 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20551 GenericParamTypeGreen(
20552 GreenNode {
20553 kind: SyntaxKind::GenericParamType,
20554 details: GreenNodeDetails::Node { children: children.into(), width },
20555 }
20556 .intern(db),
20557 )
20558 }
20559}
20560impl<'db> GenericParamType<'db> {
20561 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20562 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20563 }
20564}
20565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20566pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20567impl<'db> GenericParamTypePtr<'db> {
20568 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20569 let ptr = self.0.long(db);
20570 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20571 TerminalIdentifierGreen(key_fields[0])
20572 } else {
20573 panic!("Unexpected key field query on root.");
20574 }
20575 }
20576}
20577impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20578 type SyntaxNode = GenericParamType<'db>;
20579 fn untyped(self) -> SyntaxStablePtrId<'db> {
20580 self.0
20581 }
20582 fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20583 GenericParamType::from_syntax_node(db, self.0.lookup(db))
20584 }
20585}
20586impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20587 fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20588 ptr.untyped()
20589 }
20590}
20591#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20592pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20593impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20594 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20595 type StablePtr = GenericParamTypePtr<'db>;
20596 type Green = GenericParamTypeGreen<'db>;
20597 fn missing(db: &'db dyn Database) -> Self::Green {
20598 GenericParamTypeGreen(
20599 GreenNode {
20600 kind: SyntaxKind::GenericParamType,
20601 details: GreenNodeDetails::Node {
20602 children: [TerminalIdentifier::missing(db).0].into(),
20603 width: TextWidth::default(),
20604 },
20605 }
20606 .intern(db),
20607 )
20608 }
20609 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20610 let kind = node.kind(db);
20611 assert_eq!(
20612 kind,
20613 SyntaxKind::GenericParamType,
20614 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20615 kind,
20616 SyntaxKind::GenericParamType
20617 );
20618 Self { node }
20619 }
20620 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20621 let kind = node.kind(db);
20622 if kind == SyntaxKind::GenericParamType {
20623 Some(Self::from_syntax_node(db, node))
20624 } else {
20625 None
20626 }
20627 }
20628 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20629 self.node
20630 }
20631 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20632 GenericParamTypePtr(self.node.stable_ptr(db))
20633 }
20634}
20635#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20636pub struct GenericParamConst<'db> {
20637 node: SyntaxNode<'db>,
20638}
20639impl<'db> GenericParamConst<'db> {
20640 pub const INDEX_CONST_KW: usize = 0;
20641 pub const INDEX_NAME: usize = 1;
20642 pub const INDEX_COLON: usize = 2;
20643 pub const INDEX_TY: usize = 3;
20644 pub fn new_green(
20645 db: &'db dyn Database,
20646 const_kw: TerminalConstGreen<'db>,
20647 name: TerminalIdentifierGreen<'db>,
20648 colon: TerminalColonGreen<'db>,
20649 ty: ExprGreen<'db>,
20650 ) -> GenericParamConstGreen<'db> {
20651 let children = [const_kw.0, name.0, colon.0, ty.0];
20652 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20653 GenericParamConstGreen(
20654 GreenNode {
20655 kind: SyntaxKind::GenericParamConst,
20656 details: GreenNodeDetails::Node { children: children.into(), width },
20657 }
20658 .intern(db),
20659 )
20660 }
20661}
20662impl<'db> GenericParamConst<'db> {
20663 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20664 TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20665 }
20666 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20667 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20668 }
20669 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20670 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20671 }
20672 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20673 Expr::from_syntax_node(db, self.node.get_children(db)[3])
20674 }
20675}
20676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20677pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20678impl<'db> GenericParamConstPtr<'db> {
20679 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20680 let ptr = self.0.long(db);
20681 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20682 TerminalIdentifierGreen(key_fields[0])
20683 } else {
20684 panic!("Unexpected key field query on root.");
20685 }
20686 }
20687}
20688impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20689 type SyntaxNode = GenericParamConst<'db>;
20690 fn untyped(self) -> SyntaxStablePtrId<'db> {
20691 self.0
20692 }
20693 fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20694 GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20695 }
20696}
20697impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20698 fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20699 ptr.untyped()
20700 }
20701}
20702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20703pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20704impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20705 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20706 type StablePtr = GenericParamConstPtr<'db>;
20707 type Green = GenericParamConstGreen<'db>;
20708 fn missing(db: &'db dyn Database) -> Self::Green {
20709 GenericParamConstGreen(
20710 GreenNode {
20711 kind: SyntaxKind::GenericParamConst,
20712 details: GreenNodeDetails::Node {
20713 children: [
20714 TerminalConst::missing(db).0,
20715 TerminalIdentifier::missing(db).0,
20716 TerminalColon::missing(db).0,
20717 Expr::missing(db).0,
20718 ]
20719 .into(),
20720 width: TextWidth::default(),
20721 },
20722 }
20723 .intern(db),
20724 )
20725 }
20726 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20727 let kind = node.kind(db);
20728 assert_eq!(
20729 kind,
20730 SyntaxKind::GenericParamConst,
20731 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20732 kind,
20733 SyntaxKind::GenericParamConst
20734 );
20735 Self { node }
20736 }
20737 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20738 let kind = node.kind(db);
20739 if kind == SyntaxKind::GenericParamConst {
20740 Some(Self::from_syntax_node(db, node))
20741 } else {
20742 None
20743 }
20744 }
20745 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20746 self.node
20747 }
20748 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20749 GenericParamConstPtr(self.node.stable_ptr(db))
20750 }
20751}
20752#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20753pub struct GenericParamImplNamed<'db> {
20754 node: SyntaxNode<'db>,
20755}
20756impl<'db> GenericParamImplNamed<'db> {
20757 pub const INDEX_IMPL_KW: usize = 0;
20758 pub const INDEX_NAME: usize = 1;
20759 pub const INDEX_COLON: usize = 2;
20760 pub const INDEX_TRAIT_PATH: usize = 3;
20761 pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20762 pub fn new_green(
20763 db: &'db dyn Database,
20764 impl_kw: TerminalImplGreen<'db>,
20765 name: TerminalIdentifierGreen<'db>,
20766 colon: TerminalColonGreen<'db>,
20767 trait_path: ExprPathGreen<'db>,
20768 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20769 ) -> GenericParamImplNamedGreen<'db> {
20770 let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20771 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20772 GenericParamImplNamedGreen(
20773 GreenNode {
20774 kind: SyntaxKind::GenericParamImplNamed,
20775 details: GreenNodeDetails::Node { children: children.into(), width },
20776 }
20777 .intern(db),
20778 )
20779 }
20780}
20781impl<'db> GenericParamImplNamed<'db> {
20782 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20783 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20784 }
20785 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20786 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20787 }
20788 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20789 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20790 }
20791 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20792 ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20793 }
20794 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20795 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20796 }
20797}
20798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20799pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20800impl<'db> GenericParamImplNamedPtr<'db> {
20801 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20802 let ptr = self.0.long(db);
20803 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20804 TerminalIdentifierGreen(key_fields[0])
20805 } else {
20806 panic!("Unexpected key field query on root.");
20807 }
20808 }
20809}
20810impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20811 type SyntaxNode = GenericParamImplNamed<'db>;
20812 fn untyped(self) -> SyntaxStablePtrId<'db> {
20813 self.0
20814 }
20815 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20816 GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20817 }
20818}
20819impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20820 fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20821 ptr.untyped()
20822 }
20823}
20824#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20825pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20826impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20827 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20828 type StablePtr = GenericParamImplNamedPtr<'db>;
20829 type Green = GenericParamImplNamedGreen<'db>;
20830 fn missing(db: &'db dyn Database) -> Self::Green {
20831 GenericParamImplNamedGreen(
20832 GreenNode {
20833 kind: SyntaxKind::GenericParamImplNamed,
20834 details: GreenNodeDetails::Node {
20835 children: [
20836 TerminalImpl::missing(db).0,
20837 TerminalIdentifier::missing(db).0,
20838 TerminalColon::missing(db).0,
20839 ExprPath::missing(db).0,
20840 OptionAssociatedItemConstraints::missing(db).0,
20841 ]
20842 .into(),
20843 width: TextWidth::default(),
20844 },
20845 }
20846 .intern(db),
20847 )
20848 }
20849 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20850 let kind = node.kind(db);
20851 assert_eq!(
20852 kind,
20853 SyntaxKind::GenericParamImplNamed,
20854 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20855 kind,
20856 SyntaxKind::GenericParamImplNamed
20857 );
20858 Self { node }
20859 }
20860 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20861 let kind = node.kind(db);
20862 if kind == SyntaxKind::GenericParamImplNamed {
20863 Some(Self::from_syntax_node(db, node))
20864 } else {
20865 None
20866 }
20867 }
20868 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20869 self.node
20870 }
20871 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20872 GenericParamImplNamedPtr(self.node.stable_ptr(db))
20873 }
20874}
20875#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20876pub struct GenericParamImplAnonymous<'db> {
20877 node: SyntaxNode<'db>,
20878}
20879impl<'db> GenericParamImplAnonymous<'db> {
20880 pub const INDEX_PLUS: usize = 0;
20881 pub const INDEX_TRAIT_PATH: usize = 1;
20882 pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20883 pub fn new_green(
20884 db: &'db dyn Database,
20885 plus: TerminalPlusGreen<'db>,
20886 trait_path: ExprPathGreen<'db>,
20887 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20888 ) -> GenericParamImplAnonymousGreen<'db> {
20889 let children = [plus.0, trait_path.0, type_constrains.0];
20890 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20891 GenericParamImplAnonymousGreen(
20892 GreenNode {
20893 kind: SyntaxKind::GenericParamImplAnonymous,
20894 details: GreenNodeDetails::Node { children: children.into(), width },
20895 }
20896 .intern(db),
20897 )
20898 }
20899}
20900impl<'db> GenericParamImplAnonymous<'db> {
20901 pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20902 TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20903 }
20904 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20905 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20906 }
20907 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20908 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20909 }
20910}
20911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20912pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20913impl<'db> GenericParamImplAnonymousPtr<'db> {}
20914impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20915 type SyntaxNode = GenericParamImplAnonymous<'db>;
20916 fn untyped(self) -> SyntaxStablePtrId<'db> {
20917 self.0
20918 }
20919 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20920 GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20921 }
20922}
20923impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20924 fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20925 ptr.untyped()
20926 }
20927}
20928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20929pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20930impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20931 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20932 type StablePtr = GenericParamImplAnonymousPtr<'db>;
20933 type Green = GenericParamImplAnonymousGreen<'db>;
20934 fn missing(db: &'db dyn Database) -> Self::Green {
20935 GenericParamImplAnonymousGreen(
20936 GreenNode {
20937 kind: SyntaxKind::GenericParamImplAnonymous,
20938 details: GreenNodeDetails::Node {
20939 children: [
20940 TerminalPlus::missing(db).0,
20941 ExprPath::missing(db).0,
20942 OptionAssociatedItemConstraints::missing(db).0,
20943 ]
20944 .into(),
20945 width: TextWidth::default(),
20946 },
20947 }
20948 .intern(db),
20949 )
20950 }
20951 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20952 let kind = node.kind(db);
20953 assert_eq!(
20954 kind,
20955 SyntaxKind::GenericParamImplAnonymous,
20956 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20957 kind,
20958 SyntaxKind::GenericParamImplAnonymous
20959 );
20960 Self { node }
20961 }
20962 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20963 let kind = node.kind(db);
20964 if kind == SyntaxKind::GenericParamImplAnonymous {
20965 Some(Self::from_syntax_node(db, node))
20966 } else {
20967 None
20968 }
20969 }
20970 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20971 self.node
20972 }
20973 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20974 GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20975 }
20976}
20977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20978pub struct GenericParamNegativeImpl<'db> {
20979 node: SyntaxNode<'db>,
20980}
20981impl<'db> GenericParamNegativeImpl<'db> {
20982 pub const INDEX_MINUS: usize = 0;
20983 pub const INDEX_TRAIT_PATH: usize = 1;
20984 pub fn new_green(
20985 db: &'db dyn Database,
20986 minus: TerminalMinusGreen<'db>,
20987 trait_path: ExprPathGreen<'db>,
20988 ) -> GenericParamNegativeImplGreen<'db> {
20989 let children = [minus.0, trait_path.0];
20990 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20991 GenericParamNegativeImplGreen(
20992 GreenNode {
20993 kind: SyntaxKind::GenericParamNegativeImpl,
20994 details: GreenNodeDetails::Node { children: children.into(), width },
20995 }
20996 .intern(db),
20997 )
20998 }
20999}
21000impl<'db> GenericParamNegativeImpl<'db> {
21001 pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
21002 TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
21003 }
21004 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
21005 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
21006 }
21007}
21008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21009pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
21010impl<'db> GenericParamNegativeImplPtr<'db> {}
21011impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
21012 type SyntaxNode = GenericParamNegativeImpl<'db>;
21013 fn untyped(self) -> SyntaxStablePtrId<'db> {
21014 self.0
21015 }
21016 fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
21017 GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
21018 }
21019}
21020impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
21021 fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
21022 ptr.untyped()
21023 }
21024}
21025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21026pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
21027impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
21028 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
21029 type StablePtr = GenericParamNegativeImplPtr<'db>;
21030 type Green = GenericParamNegativeImplGreen<'db>;
21031 fn missing(db: &'db dyn Database) -> Self::Green {
21032 GenericParamNegativeImplGreen(
21033 GreenNode {
21034 kind: SyntaxKind::GenericParamNegativeImpl,
21035 details: GreenNodeDetails::Node {
21036 children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
21037 width: TextWidth::default(),
21038 },
21039 }
21040 .intern(db),
21041 )
21042 }
21043 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21044 let kind = node.kind(db);
21045 assert_eq!(
21046 kind,
21047 SyntaxKind::GenericParamNegativeImpl,
21048 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21049 kind,
21050 SyntaxKind::GenericParamNegativeImpl
21051 );
21052 Self { node }
21053 }
21054 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21055 let kind = node.kind(db);
21056 if kind == SyntaxKind::GenericParamNegativeImpl {
21057 Some(Self::from_syntax_node(db, node))
21058 } else {
21059 None
21060 }
21061 }
21062 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21063 self.node
21064 }
21065 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21066 GenericParamNegativeImplPtr(self.node.stable_ptr(db))
21067 }
21068}
21069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21070pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
21071impl<'db> Deref for TokenList<'db> {
21072 type Target = ElementList<'db, TokenTree<'db>, 1>;
21073 fn deref(&self) -> &Self::Target {
21074 &self.0
21075 }
21076}
21077impl<'db> TokenList<'db> {
21078 pub fn new_green(
21079 db: &'db dyn Database,
21080 children: &[TokenTreeGreen<'db>],
21081 ) -> TokenListGreen<'db> {
21082 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
21083 TokenListGreen(
21084 GreenNode {
21085 kind: SyntaxKind::TokenList,
21086 details: GreenNodeDetails::Node {
21087 children: children.iter().map(|x| x.0).collect(),
21088 width,
21089 },
21090 }
21091 .intern(db),
21092 )
21093 }
21094}
21095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21096pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
21097impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
21098 type SyntaxNode = TokenList<'db>;
21099 fn untyped(self) -> SyntaxStablePtrId<'db> {
21100 self.0
21101 }
21102 fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
21103 TokenList::from_syntax_node(db, self.0.lookup(db))
21104 }
21105}
21106impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
21107 fn from(ptr: TokenListPtr<'db>) -> Self {
21108 ptr.untyped()
21109 }
21110}
21111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21112pub struct TokenListGreen<'db>(pub GreenId<'db>);
21113impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
21114 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
21115 type StablePtr = TokenListPtr<'db>;
21116 type Green = TokenListGreen<'db>;
21117 fn missing(db: &'db dyn Database) -> Self::Green {
21118 TokenListGreen(
21119 GreenNode {
21120 kind: SyntaxKind::TokenList,
21121 details: GreenNodeDetails::Node {
21122 children: [].into(),
21123 width: TextWidth::default(),
21124 },
21125 }
21126 .intern(db),
21127 )
21128 }
21129 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21130 Self(ElementList::new(node))
21131 }
21132 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21133 if node.kind(db) == SyntaxKind::TokenList {
21134 Some(Self(ElementList::new(node)))
21135 } else {
21136 None
21137 }
21138 }
21139 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21140 self.node
21141 }
21142 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21143 TokenListPtr(self.node.stable_ptr(db))
21144 }
21145}
21146#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21147pub struct TokenTreeLeaf<'db> {
21148 node: SyntaxNode<'db>,
21149}
21150impl<'db> TokenTreeLeaf<'db> {
21151 pub const INDEX_LEAF: usize = 0;
21152 pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
21153 let children = [leaf.0];
21154 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21155 TokenTreeLeafGreen(
21156 GreenNode {
21157 kind: SyntaxKind::TokenTreeLeaf,
21158 details: GreenNodeDetails::Node { children: children.into(), width },
21159 }
21160 .intern(db),
21161 )
21162 }
21163}
21164impl<'db> TokenTreeLeaf<'db> {
21165 pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
21166 TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
21167 }
21168}
21169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21170pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
21171impl<'db> TokenTreeLeafPtr<'db> {}
21172impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
21173 type SyntaxNode = TokenTreeLeaf<'db>;
21174 fn untyped(self) -> SyntaxStablePtrId<'db> {
21175 self.0
21176 }
21177 fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
21178 TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
21179 }
21180}
21181impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
21182 fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
21183 ptr.untyped()
21184 }
21185}
21186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21187pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
21188impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
21189 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
21190 type StablePtr = TokenTreeLeafPtr<'db>;
21191 type Green = TokenTreeLeafGreen<'db>;
21192 fn missing(db: &'db dyn Database) -> Self::Green {
21193 TokenTreeLeafGreen(
21194 GreenNode {
21195 kind: SyntaxKind::TokenTreeLeaf,
21196 details: GreenNodeDetails::Node {
21197 children: [TokenNode::missing(db).0].into(),
21198 width: TextWidth::default(),
21199 },
21200 }
21201 .intern(db),
21202 )
21203 }
21204 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21205 let kind = node.kind(db);
21206 assert_eq!(
21207 kind,
21208 SyntaxKind::TokenTreeLeaf,
21209 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21210 kind,
21211 SyntaxKind::TokenTreeLeaf
21212 );
21213 Self { node }
21214 }
21215 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21216 let kind = node.kind(db);
21217 if kind == SyntaxKind::TokenTreeLeaf {
21218 Some(Self::from_syntax_node(db, node))
21219 } else {
21220 None
21221 }
21222 }
21223 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21224 self.node
21225 }
21226 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21227 TokenTreeLeafPtr(self.node.stable_ptr(db))
21228 }
21229}
21230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21231pub struct TokenTreeNode<'db> {
21232 node: SyntaxNode<'db>,
21233}
21234impl<'db> TokenTreeNode<'db> {
21235 pub const INDEX_SUBTREE: usize = 0;
21236 pub fn new_green(
21237 db: &'db dyn Database,
21238 subtree: WrappedTokenTreeGreen<'db>,
21239 ) -> TokenTreeNodeGreen<'db> {
21240 let children = [subtree.0];
21241 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21242 TokenTreeNodeGreen(
21243 GreenNode {
21244 kind: SyntaxKind::TokenTreeNode,
21245 details: GreenNodeDetails::Node { children: children.into(), width },
21246 }
21247 .intern(db),
21248 )
21249 }
21250}
21251impl<'db> TokenTreeNode<'db> {
21252 pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
21253 WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
21254 }
21255}
21256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21257pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
21258impl<'db> TokenTreeNodePtr<'db> {}
21259impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
21260 type SyntaxNode = TokenTreeNode<'db>;
21261 fn untyped(self) -> SyntaxStablePtrId<'db> {
21262 self.0
21263 }
21264 fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21265 TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
21266 }
21267}
21268impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
21269 fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
21270 ptr.untyped()
21271 }
21272}
21273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21274pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
21275impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
21276 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
21277 type StablePtr = TokenTreeNodePtr<'db>;
21278 type Green = TokenTreeNodeGreen<'db>;
21279 fn missing(db: &'db dyn Database) -> Self::Green {
21280 TokenTreeNodeGreen(
21281 GreenNode {
21282 kind: SyntaxKind::TokenTreeNode,
21283 details: GreenNodeDetails::Node {
21284 children: [WrappedTokenTree::missing(db).0].into(),
21285 width: TextWidth::default(),
21286 },
21287 }
21288 .intern(db),
21289 )
21290 }
21291 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21292 let kind = node.kind(db);
21293 assert_eq!(
21294 kind,
21295 SyntaxKind::TokenTreeNode,
21296 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21297 kind,
21298 SyntaxKind::TokenTreeNode
21299 );
21300 Self { node }
21301 }
21302 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21303 let kind = node.kind(db);
21304 if kind == SyntaxKind::TokenTreeNode {
21305 Some(Self::from_syntax_node(db, node))
21306 } else {
21307 None
21308 }
21309 }
21310 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21311 self.node
21312 }
21313 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21314 TokenTreeNodePtr(self.node.stable_ptr(db))
21315 }
21316}
21317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21318pub struct TokenTreeRepetition<'db> {
21319 node: SyntaxNode<'db>,
21320}
21321impl<'db> TokenTreeRepetition<'db> {
21322 pub const INDEX_DOLLAR: usize = 0;
21323 pub const INDEX_LPAREN: usize = 1;
21324 pub const INDEX_ELEMENTS: usize = 2;
21325 pub const INDEX_RPAREN: usize = 3;
21326 pub const INDEX_SEPARATOR: usize = 4;
21327 pub const INDEX_OPERATOR: usize = 5;
21328 pub fn new_green(
21329 db: &'db dyn Database,
21330 dollar: TerminalDollarGreen<'db>,
21331 lparen: TerminalLParenGreen<'db>,
21332 elements: TokenListGreen<'db>,
21333 rparen: TerminalRParenGreen<'db>,
21334 separator: OptionTerminalCommaGreen<'db>,
21335 operator: MacroRepetitionOperatorGreen<'db>,
21336 ) -> TokenTreeRepetitionGreen<'db> {
21337 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
21338 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21339 TokenTreeRepetitionGreen(
21340 GreenNode {
21341 kind: SyntaxKind::TokenTreeRepetition,
21342 details: GreenNodeDetails::Node { children: children.into(), width },
21343 }
21344 .intern(db),
21345 )
21346 }
21347}
21348impl<'db> TokenTreeRepetition<'db> {
21349 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21350 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21351 }
21352 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21353 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
21354 }
21355 pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
21356 TokenList::from_syntax_node(db, self.node.get_children(db)[2])
21357 }
21358 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21359 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
21360 }
21361 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
21362 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
21363 }
21364 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
21365 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
21366 }
21367}
21368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21369pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
21370impl<'db> TokenTreeRepetitionPtr<'db> {}
21371impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
21372 type SyntaxNode = TokenTreeRepetition<'db>;
21373 fn untyped(self) -> SyntaxStablePtrId<'db> {
21374 self.0
21375 }
21376 fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
21377 TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
21378 }
21379}
21380impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
21381 fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
21382 ptr.untyped()
21383 }
21384}
21385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21386pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
21387impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21388 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21389 type StablePtr = TokenTreeRepetitionPtr<'db>;
21390 type Green = TokenTreeRepetitionGreen<'db>;
21391 fn missing(db: &'db dyn Database) -> Self::Green {
21392 TokenTreeRepetitionGreen(
21393 GreenNode {
21394 kind: SyntaxKind::TokenTreeRepetition,
21395 details: GreenNodeDetails::Node {
21396 children: [
21397 TerminalDollar::missing(db).0,
21398 TerminalLParen::missing(db).0,
21399 TokenList::missing(db).0,
21400 TerminalRParen::missing(db).0,
21401 OptionTerminalComma::missing(db).0,
21402 MacroRepetitionOperator::missing(db).0,
21403 ]
21404 .into(),
21405 width: TextWidth::default(),
21406 },
21407 }
21408 .intern(db),
21409 )
21410 }
21411 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21412 let kind = node.kind(db);
21413 assert_eq!(
21414 kind,
21415 SyntaxKind::TokenTreeRepetition,
21416 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21417 kind,
21418 SyntaxKind::TokenTreeRepetition
21419 );
21420 Self { node }
21421 }
21422 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21423 let kind = node.kind(db);
21424 if kind == SyntaxKind::TokenTreeRepetition {
21425 Some(Self::from_syntax_node(db, node))
21426 } else {
21427 None
21428 }
21429 }
21430 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21431 self.node
21432 }
21433 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21434 TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21435 }
21436}
21437#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21438pub struct TokenTreeParam<'db> {
21439 node: SyntaxNode<'db>,
21440}
21441impl<'db> TokenTreeParam<'db> {
21442 pub const INDEX_DOLLAR: usize = 0;
21443 pub const INDEX_NAME: usize = 1;
21444 pub fn new_green(
21445 db: &'db dyn Database,
21446 dollar: TerminalDollarGreen<'db>,
21447 name: TerminalIdentifierGreen<'db>,
21448 ) -> TokenTreeParamGreen<'db> {
21449 let children = [dollar.0, name.0];
21450 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21451 TokenTreeParamGreen(
21452 GreenNode {
21453 kind: SyntaxKind::TokenTreeParam,
21454 details: GreenNodeDetails::Node { children: children.into(), width },
21455 }
21456 .intern(db),
21457 )
21458 }
21459}
21460impl<'db> TokenTreeParam<'db> {
21461 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21462 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21463 }
21464 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21465 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21466 }
21467}
21468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21469pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21470impl<'db> TokenTreeParamPtr<'db> {}
21471impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21472 type SyntaxNode = TokenTreeParam<'db>;
21473 fn untyped(self) -> SyntaxStablePtrId<'db> {
21474 self.0
21475 }
21476 fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21477 TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21478 }
21479}
21480impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21481 fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21482 ptr.untyped()
21483 }
21484}
21485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21486pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21487impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21488 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21489 type StablePtr = TokenTreeParamPtr<'db>;
21490 type Green = TokenTreeParamGreen<'db>;
21491 fn missing(db: &'db dyn Database) -> Self::Green {
21492 TokenTreeParamGreen(
21493 GreenNode {
21494 kind: SyntaxKind::TokenTreeParam,
21495 details: GreenNodeDetails::Node {
21496 children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21497 .into(),
21498 width: TextWidth::default(),
21499 },
21500 }
21501 .intern(db),
21502 )
21503 }
21504 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21505 let kind = node.kind(db);
21506 assert_eq!(
21507 kind,
21508 SyntaxKind::TokenTreeParam,
21509 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21510 kind,
21511 SyntaxKind::TokenTreeParam
21512 );
21513 Self { node }
21514 }
21515 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21516 let kind = node.kind(db);
21517 if kind == SyntaxKind::TokenTreeParam {
21518 Some(Self::from_syntax_node(db, node))
21519 } else {
21520 None
21521 }
21522 }
21523 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21524 self.node
21525 }
21526 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21527 TokenTreeParamPtr(self.node.stable_ptr(db))
21528 }
21529}
21530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21531pub enum TokenTree<'db> {
21532 Token(TokenTreeLeaf<'db>),
21533 Subtree(TokenTreeNode<'db>),
21534 Repetition(TokenTreeRepetition<'db>),
21535 Param(TokenTreeParam<'db>),
21536 Missing(TokenTreeMissing<'db>),
21537}
21538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21539pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21540impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21541 type SyntaxNode = TokenTree<'db>;
21542 fn untyped(self) -> SyntaxStablePtrId<'db> {
21543 self.0
21544 }
21545 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21546 TokenTree::from_syntax_node(db, self.0.lookup(db))
21547 }
21548}
21549impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21550 fn from(ptr: TokenTreePtr<'db>) -> Self {
21551 ptr.untyped()
21552 }
21553}
21554impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21555 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21556 Self(value.0)
21557 }
21558}
21559impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21560 fn from(value: TokenTreeNodePtr<'db>) -> Self {
21561 Self(value.0)
21562 }
21563}
21564impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21565 fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21566 Self(value.0)
21567 }
21568}
21569impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21570 fn from(value: TokenTreeParamPtr<'db>) -> Self {
21571 Self(value.0)
21572 }
21573}
21574impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21575 fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21576 Self(value.0)
21577 }
21578}
21579impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21580 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21581 Self(value.0)
21582 }
21583}
21584impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21585 fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21586 Self(value.0)
21587 }
21588}
21589impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21590 fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21591 Self(value.0)
21592 }
21593}
21594impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21595 fn from(value: TokenTreeParamGreen<'db>) -> Self {
21596 Self(value.0)
21597 }
21598}
21599impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21600 fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21601 Self(value.0)
21602 }
21603}
21604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21605pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21606impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21607 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21608 type StablePtr = TokenTreePtr<'db>;
21609 type Green = TokenTreeGreen<'db>;
21610 fn missing(db: &'db dyn Database) -> Self::Green {
21611 TokenTreeGreen(TokenTreeMissing::missing(db).0)
21612 }
21613 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21614 let kind = node.kind(db);
21615 match kind {
21616 SyntaxKind::TokenTreeLeaf => {
21617 TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21618 }
21619 SyntaxKind::TokenTreeNode => {
21620 TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21621 }
21622 SyntaxKind::TokenTreeRepetition => {
21623 TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21624 }
21625 SyntaxKind::TokenTreeParam => {
21626 TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21627 }
21628 SyntaxKind::TokenTreeMissing => {
21629 TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21630 }
21631 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21632 }
21633 }
21634 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21635 let kind = node.kind(db);
21636 match kind {
21637 SyntaxKind::TokenTreeLeaf => {
21638 Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21639 }
21640 SyntaxKind::TokenTreeNode => {
21641 Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21642 }
21643 SyntaxKind::TokenTreeRepetition => {
21644 Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21645 }
21646 SyntaxKind::TokenTreeParam => {
21647 Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21648 }
21649 SyntaxKind::TokenTreeMissing => {
21650 Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21651 }
21652 _ => None,
21653 }
21654 }
21655 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21656 match self {
21657 TokenTree::Token(x) => x.as_syntax_node(),
21658 TokenTree::Subtree(x) => x.as_syntax_node(),
21659 TokenTree::Repetition(x) => x.as_syntax_node(),
21660 TokenTree::Param(x) => x.as_syntax_node(),
21661 TokenTree::Missing(x) => x.as_syntax_node(),
21662 }
21663 }
21664 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21665 TokenTreePtr(self.as_syntax_node().long(db).stable_ptr)
21666 }
21667}
21668impl<'db> TokenTree<'db> {
21669 pub fn is_variant(kind: SyntaxKind) -> bool {
21671 matches!(
21672 kind,
21673 SyntaxKind::TokenTreeLeaf
21674 | SyntaxKind::TokenTreeNode
21675 | SyntaxKind::TokenTreeRepetition
21676 | SyntaxKind::TokenTreeParam
21677 | SyntaxKind::TokenTreeMissing
21678 )
21679 }
21680}
21681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21682pub struct TokenTreeMissing<'db> {
21683 node: SyntaxNode<'db>,
21684}
21685impl<'db> TokenTreeMissing<'db> {
21686 pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21687 let children = [];
21688 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21689 TokenTreeMissingGreen(
21690 GreenNode {
21691 kind: SyntaxKind::TokenTreeMissing,
21692 details: GreenNodeDetails::Node { children: children.into(), width },
21693 }
21694 .intern(db),
21695 )
21696 }
21697}
21698impl<'db> TokenTreeMissing<'db> {}
21699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21700pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21701impl<'db> TokenTreeMissingPtr<'db> {}
21702impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21703 type SyntaxNode = TokenTreeMissing<'db>;
21704 fn untyped(self) -> SyntaxStablePtrId<'db> {
21705 self.0
21706 }
21707 fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21708 TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21709 }
21710}
21711impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21712 fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21713 ptr.untyped()
21714 }
21715}
21716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21717pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21718impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21719 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21720 type StablePtr = TokenTreeMissingPtr<'db>;
21721 type Green = TokenTreeMissingGreen<'db>;
21722 fn missing(db: &'db dyn Database) -> Self::Green {
21723 TokenTreeMissingGreen(
21724 GreenNode {
21725 kind: SyntaxKind::TokenTreeMissing,
21726 details: GreenNodeDetails::Node {
21727 children: [].into(),
21728 width: TextWidth::default(),
21729 },
21730 }
21731 .intern(db),
21732 )
21733 }
21734 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21735 let kind = node.kind(db);
21736 assert_eq!(
21737 kind,
21738 SyntaxKind::TokenTreeMissing,
21739 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21740 kind,
21741 SyntaxKind::TokenTreeMissing
21742 );
21743 Self { node }
21744 }
21745 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21746 let kind = node.kind(db);
21747 if kind == SyntaxKind::TokenTreeMissing {
21748 Some(Self::from_syntax_node(db, node))
21749 } else {
21750 None
21751 }
21752 }
21753 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21754 self.node
21755 }
21756 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21757 TokenTreeMissingPtr(self.node.stable_ptr(db))
21758 }
21759}
21760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21761pub enum WrappedTokenTree<'db> {
21762 Parenthesized(ParenthesizedTokenTree<'db>),
21763 Braced(BracedTokenTree<'db>),
21764 Bracketed(BracketedTokenTree<'db>),
21765 Missing(WrappedTokenTreeMissing<'db>),
21766}
21767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21768pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21769impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21770 type SyntaxNode = WrappedTokenTree<'db>;
21771 fn untyped(self) -> SyntaxStablePtrId<'db> {
21772 self.0
21773 }
21774 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21775 WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21776 }
21777}
21778impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21779 fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21780 ptr.untyped()
21781 }
21782}
21783impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21784 fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21785 Self(value.0)
21786 }
21787}
21788impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21789 fn from(value: BracedTokenTreePtr<'db>) -> Self {
21790 Self(value.0)
21791 }
21792}
21793impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21794 fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21795 Self(value.0)
21796 }
21797}
21798impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21799 fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21800 Self(value.0)
21801 }
21802}
21803impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21804 fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21805 Self(value.0)
21806 }
21807}
21808impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21809 fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21810 Self(value.0)
21811 }
21812}
21813impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21814 fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21815 Self(value.0)
21816 }
21817}
21818impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21819 fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21820 Self(value.0)
21821 }
21822}
21823#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21824pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21825impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21826 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21827 type StablePtr = WrappedTokenTreePtr<'db>;
21828 type Green = WrappedTokenTreeGreen<'db>;
21829 fn missing(db: &'db dyn Database) -> Self::Green {
21830 WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21831 }
21832 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21833 let kind = node.kind(db);
21834 match kind {
21835 SyntaxKind::ParenthesizedTokenTree => {
21836 WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21837 }
21838 SyntaxKind::BracedTokenTree => {
21839 WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21840 }
21841 SyntaxKind::BracketedTokenTree => {
21842 WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21843 }
21844 SyntaxKind::WrappedTokenTreeMissing => {
21845 WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21846 }
21847 _ => panic!(
21848 "Unexpected syntax kind {:?} when constructing {}.",
21849 kind, "WrappedTokenTree"
21850 ),
21851 }
21852 }
21853 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21854 let kind = node.kind(db);
21855 match kind {
21856 SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21857 ParenthesizedTokenTree::from_syntax_node(db, node),
21858 )),
21859 SyntaxKind::BracedTokenTree => {
21860 Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21861 }
21862 SyntaxKind::BracketedTokenTree => {
21863 Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21864 }
21865 SyntaxKind::WrappedTokenTreeMissing => {
21866 Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21867 }
21868 _ => None,
21869 }
21870 }
21871 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21872 match self {
21873 WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21874 WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21875 WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21876 WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21877 }
21878 }
21879 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21880 WrappedTokenTreePtr(self.as_syntax_node().long(db).stable_ptr)
21881 }
21882}
21883impl<'db> WrappedTokenTree<'db> {
21884 pub fn is_variant(kind: SyntaxKind) -> bool {
21886 matches!(
21887 kind,
21888 SyntaxKind::ParenthesizedTokenTree
21889 | SyntaxKind::BracedTokenTree
21890 | SyntaxKind::BracketedTokenTree
21891 | SyntaxKind::WrappedTokenTreeMissing
21892 )
21893 }
21894}
21895#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21896pub struct WrappedTokenTreeMissing<'db> {
21897 node: SyntaxNode<'db>,
21898}
21899impl<'db> WrappedTokenTreeMissing<'db> {
21900 pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21901 let children = [];
21902 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21903 WrappedTokenTreeMissingGreen(
21904 GreenNode {
21905 kind: SyntaxKind::WrappedTokenTreeMissing,
21906 details: GreenNodeDetails::Node { children: children.into(), width },
21907 }
21908 .intern(db),
21909 )
21910 }
21911}
21912impl<'db> WrappedTokenTreeMissing<'db> {}
21913#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21914pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21915impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21916impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21917 type SyntaxNode = WrappedTokenTreeMissing<'db>;
21918 fn untyped(self) -> SyntaxStablePtrId<'db> {
21919 self.0
21920 }
21921 fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21922 WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21923 }
21924}
21925impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21926 fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21927 ptr.untyped()
21928 }
21929}
21930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21931pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21932impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21933 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21934 type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21935 type Green = WrappedTokenTreeMissingGreen<'db>;
21936 fn missing(db: &'db dyn Database) -> Self::Green {
21937 WrappedTokenTreeMissingGreen(
21938 GreenNode {
21939 kind: SyntaxKind::WrappedTokenTreeMissing,
21940 details: GreenNodeDetails::Node {
21941 children: [].into(),
21942 width: TextWidth::default(),
21943 },
21944 }
21945 .intern(db),
21946 )
21947 }
21948 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21949 let kind = node.kind(db);
21950 assert_eq!(
21951 kind,
21952 SyntaxKind::WrappedTokenTreeMissing,
21953 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21954 kind,
21955 SyntaxKind::WrappedTokenTreeMissing
21956 );
21957 Self { node }
21958 }
21959 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21960 let kind = node.kind(db);
21961 if kind == SyntaxKind::WrappedTokenTreeMissing {
21962 Some(Self::from_syntax_node(db, node))
21963 } else {
21964 None
21965 }
21966 }
21967 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21968 self.node
21969 }
21970 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21971 WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21972 }
21973}
21974#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21975pub struct ParenthesizedTokenTree<'db> {
21976 node: SyntaxNode<'db>,
21977}
21978impl<'db> ParenthesizedTokenTree<'db> {
21979 pub const INDEX_LPAREN: usize = 0;
21980 pub const INDEX_TOKENS: usize = 1;
21981 pub const INDEX_RPAREN: usize = 2;
21982 pub fn new_green(
21983 db: &'db dyn Database,
21984 lparen: TerminalLParenGreen<'db>,
21985 tokens: TokenListGreen<'db>,
21986 rparen: TerminalRParenGreen<'db>,
21987 ) -> ParenthesizedTokenTreeGreen<'db> {
21988 let children = [lparen.0, tokens.0, rparen.0];
21989 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21990 ParenthesizedTokenTreeGreen(
21991 GreenNode {
21992 kind: SyntaxKind::ParenthesizedTokenTree,
21993 details: GreenNodeDetails::Node { children: children.into(), width },
21994 }
21995 .intern(db),
21996 )
21997 }
21998}
21999impl<'db> ParenthesizedTokenTree<'db> {
22000 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
22001 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
22002 }
22003 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22004 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22005 }
22006 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
22007 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
22008 }
22009}
22010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22011pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22012impl<'db> ParenthesizedTokenTreePtr<'db> {}
22013impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
22014 type SyntaxNode = ParenthesizedTokenTree<'db>;
22015 fn untyped(self) -> SyntaxStablePtrId<'db> {
22016 self.0
22017 }
22018 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
22019 ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
22020 }
22021}
22022impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22023 fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
22024 ptr.untyped()
22025 }
22026}
22027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22028pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
22029impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
22030 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
22031 type StablePtr = ParenthesizedTokenTreePtr<'db>;
22032 type Green = ParenthesizedTokenTreeGreen<'db>;
22033 fn missing(db: &'db dyn Database) -> Self::Green {
22034 ParenthesizedTokenTreeGreen(
22035 GreenNode {
22036 kind: SyntaxKind::ParenthesizedTokenTree,
22037 details: GreenNodeDetails::Node {
22038 children: [
22039 TerminalLParen::missing(db).0,
22040 TokenList::missing(db).0,
22041 TerminalRParen::missing(db).0,
22042 ]
22043 .into(),
22044 width: TextWidth::default(),
22045 },
22046 }
22047 .intern(db),
22048 )
22049 }
22050 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22051 let kind = node.kind(db);
22052 assert_eq!(
22053 kind,
22054 SyntaxKind::ParenthesizedTokenTree,
22055 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22056 kind,
22057 SyntaxKind::ParenthesizedTokenTree
22058 );
22059 Self { node }
22060 }
22061 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22062 let kind = node.kind(db);
22063 if kind == SyntaxKind::ParenthesizedTokenTree {
22064 Some(Self::from_syntax_node(db, node))
22065 } else {
22066 None
22067 }
22068 }
22069 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22070 self.node
22071 }
22072 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22073 ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
22074 }
22075}
22076#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22077pub struct BracedTokenTree<'db> {
22078 node: SyntaxNode<'db>,
22079}
22080impl<'db> BracedTokenTree<'db> {
22081 pub const INDEX_LBRACE: usize = 0;
22082 pub const INDEX_TOKENS: usize = 1;
22083 pub const INDEX_RBRACE: usize = 2;
22084 pub fn new_green(
22085 db: &'db dyn Database,
22086 lbrace: TerminalLBraceGreen<'db>,
22087 tokens: TokenListGreen<'db>,
22088 rbrace: TerminalRBraceGreen<'db>,
22089 ) -> BracedTokenTreeGreen<'db> {
22090 let children = [lbrace.0, tokens.0, rbrace.0];
22091 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22092 BracedTokenTreeGreen(
22093 GreenNode {
22094 kind: SyntaxKind::BracedTokenTree,
22095 details: GreenNodeDetails::Node { children: children.into(), width },
22096 }
22097 .intern(db),
22098 )
22099 }
22100}
22101impl<'db> BracedTokenTree<'db> {
22102 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22103 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
22104 }
22105 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22106 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22107 }
22108 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22109 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
22110 }
22111}
22112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22113pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22114impl<'db> BracedTokenTreePtr<'db> {}
22115impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
22116 type SyntaxNode = BracedTokenTree<'db>;
22117 fn untyped(self) -> SyntaxStablePtrId<'db> {
22118 self.0
22119 }
22120 fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
22121 BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
22122 }
22123}
22124impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22125 fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
22126 ptr.untyped()
22127 }
22128}
22129#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22130pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
22131impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
22132 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
22133 type StablePtr = BracedTokenTreePtr<'db>;
22134 type Green = BracedTokenTreeGreen<'db>;
22135 fn missing(db: &'db dyn Database) -> Self::Green {
22136 BracedTokenTreeGreen(
22137 GreenNode {
22138 kind: SyntaxKind::BracedTokenTree,
22139 details: GreenNodeDetails::Node {
22140 children: [
22141 TerminalLBrace::missing(db).0,
22142 TokenList::missing(db).0,
22143 TerminalRBrace::missing(db).0,
22144 ]
22145 .into(),
22146 width: TextWidth::default(),
22147 },
22148 }
22149 .intern(db),
22150 )
22151 }
22152 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22153 let kind = node.kind(db);
22154 assert_eq!(
22155 kind,
22156 SyntaxKind::BracedTokenTree,
22157 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22158 kind,
22159 SyntaxKind::BracedTokenTree
22160 );
22161 Self { node }
22162 }
22163 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22164 let kind = node.kind(db);
22165 if kind == SyntaxKind::BracedTokenTree {
22166 Some(Self::from_syntax_node(db, node))
22167 } else {
22168 None
22169 }
22170 }
22171 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22172 self.node
22173 }
22174 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22175 BracedTokenTreePtr(self.node.stable_ptr(db))
22176 }
22177}
22178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22179pub struct BracketedTokenTree<'db> {
22180 node: SyntaxNode<'db>,
22181}
22182impl<'db> BracketedTokenTree<'db> {
22183 pub const INDEX_LBRACK: usize = 0;
22184 pub const INDEX_TOKENS: usize = 1;
22185 pub const INDEX_RBRACK: usize = 2;
22186 pub fn new_green(
22187 db: &'db dyn Database,
22188 lbrack: TerminalLBrackGreen<'db>,
22189 tokens: TokenListGreen<'db>,
22190 rbrack: TerminalRBrackGreen<'db>,
22191 ) -> BracketedTokenTreeGreen<'db> {
22192 let children = [lbrack.0, tokens.0, rbrack.0];
22193 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22194 BracketedTokenTreeGreen(
22195 GreenNode {
22196 kind: SyntaxKind::BracketedTokenTree,
22197 details: GreenNodeDetails::Node { children: children.into(), width },
22198 }
22199 .intern(db),
22200 )
22201 }
22202}
22203impl<'db> BracketedTokenTree<'db> {
22204 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
22205 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
22206 }
22207 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22208 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22209 }
22210 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
22211 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
22212 }
22213}
22214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22215pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22216impl<'db> BracketedTokenTreePtr<'db> {}
22217impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
22218 type SyntaxNode = BracketedTokenTree<'db>;
22219 fn untyped(self) -> SyntaxStablePtrId<'db> {
22220 self.0
22221 }
22222 fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
22223 BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
22224 }
22225}
22226impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22227 fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
22228 ptr.untyped()
22229 }
22230}
22231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22232pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
22233impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
22234 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
22235 type StablePtr = BracketedTokenTreePtr<'db>;
22236 type Green = BracketedTokenTreeGreen<'db>;
22237 fn missing(db: &'db dyn Database) -> Self::Green {
22238 BracketedTokenTreeGreen(
22239 GreenNode {
22240 kind: SyntaxKind::BracketedTokenTree,
22241 details: GreenNodeDetails::Node {
22242 children: [
22243 TerminalLBrack::missing(db).0,
22244 TokenList::missing(db).0,
22245 TerminalRBrack::missing(db).0,
22246 ]
22247 .into(),
22248 width: TextWidth::default(),
22249 },
22250 }
22251 .intern(db),
22252 )
22253 }
22254 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22255 let kind = node.kind(db);
22256 assert_eq!(
22257 kind,
22258 SyntaxKind::BracketedTokenTree,
22259 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22260 kind,
22261 SyntaxKind::BracketedTokenTree
22262 );
22263 Self { node }
22264 }
22265 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22266 let kind = node.kind(db);
22267 if kind == SyntaxKind::BracketedTokenTree {
22268 Some(Self::from_syntax_node(db, node))
22269 } else {
22270 None
22271 }
22272 }
22273 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22274 self.node
22275 }
22276 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22277 BracketedTokenTreePtr(self.node.stable_ptr(db))
22278 }
22279}
22280#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22281pub struct ExprInlineMacro<'db> {
22282 node: SyntaxNode<'db>,
22283}
22284impl<'db> ExprInlineMacro<'db> {
22285 pub const INDEX_PATH: usize = 0;
22286 pub const INDEX_BANG: usize = 1;
22287 pub const INDEX_ARGUMENTS: usize = 2;
22288 pub fn new_green(
22289 db: &'db dyn Database,
22290 path: ExprPathGreen<'db>,
22291 bang: TerminalNotGreen<'db>,
22292 arguments: TokenTreeNodeGreen<'db>,
22293 ) -> ExprInlineMacroGreen<'db> {
22294 let children = [path.0, bang.0, arguments.0];
22295 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22296 ExprInlineMacroGreen(
22297 GreenNode {
22298 kind: SyntaxKind::ExprInlineMacro,
22299 details: GreenNodeDetails::Node { children: children.into(), width },
22300 }
22301 .intern(db),
22302 )
22303 }
22304}
22305impl<'db> ExprInlineMacro<'db> {
22306 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22307 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
22308 }
22309 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22310 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
22311 }
22312 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22313 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
22314 }
22315}
22316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22317pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22318impl<'db> ExprInlineMacroPtr<'db> {}
22319impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
22320 type SyntaxNode = ExprInlineMacro<'db>;
22321 fn untyped(self) -> SyntaxStablePtrId<'db> {
22322 self.0
22323 }
22324 fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
22325 ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
22326 }
22327}
22328impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22329 fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
22330 ptr.untyped()
22331 }
22332}
22333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22334pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
22335impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
22336 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
22337 type StablePtr = ExprInlineMacroPtr<'db>;
22338 type Green = ExprInlineMacroGreen<'db>;
22339 fn missing(db: &'db dyn Database) -> Self::Green {
22340 ExprInlineMacroGreen(
22341 GreenNode {
22342 kind: SyntaxKind::ExprInlineMacro,
22343 details: GreenNodeDetails::Node {
22344 children: [
22345 ExprPath::missing(db).0,
22346 TerminalNot::missing(db).0,
22347 TokenTreeNode::missing(db).0,
22348 ]
22349 .into(),
22350 width: TextWidth::default(),
22351 },
22352 }
22353 .intern(db),
22354 )
22355 }
22356 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22357 let kind = node.kind(db);
22358 assert_eq!(
22359 kind,
22360 SyntaxKind::ExprInlineMacro,
22361 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22362 kind,
22363 SyntaxKind::ExprInlineMacro
22364 );
22365 Self { node }
22366 }
22367 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22368 let kind = node.kind(db);
22369 if kind == SyntaxKind::ExprInlineMacro {
22370 Some(Self::from_syntax_node(db, node))
22371 } else {
22372 None
22373 }
22374 }
22375 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22376 self.node
22377 }
22378 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22379 ExprInlineMacroPtr(self.node.stable_ptr(db))
22380 }
22381}
22382#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22383pub struct ItemInlineMacro<'db> {
22384 node: SyntaxNode<'db>,
22385}
22386impl<'db> ItemInlineMacro<'db> {
22387 pub const INDEX_ATTRIBUTES: usize = 0;
22388 pub const INDEX_PATH: usize = 1;
22389 pub const INDEX_BANG: usize = 2;
22390 pub const INDEX_ARGUMENTS: usize = 3;
22391 pub const INDEX_SEMICOLON: usize = 4;
22392 pub fn new_green(
22393 db: &'db dyn Database,
22394 attributes: AttributeListGreen<'db>,
22395 path: ExprPathGreen<'db>,
22396 bang: TerminalNotGreen<'db>,
22397 arguments: TokenTreeNodeGreen<'db>,
22398 semicolon: TerminalSemicolonGreen<'db>,
22399 ) -> ItemInlineMacroGreen<'db> {
22400 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22401 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22402 ItemInlineMacroGreen(
22403 GreenNode {
22404 kind: SyntaxKind::ItemInlineMacro,
22405 details: GreenNodeDetails::Node { children: children.into(), width },
22406 }
22407 .intern(db),
22408 )
22409 }
22410}
22411impl<'db> ItemInlineMacro<'db> {
22412 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22413 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22414 }
22415 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22416 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22417 }
22418 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22419 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22420 }
22421 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22422 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22423 }
22424 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22425 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22426 }
22427}
22428#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22429pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22430impl<'db> ItemInlineMacroPtr<'db> {}
22431impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22432 type SyntaxNode = ItemInlineMacro<'db>;
22433 fn untyped(self) -> SyntaxStablePtrId<'db> {
22434 self.0
22435 }
22436 fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22437 ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22438 }
22439}
22440impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22441 fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22442 ptr.untyped()
22443 }
22444}
22445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22446pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22447impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22448 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22449 type StablePtr = ItemInlineMacroPtr<'db>;
22450 type Green = ItemInlineMacroGreen<'db>;
22451 fn missing(db: &'db dyn Database) -> Self::Green {
22452 ItemInlineMacroGreen(
22453 GreenNode {
22454 kind: SyntaxKind::ItemInlineMacro,
22455 details: GreenNodeDetails::Node {
22456 children: [
22457 AttributeList::missing(db).0,
22458 ExprPath::missing(db).0,
22459 TerminalNot::missing(db).0,
22460 TokenTreeNode::missing(db).0,
22461 TerminalSemicolon::missing(db).0,
22462 ]
22463 .into(),
22464 width: TextWidth::default(),
22465 },
22466 }
22467 .intern(db),
22468 )
22469 }
22470 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22471 let kind = node.kind(db);
22472 assert_eq!(
22473 kind,
22474 SyntaxKind::ItemInlineMacro,
22475 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22476 kind,
22477 SyntaxKind::ItemInlineMacro
22478 );
22479 Self { node }
22480 }
22481 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22482 let kind = node.kind(db);
22483 if kind == SyntaxKind::ItemInlineMacro {
22484 Some(Self::from_syntax_node(db, node))
22485 } else {
22486 None
22487 }
22488 }
22489 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22490 self.node
22491 }
22492 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22493 ItemInlineMacroPtr(self.node.stable_ptr(db))
22494 }
22495}
22496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22497pub struct ItemMacroDeclaration<'db> {
22498 node: SyntaxNode<'db>,
22499}
22500impl<'db> ItemMacroDeclaration<'db> {
22501 pub const INDEX_ATTRIBUTES: usize = 0;
22502 pub const INDEX_VISIBILITY: usize = 1;
22503 pub const INDEX_MACRO_KW: usize = 2;
22504 pub const INDEX_NAME: usize = 3;
22505 pub const INDEX_LBRACE: usize = 4;
22506 pub const INDEX_RULES: usize = 5;
22507 pub const INDEX_RBRACE: usize = 6;
22508 pub fn new_green(
22509 db: &'db dyn Database,
22510 attributes: AttributeListGreen<'db>,
22511 visibility: VisibilityGreen<'db>,
22512 macro_kw: TerminalMacroGreen<'db>,
22513 name: TerminalIdentifierGreen<'db>,
22514 lbrace: TerminalLBraceGreen<'db>,
22515 rules: MacroRulesListGreen<'db>,
22516 rbrace: TerminalRBraceGreen<'db>,
22517 ) -> ItemMacroDeclarationGreen<'db> {
22518 let children =
22519 [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22520 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22521 ItemMacroDeclarationGreen(
22522 GreenNode {
22523 kind: SyntaxKind::ItemMacroDeclaration,
22524 details: GreenNodeDetails::Node { children: children.into(), width },
22525 }
22526 .intern(db),
22527 )
22528 }
22529}
22530impl<'db> ItemMacroDeclaration<'db> {
22531 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22532 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22533 }
22534 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22535 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22536 }
22537 pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22538 TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22539 }
22540 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22541 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22542 }
22543 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22544 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22545 }
22546 pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22547 MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22548 }
22549 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22550 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22551 }
22552}
22553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22554pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22555impl<'db> ItemMacroDeclarationPtr<'db> {
22556 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22557 let ptr = self.0.long(db);
22558 if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
22559 TerminalIdentifierGreen(key_fields[0])
22560 } else {
22561 panic!("Unexpected key field query on root.");
22562 }
22563 }
22564}
22565impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22566 type SyntaxNode = ItemMacroDeclaration<'db>;
22567 fn untyped(self) -> SyntaxStablePtrId<'db> {
22568 self.0
22569 }
22570 fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22571 ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22572 }
22573}
22574impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22575 fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22576 ptr.untyped()
22577 }
22578}
22579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22580pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22581impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22582 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22583 type StablePtr = ItemMacroDeclarationPtr<'db>;
22584 type Green = ItemMacroDeclarationGreen<'db>;
22585 fn missing(db: &'db dyn Database) -> Self::Green {
22586 ItemMacroDeclarationGreen(
22587 GreenNode {
22588 kind: SyntaxKind::ItemMacroDeclaration,
22589 details: GreenNodeDetails::Node {
22590 children: [
22591 AttributeList::missing(db).0,
22592 Visibility::missing(db).0,
22593 TerminalMacro::missing(db).0,
22594 TerminalIdentifier::missing(db).0,
22595 TerminalLBrace::missing(db).0,
22596 MacroRulesList::missing(db).0,
22597 TerminalRBrace::missing(db).0,
22598 ]
22599 .into(),
22600 width: TextWidth::default(),
22601 },
22602 }
22603 .intern(db),
22604 )
22605 }
22606 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22607 let kind = node.kind(db);
22608 assert_eq!(
22609 kind,
22610 SyntaxKind::ItemMacroDeclaration,
22611 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22612 kind,
22613 SyntaxKind::ItemMacroDeclaration
22614 );
22615 Self { node }
22616 }
22617 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22618 let kind = node.kind(db);
22619 if kind == SyntaxKind::ItemMacroDeclaration {
22620 Some(Self::from_syntax_node(db, node))
22621 } else {
22622 None
22623 }
22624 }
22625 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22626 self.node
22627 }
22628 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22629 ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22630 }
22631}
22632#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22633pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22634impl<'db> Deref for MacroRulesList<'db> {
22635 type Target = ElementList<'db, MacroRule<'db>, 1>;
22636 fn deref(&self) -> &Self::Target {
22637 &self.0
22638 }
22639}
22640impl<'db> MacroRulesList<'db> {
22641 pub fn new_green(
22642 db: &'db dyn Database,
22643 children: &[MacroRuleGreen<'db>],
22644 ) -> MacroRulesListGreen<'db> {
22645 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22646 MacroRulesListGreen(
22647 GreenNode {
22648 kind: SyntaxKind::MacroRulesList,
22649 details: GreenNodeDetails::Node {
22650 children: children.iter().map(|x| x.0).collect(),
22651 width,
22652 },
22653 }
22654 .intern(db),
22655 )
22656 }
22657}
22658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22659pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22660impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22661 type SyntaxNode = MacroRulesList<'db>;
22662 fn untyped(self) -> SyntaxStablePtrId<'db> {
22663 self.0
22664 }
22665 fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22666 MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22667 }
22668}
22669impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22670 fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22671 ptr.untyped()
22672 }
22673}
22674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22675pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22676impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22677 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22678 type StablePtr = MacroRulesListPtr<'db>;
22679 type Green = MacroRulesListGreen<'db>;
22680 fn missing(db: &'db dyn Database) -> Self::Green {
22681 MacroRulesListGreen(
22682 GreenNode {
22683 kind: SyntaxKind::MacroRulesList,
22684 details: GreenNodeDetails::Node {
22685 children: [].into(),
22686 width: TextWidth::default(),
22687 },
22688 }
22689 .intern(db),
22690 )
22691 }
22692 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22693 Self(ElementList::new(node))
22694 }
22695 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22696 if node.kind(db) == SyntaxKind::MacroRulesList {
22697 Some(Self(ElementList::new(node)))
22698 } else {
22699 None
22700 }
22701 }
22702 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22703 self.node
22704 }
22705 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22706 MacroRulesListPtr(self.node.stable_ptr(db))
22707 }
22708}
22709#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22710pub struct MacroRule<'db> {
22711 node: SyntaxNode<'db>,
22712}
22713impl<'db> MacroRule<'db> {
22714 pub const INDEX_LHS: usize = 0;
22715 pub const INDEX_FAT_ARROW: usize = 1;
22716 pub const INDEX_RHS: usize = 2;
22717 pub const INDEX_SEMICOLON: usize = 3;
22718 pub fn new_green(
22719 db: &'db dyn Database,
22720 lhs: WrappedMacroGreen<'db>,
22721 fat_arrow: TerminalMatchArrowGreen<'db>,
22722 rhs: BracedMacroGreen<'db>,
22723 semicolon: TerminalSemicolonGreen<'db>,
22724 ) -> MacroRuleGreen<'db> {
22725 let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22726 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22727 MacroRuleGreen(
22728 GreenNode {
22729 kind: SyntaxKind::MacroRule,
22730 details: GreenNodeDetails::Node { children: children.into(), width },
22731 }
22732 .intern(db),
22733 )
22734 }
22735}
22736impl<'db> MacroRule<'db> {
22737 pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22738 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22739 }
22740 pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22741 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22742 }
22743 pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22744 BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22745 }
22746 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22747 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22748 }
22749}
22750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22751pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22752impl<'db> MacroRulePtr<'db> {}
22753impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22754 type SyntaxNode = MacroRule<'db>;
22755 fn untyped(self) -> SyntaxStablePtrId<'db> {
22756 self.0
22757 }
22758 fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22759 MacroRule::from_syntax_node(db, self.0.lookup(db))
22760 }
22761}
22762impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22763 fn from(ptr: MacroRulePtr<'db>) -> Self {
22764 ptr.untyped()
22765 }
22766}
22767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22768pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22769impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22770 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22771 type StablePtr = MacroRulePtr<'db>;
22772 type Green = MacroRuleGreen<'db>;
22773 fn missing(db: &'db dyn Database) -> Self::Green {
22774 MacroRuleGreen(
22775 GreenNode {
22776 kind: SyntaxKind::MacroRule,
22777 details: GreenNodeDetails::Node {
22778 children: [
22779 WrappedMacro::missing(db).0,
22780 TerminalMatchArrow::missing(db).0,
22781 BracedMacro::missing(db).0,
22782 TerminalSemicolon::missing(db).0,
22783 ]
22784 .into(),
22785 width: TextWidth::default(),
22786 },
22787 }
22788 .intern(db),
22789 )
22790 }
22791 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22792 let kind = node.kind(db);
22793 assert_eq!(
22794 kind,
22795 SyntaxKind::MacroRule,
22796 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22797 kind,
22798 SyntaxKind::MacroRule
22799 );
22800 Self { node }
22801 }
22802 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22803 let kind = node.kind(db);
22804 if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22805 }
22806 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22807 self.node
22808 }
22809 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22810 MacroRulePtr(self.node.stable_ptr(db))
22811 }
22812}
22813#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22814pub struct ParamKind<'db> {
22815 node: SyntaxNode<'db>,
22816}
22817impl<'db> ParamKind<'db> {
22818 pub const INDEX_COLON: usize = 0;
22819 pub const INDEX_KIND: usize = 1;
22820 pub fn new_green(
22821 db: &'db dyn Database,
22822 colon: TerminalColonGreen<'db>,
22823 kind: MacroParamKindGreen<'db>,
22824 ) -> ParamKindGreen<'db> {
22825 let children = [colon.0, kind.0];
22826 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22827 ParamKindGreen(
22828 GreenNode {
22829 kind: SyntaxKind::ParamKind,
22830 details: GreenNodeDetails::Node { children: children.into(), width },
22831 }
22832 .intern(db),
22833 )
22834 }
22835}
22836impl<'db> ParamKind<'db> {
22837 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22838 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22839 }
22840 pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22841 MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22842 }
22843}
22844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22845pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22846impl<'db> ParamKindPtr<'db> {}
22847impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22848 type SyntaxNode = ParamKind<'db>;
22849 fn untyped(self) -> SyntaxStablePtrId<'db> {
22850 self.0
22851 }
22852 fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22853 ParamKind::from_syntax_node(db, self.0.lookup(db))
22854 }
22855}
22856impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22857 fn from(ptr: ParamKindPtr<'db>) -> Self {
22858 ptr.untyped()
22859 }
22860}
22861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22862pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22863impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22864 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22865 type StablePtr = ParamKindPtr<'db>;
22866 type Green = ParamKindGreen<'db>;
22867 fn missing(db: &'db dyn Database) -> Self::Green {
22868 ParamKindGreen(
22869 GreenNode {
22870 kind: SyntaxKind::ParamKind,
22871 details: GreenNodeDetails::Node {
22872 children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22873 width: TextWidth::default(),
22874 },
22875 }
22876 .intern(db),
22877 )
22878 }
22879 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22880 let kind = node.kind(db);
22881 assert_eq!(
22882 kind,
22883 SyntaxKind::ParamKind,
22884 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22885 kind,
22886 SyntaxKind::ParamKind
22887 );
22888 Self { node }
22889 }
22890 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22891 let kind = node.kind(db);
22892 if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22893 }
22894 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22895 self.node
22896 }
22897 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22898 ParamKindPtr(self.node.stable_ptr(db))
22899 }
22900}
22901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22902pub enum OptionParamKind<'db> {
22903 Empty(OptionParamKindEmpty<'db>),
22904 ParamKind(ParamKind<'db>),
22905}
22906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22907pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22908impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22909 type SyntaxNode = OptionParamKind<'db>;
22910 fn untyped(self) -> SyntaxStablePtrId<'db> {
22911 self.0
22912 }
22913 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22914 OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22915 }
22916}
22917impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22918 fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22919 ptr.untyped()
22920 }
22921}
22922impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22923 fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22924 Self(value.0)
22925 }
22926}
22927impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22928 fn from(value: ParamKindPtr<'db>) -> Self {
22929 Self(value.0)
22930 }
22931}
22932impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22933 fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22934 Self(value.0)
22935 }
22936}
22937impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22938 fn from(value: ParamKindGreen<'db>) -> Self {
22939 Self(value.0)
22940 }
22941}
22942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22943pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22944impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22945 const OPTIONAL_KIND: Option<SyntaxKind> = None;
22946 type StablePtr = OptionParamKindPtr<'db>;
22947 type Green = OptionParamKindGreen<'db>;
22948 fn missing(db: &'db dyn Database) -> Self::Green {
22949 panic!("No missing variant.");
22950 }
22951 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22952 let kind = node.kind(db);
22953 match kind {
22954 SyntaxKind::OptionParamKindEmpty => {
22955 OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22956 }
22957 SyntaxKind::ParamKind => {
22958 OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22959 }
22960 _ => {
22961 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22962 }
22963 }
22964 }
22965 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22966 let kind = node.kind(db);
22967 match kind {
22968 SyntaxKind::OptionParamKindEmpty => {
22969 Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22970 }
22971 SyntaxKind::ParamKind => {
22972 Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22973 }
22974 _ => None,
22975 }
22976 }
22977 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22978 match self {
22979 OptionParamKind::Empty(x) => x.as_syntax_node(),
22980 OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22981 }
22982 }
22983 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22984 OptionParamKindPtr(self.as_syntax_node().long(db).stable_ptr)
22985 }
22986}
22987impl<'db> OptionParamKind<'db> {
22988 pub fn is_variant(kind: SyntaxKind) -> bool {
22990 matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22991 }
22992}
22993#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22994pub struct OptionParamKindEmpty<'db> {
22995 node: SyntaxNode<'db>,
22996}
22997impl<'db> OptionParamKindEmpty<'db> {
22998 pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22999 let children = [];
23000 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23001 OptionParamKindEmptyGreen(
23002 GreenNode {
23003 kind: SyntaxKind::OptionParamKindEmpty,
23004 details: GreenNodeDetails::Node { children: children.into(), width },
23005 }
23006 .intern(db),
23007 )
23008 }
23009}
23010impl<'db> OptionParamKindEmpty<'db> {}
23011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23012pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23013impl<'db> OptionParamKindEmptyPtr<'db> {}
23014impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
23015 type SyntaxNode = OptionParamKindEmpty<'db>;
23016 fn untyped(self) -> SyntaxStablePtrId<'db> {
23017 self.0
23018 }
23019 fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
23020 OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
23021 }
23022}
23023impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23024 fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
23025 ptr.untyped()
23026 }
23027}
23028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23029pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
23030impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
23031 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
23032 type StablePtr = OptionParamKindEmptyPtr<'db>;
23033 type Green = OptionParamKindEmptyGreen<'db>;
23034 fn missing(db: &'db dyn Database) -> Self::Green {
23035 OptionParamKindEmptyGreen(
23036 GreenNode {
23037 kind: SyntaxKind::OptionParamKindEmpty,
23038 details: GreenNodeDetails::Node {
23039 children: [].into(),
23040 width: TextWidth::default(),
23041 },
23042 }
23043 .intern(db),
23044 )
23045 }
23046 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23047 let kind = node.kind(db);
23048 assert_eq!(
23049 kind,
23050 SyntaxKind::OptionParamKindEmpty,
23051 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23052 kind,
23053 SyntaxKind::OptionParamKindEmpty
23054 );
23055 Self { node }
23056 }
23057 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23058 let kind = node.kind(db);
23059 if kind == SyntaxKind::OptionParamKindEmpty {
23060 Some(Self::from_syntax_node(db, node))
23061 } else {
23062 None
23063 }
23064 }
23065 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23066 self.node
23067 }
23068 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23069 OptionParamKindEmptyPtr(self.node.stable_ptr(db))
23070 }
23071}
23072#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23073pub struct MacroParam<'db> {
23074 node: SyntaxNode<'db>,
23075}
23076impl<'db> MacroParam<'db> {
23077 pub const INDEX_DOLLAR: usize = 0;
23078 pub const INDEX_NAME: usize = 1;
23079 pub const INDEX_KIND: usize = 2;
23080 pub fn new_green(
23081 db: &'db dyn Database,
23082 dollar: TerminalDollarGreen<'db>,
23083 name: TerminalIdentifierGreen<'db>,
23084 kind: OptionParamKindGreen<'db>,
23085 ) -> MacroParamGreen<'db> {
23086 let children = [dollar.0, name.0, kind.0];
23087 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23088 MacroParamGreen(
23089 GreenNode {
23090 kind: SyntaxKind::MacroParam,
23091 details: GreenNodeDetails::Node { children: children.into(), width },
23092 }
23093 .intern(db),
23094 )
23095 }
23096}
23097impl<'db> MacroParam<'db> {
23098 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23099 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23100 }
23101 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23102 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
23103 }
23104 pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
23105 OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
23106 }
23107}
23108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23109pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
23110impl<'db> MacroParamPtr<'db> {}
23111impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
23112 type SyntaxNode = MacroParam<'db>;
23113 fn untyped(self) -> SyntaxStablePtrId<'db> {
23114 self.0
23115 }
23116 fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
23117 MacroParam::from_syntax_node(db, self.0.lookup(db))
23118 }
23119}
23120impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
23121 fn from(ptr: MacroParamPtr<'db>) -> Self {
23122 ptr.untyped()
23123 }
23124}
23125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23126pub struct MacroParamGreen<'db>(pub GreenId<'db>);
23127impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
23128 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
23129 type StablePtr = MacroParamPtr<'db>;
23130 type Green = MacroParamGreen<'db>;
23131 fn missing(db: &'db dyn Database) -> Self::Green {
23132 MacroParamGreen(
23133 GreenNode {
23134 kind: SyntaxKind::MacroParam,
23135 details: GreenNodeDetails::Node {
23136 children: [
23137 TerminalDollar::missing(db).0,
23138 TerminalIdentifier::missing(db).0,
23139 OptionParamKind::missing(db).0,
23140 ]
23141 .into(),
23142 width: TextWidth::default(),
23143 },
23144 }
23145 .intern(db),
23146 )
23147 }
23148 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23149 let kind = node.kind(db);
23150 assert_eq!(
23151 kind,
23152 SyntaxKind::MacroParam,
23153 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23154 kind,
23155 SyntaxKind::MacroParam
23156 );
23157 Self { node }
23158 }
23159 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23160 let kind = node.kind(db);
23161 if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
23162 }
23163 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23164 self.node
23165 }
23166 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23167 MacroParamPtr(self.node.stable_ptr(db))
23168 }
23169}
23170#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23171pub struct MacroRepetition<'db> {
23172 node: SyntaxNode<'db>,
23173}
23174impl<'db> MacroRepetition<'db> {
23175 pub const INDEX_DOLLAR: usize = 0;
23176 pub const INDEX_LPAREN: usize = 1;
23177 pub const INDEX_ELEMENTS: usize = 2;
23178 pub const INDEX_RPAREN: usize = 3;
23179 pub const INDEX_SEPARATOR: usize = 4;
23180 pub const INDEX_OPERATOR: usize = 5;
23181 pub fn new_green(
23182 db: &'db dyn Database,
23183 dollar: TerminalDollarGreen<'db>,
23184 lparen: TerminalLParenGreen<'db>,
23185 elements: MacroElementsGreen<'db>,
23186 rparen: TerminalRParenGreen<'db>,
23187 separator: OptionTerminalCommaGreen<'db>,
23188 operator: MacroRepetitionOperatorGreen<'db>,
23189 ) -> MacroRepetitionGreen<'db> {
23190 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
23191 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23192 MacroRepetitionGreen(
23193 GreenNode {
23194 kind: SyntaxKind::MacroRepetition,
23195 details: GreenNodeDetails::Node { children: children.into(), width },
23196 }
23197 .intern(db),
23198 )
23199 }
23200}
23201impl<'db> MacroRepetition<'db> {
23202 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23203 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23204 }
23205 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
23206 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
23207 }
23208 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
23209 MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
23210 }
23211 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
23212 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
23213 }
23214 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
23215 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
23216 }
23217 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
23218 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
23219 }
23220}
23221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23222pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
23223impl<'db> MacroRepetitionPtr<'db> {}
23224impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
23225 type SyntaxNode = MacroRepetition<'db>;
23226 fn untyped(self) -> SyntaxStablePtrId<'db> {
23227 self.0
23228 }
23229 fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
23230 MacroRepetition::from_syntax_node(db, self.0.lookup(db))
23231 }
23232}
23233impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
23234 fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
23235 ptr.untyped()
23236 }
23237}
23238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23239pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
23240impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
23241 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
23242 type StablePtr = MacroRepetitionPtr<'db>;
23243 type Green = MacroRepetitionGreen<'db>;
23244 fn missing(db: &'db dyn Database) -> Self::Green {
23245 MacroRepetitionGreen(
23246 GreenNode {
23247 kind: SyntaxKind::MacroRepetition,
23248 details: GreenNodeDetails::Node {
23249 children: [
23250 TerminalDollar::missing(db).0,
23251 TerminalLParen::missing(db).0,
23252 MacroElements::missing(db).0,
23253 TerminalRParen::missing(db).0,
23254 OptionTerminalComma::missing(db).0,
23255 MacroRepetitionOperator::missing(db).0,
23256 ]
23257 .into(),
23258 width: TextWidth::default(),
23259 },
23260 }
23261 .intern(db),
23262 )
23263 }
23264 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23265 let kind = node.kind(db);
23266 assert_eq!(
23267 kind,
23268 SyntaxKind::MacroRepetition,
23269 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23270 kind,
23271 SyntaxKind::MacroRepetition
23272 );
23273 Self { node }
23274 }
23275 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23276 let kind = node.kind(db);
23277 if kind == SyntaxKind::MacroRepetition {
23278 Some(Self::from_syntax_node(db, node))
23279 } else {
23280 None
23281 }
23282 }
23283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23284 self.node
23285 }
23286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23287 MacroRepetitionPtr(self.node.stable_ptr(db))
23288 }
23289}
23290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23291pub enum OptionTerminalComma<'db> {
23292 Empty(OptionTerminalCommaEmpty<'db>),
23293 TerminalComma(TerminalComma<'db>),
23294}
23295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23296pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
23297impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
23298 type SyntaxNode = OptionTerminalComma<'db>;
23299 fn untyped(self) -> SyntaxStablePtrId<'db> {
23300 self.0
23301 }
23302 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23303 OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
23304 }
23305}
23306impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
23307 fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
23308 ptr.untyped()
23309 }
23310}
23311impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
23312 fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23313 Self(value.0)
23314 }
23315}
23316impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
23317 fn from(value: TerminalCommaPtr<'db>) -> Self {
23318 Self(value.0)
23319 }
23320}
23321impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
23322 fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
23323 Self(value.0)
23324 }
23325}
23326impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
23327 fn from(value: TerminalCommaGreen<'db>) -> Self {
23328 Self(value.0)
23329 }
23330}
23331#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23332pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
23333impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
23334 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23335 type StablePtr = OptionTerminalCommaPtr<'db>;
23336 type Green = OptionTerminalCommaGreen<'db>;
23337 fn missing(db: &'db dyn Database) -> Self::Green {
23338 panic!("No missing variant.");
23339 }
23340 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23341 let kind = node.kind(db);
23342 match kind {
23343 SyntaxKind::OptionTerminalCommaEmpty => {
23344 OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
23345 }
23346 SyntaxKind::TerminalComma => {
23347 OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
23348 }
23349 _ => panic!(
23350 "Unexpected syntax kind {:?} when constructing {}.",
23351 kind, "OptionTerminalComma"
23352 ),
23353 }
23354 }
23355 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23356 let kind = node.kind(db);
23357 match kind {
23358 SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
23359 OptionTerminalCommaEmpty::from_syntax_node(db, node),
23360 )),
23361 SyntaxKind::TerminalComma => {
23362 Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
23363 }
23364 _ => None,
23365 }
23366 }
23367 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23368 match self {
23369 OptionTerminalComma::Empty(x) => x.as_syntax_node(),
23370 OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
23371 }
23372 }
23373 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23374 OptionTerminalCommaPtr(self.as_syntax_node().long(db).stable_ptr)
23375 }
23376}
23377impl<'db> OptionTerminalComma<'db> {
23378 pub fn is_variant(kind: SyntaxKind) -> bool {
23380 matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
23381 }
23382}
23383#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23384pub struct OptionTerminalCommaEmpty<'db> {
23385 node: SyntaxNode<'db>,
23386}
23387impl<'db> OptionTerminalCommaEmpty<'db> {
23388 pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
23389 let children = [];
23390 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23391 OptionTerminalCommaEmptyGreen(
23392 GreenNode {
23393 kind: SyntaxKind::OptionTerminalCommaEmpty,
23394 details: GreenNodeDetails::Node { children: children.into(), width },
23395 }
23396 .intern(db),
23397 )
23398 }
23399}
23400impl<'db> OptionTerminalCommaEmpty<'db> {}
23401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23402pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23403impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23404impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23405 type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23406 fn untyped(self) -> SyntaxStablePtrId<'db> {
23407 self.0
23408 }
23409 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23410 OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23411 }
23412}
23413impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23414 fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23415 ptr.untyped()
23416 }
23417}
23418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23419pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23420impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23421 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23422 type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23423 type Green = OptionTerminalCommaEmptyGreen<'db>;
23424 fn missing(db: &'db dyn Database) -> Self::Green {
23425 OptionTerminalCommaEmptyGreen(
23426 GreenNode {
23427 kind: SyntaxKind::OptionTerminalCommaEmpty,
23428 details: GreenNodeDetails::Node {
23429 children: [].into(),
23430 width: TextWidth::default(),
23431 },
23432 }
23433 .intern(db),
23434 )
23435 }
23436 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23437 let kind = node.kind(db);
23438 assert_eq!(
23439 kind,
23440 SyntaxKind::OptionTerminalCommaEmpty,
23441 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23442 kind,
23443 SyntaxKind::OptionTerminalCommaEmpty
23444 );
23445 Self { node }
23446 }
23447 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23448 let kind = node.kind(db);
23449 if kind == SyntaxKind::OptionTerminalCommaEmpty {
23450 Some(Self::from_syntax_node(db, node))
23451 } else {
23452 None
23453 }
23454 }
23455 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23456 self.node
23457 }
23458 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23459 OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23460 }
23461}
23462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23463pub enum MacroRepetitionOperator<'db> {
23464 ZeroOrOne(TerminalQuestionMark<'db>),
23465 OneOrMore(TerminalPlus<'db>),
23466 ZeroOrMore(TerminalMul<'db>),
23467 Missing(MacroRepetitionOperatorMissing<'db>),
23468}
23469#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23470pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23471impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23472 type SyntaxNode = MacroRepetitionOperator<'db>;
23473 fn untyped(self) -> SyntaxStablePtrId<'db> {
23474 self.0
23475 }
23476 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23477 MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23478 }
23479}
23480impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23481 fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23482 ptr.untyped()
23483 }
23484}
23485impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23486 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23487 Self(value.0)
23488 }
23489}
23490impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23491 fn from(value: TerminalPlusPtr<'db>) -> Self {
23492 Self(value.0)
23493 }
23494}
23495impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23496 fn from(value: TerminalMulPtr<'db>) -> Self {
23497 Self(value.0)
23498 }
23499}
23500impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23501 fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23502 Self(value.0)
23503 }
23504}
23505impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23506 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23507 Self(value.0)
23508 }
23509}
23510impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23511 fn from(value: TerminalPlusGreen<'db>) -> Self {
23512 Self(value.0)
23513 }
23514}
23515impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23516 fn from(value: TerminalMulGreen<'db>) -> Self {
23517 Self(value.0)
23518 }
23519}
23520impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23521 fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23522 Self(value.0)
23523 }
23524}
23525#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23526pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23527impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23528 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23529 type StablePtr = MacroRepetitionOperatorPtr<'db>;
23530 type Green = MacroRepetitionOperatorGreen<'db>;
23531 fn missing(db: &'db dyn Database) -> Self::Green {
23532 MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23533 }
23534 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23535 let kind = node.kind(db);
23536 match kind {
23537 SyntaxKind::TerminalQuestionMark => {
23538 MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23539 }
23540 SyntaxKind::TerminalPlus => {
23541 MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23542 }
23543 SyntaxKind::TerminalMul => {
23544 MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23545 }
23546 SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23547 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23548 ),
23549 _ => panic!(
23550 "Unexpected syntax kind {:?} when constructing {}.",
23551 kind, "MacroRepetitionOperator"
23552 ),
23553 }
23554 }
23555 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23556 let kind = node.kind(db);
23557 match kind {
23558 SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23559 TerminalQuestionMark::from_syntax_node(db, node),
23560 )),
23561 SyntaxKind::TerminalPlus => {
23562 Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23563 }
23564 SyntaxKind::TerminalMul => {
23565 Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23566 }
23567 SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23568 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23569 )),
23570 _ => None,
23571 }
23572 }
23573 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23574 match self {
23575 MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23576 MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23577 MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23578 MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23579 }
23580 }
23581 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23582 MacroRepetitionOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
23583 }
23584}
23585impl<'db> MacroRepetitionOperator<'db> {
23586 pub fn is_variant(kind: SyntaxKind) -> bool {
23588 matches!(
23589 kind,
23590 SyntaxKind::TerminalQuestionMark
23591 | SyntaxKind::TerminalPlus
23592 | SyntaxKind::TerminalMul
23593 | SyntaxKind::MacroRepetitionOperatorMissing
23594 )
23595 }
23596}
23597#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23598pub struct MacroRepetitionOperatorMissing<'db> {
23599 node: SyntaxNode<'db>,
23600}
23601impl<'db> MacroRepetitionOperatorMissing<'db> {
23602 pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23603 let children = [];
23604 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23605 MacroRepetitionOperatorMissingGreen(
23606 GreenNode {
23607 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23608 details: GreenNodeDetails::Node { children: children.into(), width },
23609 }
23610 .intern(db),
23611 )
23612 }
23613}
23614impl<'db> MacroRepetitionOperatorMissing<'db> {}
23615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23616pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23617impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23618impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23619 type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23620 fn untyped(self) -> SyntaxStablePtrId<'db> {
23621 self.0
23622 }
23623 fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23624 MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23625 }
23626}
23627impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23628 fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23629 ptr.untyped()
23630 }
23631}
23632#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23633pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23634impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23635 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23636 type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23637 type Green = MacroRepetitionOperatorMissingGreen<'db>;
23638 fn missing(db: &'db dyn Database) -> Self::Green {
23639 MacroRepetitionOperatorMissingGreen(
23640 GreenNode {
23641 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23642 details: GreenNodeDetails::Node {
23643 children: [].into(),
23644 width: TextWidth::default(),
23645 },
23646 }
23647 .intern(db),
23648 )
23649 }
23650 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23651 let kind = node.kind(db);
23652 assert_eq!(
23653 kind,
23654 SyntaxKind::MacroRepetitionOperatorMissing,
23655 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23656 kind,
23657 SyntaxKind::MacroRepetitionOperatorMissing
23658 );
23659 Self { node }
23660 }
23661 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23662 let kind = node.kind(db);
23663 if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23664 Some(Self::from_syntax_node(db, node))
23665 } else {
23666 None
23667 }
23668 }
23669 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23670 self.node
23671 }
23672 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23673 MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23674 }
23675}
23676#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23677pub struct ParamIdent<'db> {
23678 node: SyntaxNode<'db>,
23679}
23680impl<'db> ParamIdent<'db> {
23681 pub const INDEX_IDENT: usize = 0;
23682 pub fn new_green(
23683 db: &'db dyn Database,
23684 ident: TerminalIdentifierGreen<'db>,
23685 ) -> ParamIdentGreen<'db> {
23686 let children = [ident.0];
23687 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23688 ParamIdentGreen(
23689 GreenNode {
23690 kind: SyntaxKind::ParamIdent,
23691 details: GreenNodeDetails::Node { children: children.into(), width },
23692 }
23693 .intern(db),
23694 )
23695 }
23696}
23697impl<'db> ParamIdent<'db> {
23698 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23699 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23700 }
23701}
23702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23703pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23704impl<'db> ParamIdentPtr<'db> {}
23705impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23706 type SyntaxNode = ParamIdent<'db>;
23707 fn untyped(self) -> SyntaxStablePtrId<'db> {
23708 self.0
23709 }
23710 fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23711 ParamIdent::from_syntax_node(db, self.0.lookup(db))
23712 }
23713}
23714impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23715 fn from(ptr: ParamIdentPtr<'db>) -> Self {
23716 ptr.untyped()
23717 }
23718}
23719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23720pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23721impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23722 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23723 type StablePtr = ParamIdentPtr<'db>;
23724 type Green = ParamIdentGreen<'db>;
23725 fn missing(db: &'db dyn Database) -> Self::Green {
23726 ParamIdentGreen(
23727 GreenNode {
23728 kind: SyntaxKind::ParamIdent,
23729 details: GreenNodeDetails::Node {
23730 children: [TerminalIdentifier::missing(db).0].into(),
23731 width: TextWidth::default(),
23732 },
23733 }
23734 .intern(db),
23735 )
23736 }
23737 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23738 let kind = node.kind(db);
23739 assert_eq!(
23740 kind,
23741 SyntaxKind::ParamIdent,
23742 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23743 kind,
23744 SyntaxKind::ParamIdent
23745 );
23746 Self { node }
23747 }
23748 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23749 let kind = node.kind(db);
23750 if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23751 }
23752 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23753 self.node
23754 }
23755 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23756 ParamIdentPtr(self.node.stable_ptr(db))
23757 }
23758}
23759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23760pub struct ParamExpr<'db> {
23761 node: SyntaxNode<'db>,
23762}
23763impl<'db> ParamExpr<'db> {
23764 pub const INDEX_EXPR: usize = 0;
23765 pub fn new_green(
23766 db: &'db dyn Database,
23767 expr: TerminalIdentifierGreen<'db>,
23768 ) -> ParamExprGreen<'db> {
23769 let children = [expr.0];
23770 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23771 ParamExprGreen(
23772 GreenNode {
23773 kind: SyntaxKind::ParamExpr,
23774 details: GreenNodeDetails::Node { children: children.into(), width },
23775 }
23776 .intern(db),
23777 )
23778 }
23779}
23780impl<'db> ParamExpr<'db> {
23781 pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23782 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23783 }
23784}
23785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23786pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23787impl<'db> ParamExprPtr<'db> {}
23788impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23789 type SyntaxNode = ParamExpr<'db>;
23790 fn untyped(self) -> SyntaxStablePtrId<'db> {
23791 self.0
23792 }
23793 fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23794 ParamExpr::from_syntax_node(db, self.0.lookup(db))
23795 }
23796}
23797impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23798 fn from(ptr: ParamExprPtr<'db>) -> Self {
23799 ptr.untyped()
23800 }
23801}
23802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23803pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23804impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23805 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23806 type StablePtr = ParamExprPtr<'db>;
23807 type Green = ParamExprGreen<'db>;
23808 fn missing(db: &'db dyn Database) -> Self::Green {
23809 ParamExprGreen(
23810 GreenNode {
23811 kind: SyntaxKind::ParamExpr,
23812 details: GreenNodeDetails::Node {
23813 children: [TerminalIdentifier::missing(db).0].into(),
23814 width: TextWidth::default(),
23815 },
23816 }
23817 .intern(db),
23818 )
23819 }
23820 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23821 let kind = node.kind(db);
23822 assert_eq!(
23823 kind,
23824 SyntaxKind::ParamExpr,
23825 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23826 kind,
23827 SyntaxKind::ParamExpr
23828 );
23829 Self { node }
23830 }
23831 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23832 let kind = node.kind(db);
23833 if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23834 }
23835 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23836 self.node
23837 }
23838 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23839 ParamExprPtr(self.node.stable_ptr(db))
23840 }
23841}
23842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23843pub enum MacroParamKind<'db> {
23844 Identifier(ParamIdent<'db>),
23845 Expr(ParamExpr<'db>),
23846 Missing(MacroParamKindMissing<'db>),
23847}
23848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23849pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23850impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23851 type SyntaxNode = MacroParamKind<'db>;
23852 fn untyped(self) -> SyntaxStablePtrId<'db> {
23853 self.0
23854 }
23855 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23856 MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23857 }
23858}
23859impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23860 fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23861 ptr.untyped()
23862 }
23863}
23864impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23865 fn from(value: ParamIdentPtr<'db>) -> Self {
23866 Self(value.0)
23867 }
23868}
23869impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23870 fn from(value: ParamExprPtr<'db>) -> Self {
23871 Self(value.0)
23872 }
23873}
23874impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23875 fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23876 Self(value.0)
23877 }
23878}
23879impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23880 fn from(value: ParamIdentGreen<'db>) -> Self {
23881 Self(value.0)
23882 }
23883}
23884impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23885 fn from(value: ParamExprGreen<'db>) -> Self {
23886 Self(value.0)
23887 }
23888}
23889impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23890 fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23891 Self(value.0)
23892 }
23893}
23894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23895pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23896impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23897 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23898 type StablePtr = MacroParamKindPtr<'db>;
23899 type Green = MacroParamKindGreen<'db>;
23900 fn missing(db: &'db dyn Database) -> Self::Green {
23901 MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23902 }
23903 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23904 let kind = node.kind(db);
23905 match kind {
23906 SyntaxKind::ParamIdent => {
23907 MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23908 }
23909 SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23910 SyntaxKind::MacroParamKindMissing => {
23911 MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23912 }
23913 _ => {
23914 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23915 }
23916 }
23917 }
23918 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23919 let kind = node.kind(db);
23920 match kind {
23921 SyntaxKind::ParamIdent => {
23922 Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23923 }
23924 SyntaxKind::ParamExpr => {
23925 Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23926 }
23927 SyntaxKind::MacroParamKindMissing => {
23928 Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23929 }
23930 _ => None,
23931 }
23932 }
23933 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23934 match self {
23935 MacroParamKind::Identifier(x) => x.as_syntax_node(),
23936 MacroParamKind::Expr(x) => x.as_syntax_node(),
23937 MacroParamKind::Missing(x) => x.as_syntax_node(),
23938 }
23939 }
23940 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23941 MacroParamKindPtr(self.as_syntax_node().long(db).stable_ptr)
23942 }
23943}
23944impl<'db> MacroParamKind<'db> {
23945 pub fn is_variant(kind: SyntaxKind) -> bool {
23947 matches!(
23948 kind,
23949 SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23950 )
23951 }
23952}
23953#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23954pub struct MacroParamKindMissing<'db> {
23955 node: SyntaxNode<'db>,
23956}
23957impl<'db> MacroParamKindMissing<'db> {
23958 pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23959 let children = [];
23960 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23961 MacroParamKindMissingGreen(
23962 GreenNode {
23963 kind: SyntaxKind::MacroParamKindMissing,
23964 details: GreenNodeDetails::Node { children: children.into(), width },
23965 }
23966 .intern(db),
23967 )
23968 }
23969}
23970impl<'db> MacroParamKindMissing<'db> {}
23971#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23972pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23973impl<'db> MacroParamKindMissingPtr<'db> {}
23974impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23975 type SyntaxNode = MacroParamKindMissing<'db>;
23976 fn untyped(self) -> SyntaxStablePtrId<'db> {
23977 self.0
23978 }
23979 fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23980 MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23981 }
23982}
23983impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23984 fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23985 ptr.untyped()
23986 }
23987}
23988#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23989pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23990impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23991 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23992 type StablePtr = MacroParamKindMissingPtr<'db>;
23993 type Green = MacroParamKindMissingGreen<'db>;
23994 fn missing(db: &'db dyn Database) -> Self::Green {
23995 MacroParamKindMissingGreen(
23996 GreenNode {
23997 kind: SyntaxKind::MacroParamKindMissing,
23998 details: GreenNodeDetails::Node {
23999 children: [].into(),
24000 width: TextWidth::default(),
24001 },
24002 }
24003 .intern(db),
24004 )
24005 }
24006 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24007 let kind = node.kind(db);
24008 assert_eq!(
24009 kind,
24010 SyntaxKind::MacroParamKindMissing,
24011 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24012 kind,
24013 SyntaxKind::MacroParamKindMissing
24014 );
24015 Self { node }
24016 }
24017 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24018 let kind = node.kind(db);
24019 if kind == SyntaxKind::MacroParamKindMissing {
24020 Some(Self::from_syntax_node(db, node))
24021 } else {
24022 None
24023 }
24024 }
24025 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24026 self.node
24027 }
24028 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24029 MacroParamKindMissingPtr(self.node.stable_ptr(db))
24030 }
24031}
24032#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24033pub enum MacroElement<'db> {
24034 Token(TokenTreeLeaf<'db>),
24035 Param(MacroParam<'db>),
24036 Subtree(MacroWrapper<'db>),
24037 Repetition(MacroRepetition<'db>),
24038}
24039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24040pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
24041impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
24042 type SyntaxNode = MacroElement<'db>;
24043 fn untyped(self) -> SyntaxStablePtrId<'db> {
24044 self.0
24045 }
24046 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24047 MacroElement::from_syntax_node(db, self.0.lookup(db))
24048 }
24049}
24050impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
24051 fn from(ptr: MacroElementPtr<'db>) -> Self {
24052 ptr.untyped()
24053 }
24054}
24055impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
24056 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
24057 Self(value.0)
24058 }
24059}
24060impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
24061 fn from(value: MacroParamPtr<'db>) -> Self {
24062 Self(value.0)
24063 }
24064}
24065impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
24066 fn from(value: MacroWrapperPtr<'db>) -> Self {
24067 Self(value.0)
24068 }
24069}
24070impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
24071 fn from(value: MacroRepetitionPtr<'db>) -> Self {
24072 Self(value.0)
24073 }
24074}
24075impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
24076 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
24077 Self(value.0)
24078 }
24079}
24080impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
24081 fn from(value: MacroParamGreen<'db>) -> Self {
24082 Self(value.0)
24083 }
24084}
24085impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
24086 fn from(value: MacroWrapperGreen<'db>) -> Self {
24087 Self(value.0)
24088 }
24089}
24090impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
24091 fn from(value: MacroRepetitionGreen<'db>) -> Self {
24092 Self(value.0)
24093 }
24094}
24095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24096pub struct MacroElementGreen<'db>(pub GreenId<'db>);
24097impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
24098 const OPTIONAL_KIND: Option<SyntaxKind> = None;
24099 type StablePtr = MacroElementPtr<'db>;
24100 type Green = MacroElementGreen<'db>;
24101 fn missing(db: &'db dyn Database) -> Self::Green {
24102 panic!("No missing variant.");
24103 }
24104 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24105 let kind = node.kind(db);
24106 match kind {
24107 SyntaxKind::TokenTreeLeaf => {
24108 MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
24109 }
24110 SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
24111 SyntaxKind::MacroWrapper => {
24112 MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
24113 }
24114 SyntaxKind::MacroRepetition => {
24115 MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
24116 }
24117 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
24118 }
24119 }
24120 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24121 let kind = node.kind(db);
24122 match kind {
24123 SyntaxKind::TokenTreeLeaf => {
24124 Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
24125 }
24126 SyntaxKind::MacroParam => {
24127 Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
24128 }
24129 SyntaxKind::MacroWrapper => {
24130 Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
24131 }
24132 SyntaxKind::MacroRepetition => {
24133 Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
24134 }
24135 _ => None,
24136 }
24137 }
24138 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24139 match self {
24140 MacroElement::Token(x) => x.as_syntax_node(),
24141 MacroElement::Param(x) => x.as_syntax_node(),
24142 MacroElement::Subtree(x) => x.as_syntax_node(),
24143 MacroElement::Repetition(x) => x.as_syntax_node(),
24144 }
24145 }
24146 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24147 MacroElementPtr(self.as_syntax_node().long(db).stable_ptr)
24148 }
24149}
24150impl<'db> MacroElement<'db> {
24151 pub fn is_variant(kind: SyntaxKind) -> bool {
24153 matches!(
24154 kind,
24155 SyntaxKind::TokenTreeLeaf
24156 | SyntaxKind::MacroParam
24157 | SyntaxKind::MacroWrapper
24158 | SyntaxKind::MacroRepetition
24159 )
24160 }
24161}
24162#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24163pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
24164impl<'db> Deref for MacroElements<'db> {
24165 type Target = ElementList<'db, MacroElement<'db>, 1>;
24166 fn deref(&self) -> &Self::Target {
24167 &self.0
24168 }
24169}
24170impl<'db> MacroElements<'db> {
24171 pub fn new_green(
24172 db: &'db dyn Database,
24173 children: &[MacroElementGreen<'db>],
24174 ) -> MacroElementsGreen<'db> {
24175 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
24176 MacroElementsGreen(
24177 GreenNode {
24178 kind: SyntaxKind::MacroElements,
24179 details: GreenNodeDetails::Node {
24180 children: children.iter().map(|x| x.0).collect(),
24181 width,
24182 },
24183 }
24184 .intern(db),
24185 )
24186 }
24187}
24188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24189pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
24190impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
24191 type SyntaxNode = MacroElements<'db>;
24192 fn untyped(self) -> SyntaxStablePtrId<'db> {
24193 self.0
24194 }
24195 fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
24196 MacroElements::from_syntax_node(db, self.0.lookup(db))
24197 }
24198}
24199impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
24200 fn from(ptr: MacroElementsPtr<'db>) -> Self {
24201 ptr.untyped()
24202 }
24203}
24204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24205pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
24206impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
24207 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
24208 type StablePtr = MacroElementsPtr<'db>;
24209 type Green = MacroElementsGreen<'db>;
24210 fn missing(db: &'db dyn Database) -> Self::Green {
24211 MacroElementsGreen(
24212 GreenNode {
24213 kind: SyntaxKind::MacroElements,
24214 details: GreenNodeDetails::Node {
24215 children: [].into(),
24216 width: TextWidth::default(),
24217 },
24218 }
24219 .intern(db),
24220 )
24221 }
24222 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24223 Self(ElementList::new(node))
24224 }
24225 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24226 if node.kind(db) == SyntaxKind::MacroElements {
24227 Some(Self(ElementList::new(node)))
24228 } else {
24229 None
24230 }
24231 }
24232 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24233 self.node
24234 }
24235 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24236 MacroElementsPtr(self.node.stable_ptr(db))
24237 }
24238}
24239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24240pub struct MacroWrapper<'db> {
24241 node: SyntaxNode<'db>,
24242}
24243impl<'db> MacroWrapper<'db> {
24244 pub const INDEX_SUBTREE: usize = 0;
24245 pub fn new_green(
24246 db: &'db dyn Database,
24247 subtree: WrappedMacroGreen<'db>,
24248 ) -> MacroWrapperGreen<'db> {
24249 let children = [subtree.0];
24250 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24251 MacroWrapperGreen(
24252 GreenNode {
24253 kind: SyntaxKind::MacroWrapper,
24254 details: GreenNodeDetails::Node { children: children.into(), width },
24255 }
24256 .intern(db),
24257 )
24258 }
24259}
24260impl<'db> MacroWrapper<'db> {
24261 pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
24262 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
24263 }
24264}
24265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24266pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
24267impl<'db> MacroWrapperPtr<'db> {}
24268impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
24269 type SyntaxNode = MacroWrapper<'db>;
24270 fn untyped(self) -> SyntaxStablePtrId<'db> {
24271 self.0
24272 }
24273 fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
24274 MacroWrapper::from_syntax_node(db, self.0.lookup(db))
24275 }
24276}
24277impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
24278 fn from(ptr: MacroWrapperPtr<'db>) -> Self {
24279 ptr.untyped()
24280 }
24281}
24282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24283pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
24284impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
24285 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
24286 type StablePtr = MacroWrapperPtr<'db>;
24287 type Green = MacroWrapperGreen<'db>;
24288 fn missing(db: &'db dyn Database) -> Self::Green {
24289 MacroWrapperGreen(
24290 GreenNode {
24291 kind: SyntaxKind::MacroWrapper,
24292 details: GreenNodeDetails::Node {
24293 children: [WrappedMacro::missing(db).0].into(),
24294 width: TextWidth::default(),
24295 },
24296 }
24297 .intern(db),
24298 )
24299 }
24300 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24301 let kind = node.kind(db);
24302 assert_eq!(
24303 kind,
24304 SyntaxKind::MacroWrapper,
24305 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24306 kind,
24307 SyntaxKind::MacroWrapper
24308 );
24309 Self { node }
24310 }
24311 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24312 let kind = node.kind(db);
24313 if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
24314 }
24315 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24316 self.node
24317 }
24318 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24319 MacroWrapperPtr(self.node.stable_ptr(db))
24320 }
24321}
24322#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24323pub enum WrappedMacro<'db> {
24324 Parenthesized(ParenthesizedMacro<'db>),
24325 Braced(BracedMacro<'db>),
24326 Bracketed(BracketedMacro<'db>),
24327}
24328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24329pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24330impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
24331 type SyntaxNode = WrappedMacro<'db>;
24332 fn untyped(self) -> SyntaxStablePtrId<'db> {
24333 self.0
24334 }
24335 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24336 WrappedMacro::from_syntax_node(db, self.0.lookup(db))
24337 }
24338}
24339impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24340 fn from(ptr: WrappedMacroPtr<'db>) -> Self {
24341 ptr.untyped()
24342 }
24343}
24344impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24345 fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
24346 Self(value.0)
24347 }
24348}
24349impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24350 fn from(value: BracedMacroPtr<'db>) -> Self {
24351 Self(value.0)
24352 }
24353}
24354impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24355 fn from(value: BracketedMacroPtr<'db>) -> Self {
24356 Self(value.0)
24357 }
24358}
24359impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24360 fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
24361 Self(value.0)
24362 }
24363}
24364impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24365 fn from(value: BracedMacroGreen<'db>) -> Self {
24366 Self(value.0)
24367 }
24368}
24369impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24370 fn from(value: BracketedMacroGreen<'db>) -> Self {
24371 Self(value.0)
24372 }
24373}
24374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24375pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
24376impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
24377 const OPTIONAL_KIND: Option<SyntaxKind> = None;
24378 type StablePtr = WrappedMacroPtr<'db>;
24379 type Green = WrappedMacroGreen<'db>;
24380 fn missing(db: &'db dyn Database) -> Self::Green {
24381 panic!("No missing variant.");
24382 }
24383 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24384 let kind = node.kind(db);
24385 match kind {
24386 SyntaxKind::ParenthesizedMacro => {
24387 WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
24388 }
24389 SyntaxKind::BracedMacro => {
24390 WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
24391 }
24392 SyntaxKind::BracketedMacro => {
24393 WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24394 }
24395 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24396 }
24397 }
24398 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24399 let kind = node.kind(db);
24400 match kind {
24401 SyntaxKind::ParenthesizedMacro => {
24402 Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24403 }
24404 SyntaxKind::BracedMacro => {
24405 Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24406 }
24407 SyntaxKind::BracketedMacro => {
24408 Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24409 }
24410 _ => None,
24411 }
24412 }
24413 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24414 match self {
24415 WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24416 WrappedMacro::Braced(x) => x.as_syntax_node(),
24417 WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24418 }
24419 }
24420 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24421 WrappedMacroPtr(self.as_syntax_node().long(db).stable_ptr)
24422 }
24423}
24424impl<'db> WrappedMacro<'db> {
24425 pub fn is_variant(kind: SyntaxKind) -> bool {
24427 matches!(
24428 kind,
24429 SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24430 )
24431 }
24432}
24433#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24434pub struct ParenthesizedMacro<'db> {
24435 node: SyntaxNode<'db>,
24436}
24437impl<'db> ParenthesizedMacro<'db> {
24438 pub const INDEX_LPAREN: usize = 0;
24439 pub const INDEX_ELEMENTS: usize = 1;
24440 pub const INDEX_RPAREN: usize = 2;
24441 pub fn new_green(
24442 db: &'db dyn Database,
24443 lparen: TerminalLParenGreen<'db>,
24444 elements: MacroElementsGreen<'db>,
24445 rparen: TerminalRParenGreen<'db>,
24446 ) -> ParenthesizedMacroGreen<'db> {
24447 let children = [lparen.0, elements.0, rparen.0];
24448 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24449 ParenthesizedMacroGreen(
24450 GreenNode {
24451 kind: SyntaxKind::ParenthesizedMacro,
24452 details: GreenNodeDetails::Node { children: children.into(), width },
24453 }
24454 .intern(db),
24455 )
24456 }
24457}
24458impl<'db> ParenthesizedMacro<'db> {
24459 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24460 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24461 }
24462 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24463 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24464 }
24465 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24466 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24467 }
24468}
24469#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24470pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24471impl<'db> ParenthesizedMacroPtr<'db> {}
24472impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24473 type SyntaxNode = ParenthesizedMacro<'db>;
24474 fn untyped(self) -> SyntaxStablePtrId<'db> {
24475 self.0
24476 }
24477 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24478 ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24479 }
24480}
24481impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24482 fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24483 ptr.untyped()
24484 }
24485}
24486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24487pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24488impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24489 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24490 type StablePtr = ParenthesizedMacroPtr<'db>;
24491 type Green = ParenthesizedMacroGreen<'db>;
24492 fn missing(db: &'db dyn Database) -> Self::Green {
24493 ParenthesizedMacroGreen(
24494 GreenNode {
24495 kind: SyntaxKind::ParenthesizedMacro,
24496 details: GreenNodeDetails::Node {
24497 children: [
24498 TerminalLParen::missing(db).0,
24499 MacroElements::missing(db).0,
24500 TerminalRParen::missing(db).0,
24501 ]
24502 .into(),
24503 width: TextWidth::default(),
24504 },
24505 }
24506 .intern(db),
24507 )
24508 }
24509 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24510 let kind = node.kind(db);
24511 assert_eq!(
24512 kind,
24513 SyntaxKind::ParenthesizedMacro,
24514 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24515 kind,
24516 SyntaxKind::ParenthesizedMacro
24517 );
24518 Self { node }
24519 }
24520 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24521 let kind = node.kind(db);
24522 if kind == SyntaxKind::ParenthesizedMacro {
24523 Some(Self::from_syntax_node(db, node))
24524 } else {
24525 None
24526 }
24527 }
24528 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24529 self.node
24530 }
24531 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24532 ParenthesizedMacroPtr(self.node.stable_ptr(db))
24533 }
24534}
24535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24536pub struct BracedMacro<'db> {
24537 node: SyntaxNode<'db>,
24538}
24539impl<'db> BracedMacro<'db> {
24540 pub const INDEX_LBRACE: usize = 0;
24541 pub const INDEX_ELEMENTS: usize = 1;
24542 pub const INDEX_RBRACE: usize = 2;
24543 pub fn new_green(
24544 db: &'db dyn Database,
24545 lbrace: TerminalLBraceGreen<'db>,
24546 elements: MacroElementsGreen<'db>,
24547 rbrace: TerminalRBraceGreen<'db>,
24548 ) -> BracedMacroGreen<'db> {
24549 let children = [lbrace.0, elements.0, rbrace.0];
24550 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24551 BracedMacroGreen(
24552 GreenNode {
24553 kind: SyntaxKind::BracedMacro,
24554 details: GreenNodeDetails::Node { children: children.into(), width },
24555 }
24556 .intern(db),
24557 )
24558 }
24559}
24560impl<'db> BracedMacro<'db> {
24561 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24562 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24563 }
24564 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24565 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24566 }
24567 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24568 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24569 }
24570}
24571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24572pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24573impl<'db> BracedMacroPtr<'db> {}
24574impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24575 type SyntaxNode = BracedMacro<'db>;
24576 fn untyped(self) -> SyntaxStablePtrId<'db> {
24577 self.0
24578 }
24579 fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24580 BracedMacro::from_syntax_node(db, self.0.lookup(db))
24581 }
24582}
24583impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24584 fn from(ptr: BracedMacroPtr<'db>) -> Self {
24585 ptr.untyped()
24586 }
24587}
24588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24589pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24590impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24591 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24592 type StablePtr = BracedMacroPtr<'db>;
24593 type Green = BracedMacroGreen<'db>;
24594 fn missing(db: &'db dyn Database) -> Self::Green {
24595 BracedMacroGreen(
24596 GreenNode {
24597 kind: SyntaxKind::BracedMacro,
24598 details: GreenNodeDetails::Node {
24599 children: [
24600 TerminalLBrace::missing(db).0,
24601 MacroElements::missing(db).0,
24602 TerminalRBrace::missing(db).0,
24603 ]
24604 .into(),
24605 width: TextWidth::default(),
24606 },
24607 }
24608 .intern(db),
24609 )
24610 }
24611 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24612 let kind = node.kind(db);
24613 assert_eq!(
24614 kind,
24615 SyntaxKind::BracedMacro,
24616 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24617 kind,
24618 SyntaxKind::BracedMacro
24619 );
24620 Self { node }
24621 }
24622 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24623 let kind = node.kind(db);
24624 if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24625 }
24626 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24627 self.node
24628 }
24629 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24630 BracedMacroPtr(self.node.stable_ptr(db))
24631 }
24632}
24633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24634pub struct BracketedMacro<'db> {
24635 node: SyntaxNode<'db>,
24636}
24637impl<'db> BracketedMacro<'db> {
24638 pub const INDEX_LBRACK: usize = 0;
24639 pub const INDEX_ELEMENTS: usize = 1;
24640 pub const INDEX_RBRACK: usize = 2;
24641 pub fn new_green(
24642 db: &'db dyn Database,
24643 lbrack: TerminalLBrackGreen<'db>,
24644 elements: MacroElementsGreen<'db>,
24645 rbrack: TerminalRBrackGreen<'db>,
24646 ) -> BracketedMacroGreen<'db> {
24647 let children = [lbrack.0, elements.0, rbrack.0];
24648 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24649 BracketedMacroGreen(
24650 GreenNode {
24651 kind: SyntaxKind::BracketedMacro,
24652 details: GreenNodeDetails::Node { children: children.into(), width },
24653 }
24654 .intern(db),
24655 )
24656 }
24657}
24658impl<'db> BracketedMacro<'db> {
24659 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24660 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24661 }
24662 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24663 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24664 }
24665 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24666 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24667 }
24668}
24669#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24670pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24671impl<'db> BracketedMacroPtr<'db> {}
24672impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24673 type SyntaxNode = BracketedMacro<'db>;
24674 fn untyped(self) -> SyntaxStablePtrId<'db> {
24675 self.0
24676 }
24677 fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24678 BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24679 }
24680}
24681impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24682 fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24683 ptr.untyped()
24684 }
24685}
24686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24687pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24688impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24689 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24690 type StablePtr = BracketedMacroPtr<'db>;
24691 type Green = BracketedMacroGreen<'db>;
24692 fn missing(db: &'db dyn Database) -> Self::Green {
24693 BracketedMacroGreen(
24694 GreenNode {
24695 kind: SyntaxKind::BracketedMacro,
24696 details: GreenNodeDetails::Node {
24697 children: [
24698 TerminalLBrack::missing(db).0,
24699 MacroElements::missing(db).0,
24700 TerminalRBrack::missing(db).0,
24701 ]
24702 .into(),
24703 width: TextWidth::default(),
24704 },
24705 }
24706 .intern(db),
24707 )
24708 }
24709 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24710 let kind = node.kind(db);
24711 assert_eq!(
24712 kind,
24713 SyntaxKind::BracketedMacro,
24714 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24715 kind,
24716 SyntaxKind::BracketedMacro
24717 );
24718 Self { node }
24719 }
24720 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24721 let kind = node.kind(db);
24722 if kind == SyntaxKind::BracketedMacro {
24723 Some(Self::from_syntax_node(db, node))
24724 } else {
24725 None
24726 }
24727 }
24728 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24729 self.node
24730 }
24731 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24732 BracketedMacroPtr(self.node.stable_ptr(db))
24733 }
24734}
24735#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24736pub struct LegacyExprInlineMacro<'db> {
24737 node: SyntaxNode<'db>,
24738}
24739impl<'db> LegacyExprInlineMacro<'db> {
24740 pub const INDEX_PATH: usize = 0;
24741 pub const INDEX_BANG: usize = 1;
24742 pub const INDEX_ARGUMENTS: usize = 2;
24743 pub fn new_green(
24744 db: &'db dyn Database,
24745 path: ExprPathGreen<'db>,
24746 bang: TerminalNotGreen<'db>,
24747 arguments: WrappedArgListGreen<'db>,
24748 ) -> LegacyExprInlineMacroGreen<'db> {
24749 let children = [path.0, bang.0, arguments.0];
24750 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24751 LegacyExprInlineMacroGreen(
24752 GreenNode {
24753 kind: SyntaxKind::LegacyExprInlineMacro,
24754 details: GreenNodeDetails::Node { children: children.into(), width },
24755 }
24756 .intern(db),
24757 )
24758 }
24759}
24760impl<'db> LegacyExprInlineMacro<'db> {
24761 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24762 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24763 }
24764 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24765 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24766 }
24767 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24768 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24769 }
24770}
24771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24772pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24773impl<'db> LegacyExprInlineMacroPtr<'db> {}
24774impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24775 type SyntaxNode = LegacyExprInlineMacro<'db>;
24776 fn untyped(self) -> SyntaxStablePtrId<'db> {
24777 self.0
24778 }
24779 fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24780 LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24781 }
24782}
24783impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24784 fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24785 ptr.untyped()
24786 }
24787}
24788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24789pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24790impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24791 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24792 type StablePtr = LegacyExprInlineMacroPtr<'db>;
24793 type Green = LegacyExprInlineMacroGreen<'db>;
24794 fn missing(db: &'db dyn Database) -> Self::Green {
24795 LegacyExprInlineMacroGreen(
24796 GreenNode {
24797 kind: SyntaxKind::LegacyExprInlineMacro,
24798 details: GreenNodeDetails::Node {
24799 children: [
24800 ExprPath::missing(db).0,
24801 TerminalNot::missing(db).0,
24802 WrappedArgList::missing(db).0,
24803 ]
24804 .into(),
24805 width: TextWidth::default(),
24806 },
24807 }
24808 .intern(db),
24809 )
24810 }
24811 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24812 let kind = node.kind(db);
24813 assert_eq!(
24814 kind,
24815 SyntaxKind::LegacyExprInlineMacro,
24816 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24817 kind,
24818 SyntaxKind::LegacyExprInlineMacro
24819 );
24820 Self { node }
24821 }
24822 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24823 let kind = node.kind(db);
24824 if kind == SyntaxKind::LegacyExprInlineMacro {
24825 Some(Self::from_syntax_node(db, node))
24826 } else {
24827 None
24828 }
24829 }
24830 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24831 self.node
24832 }
24833 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24834 LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24835 }
24836}
24837#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24838pub struct LegacyItemInlineMacro<'db> {
24839 node: SyntaxNode<'db>,
24840}
24841impl<'db> LegacyItemInlineMacro<'db> {
24842 pub const INDEX_ATTRIBUTES: usize = 0;
24843 pub const INDEX_PATH: usize = 1;
24844 pub const INDEX_BANG: usize = 2;
24845 pub const INDEX_ARGUMENTS: usize = 3;
24846 pub const INDEX_SEMICOLON: usize = 4;
24847 pub fn new_green(
24848 db: &'db dyn Database,
24849 attributes: AttributeListGreen<'db>,
24850 path: ExprPathGreen<'db>,
24851 bang: TerminalNotGreen<'db>,
24852 arguments: WrappedArgListGreen<'db>,
24853 semicolon: TerminalSemicolonGreen<'db>,
24854 ) -> LegacyItemInlineMacroGreen<'db> {
24855 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24856 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24857 LegacyItemInlineMacroGreen(
24858 GreenNode {
24859 kind: SyntaxKind::LegacyItemInlineMacro,
24860 details: GreenNodeDetails::Node { children: children.into(), width },
24861 }
24862 .intern(db),
24863 )
24864 }
24865}
24866impl<'db> LegacyItemInlineMacro<'db> {
24867 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24868 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24869 }
24870 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24871 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24872 }
24873 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24874 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24875 }
24876 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24877 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24878 }
24879 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24880 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24881 }
24882}
24883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24884pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24885impl<'db> LegacyItemInlineMacroPtr<'db> {}
24886impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24887 type SyntaxNode = LegacyItemInlineMacro<'db>;
24888 fn untyped(self) -> SyntaxStablePtrId<'db> {
24889 self.0
24890 }
24891 fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24892 LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24893 }
24894}
24895impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24896 fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24897 ptr.untyped()
24898 }
24899}
24900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24901pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24902impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24903 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24904 type StablePtr = LegacyItemInlineMacroPtr<'db>;
24905 type Green = LegacyItemInlineMacroGreen<'db>;
24906 fn missing(db: &'db dyn Database) -> Self::Green {
24907 LegacyItemInlineMacroGreen(
24908 GreenNode {
24909 kind: SyntaxKind::LegacyItemInlineMacro,
24910 details: GreenNodeDetails::Node {
24911 children: [
24912 AttributeList::missing(db).0,
24913 ExprPath::missing(db).0,
24914 TerminalNot::missing(db).0,
24915 WrappedArgList::missing(db).0,
24916 TerminalSemicolon::missing(db).0,
24917 ]
24918 .into(),
24919 width: TextWidth::default(),
24920 },
24921 }
24922 .intern(db),
24923 )
24924 }
24925 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24926 let kind = node.kind(db);
24927 assert_eq!(
24928 kind,
24929 SyntaxKind::LegacyItemInlineMacro,
24930 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24931 kind,
24932 SyntaxKind::LegacyItemInlineMacro
24933 );
24934 Self { node }
24935 }
24936 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24937 let kind = node.kind(db);
24938 if kind == SyntaxKind::LegacyItemInlineMacro {
24939 Some(Self::from_syntax_node(db, node))
24940 } else {
24941 None
24942 }
24943 }
24944 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24945 self.node
24946 }
24947 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24948 LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24949 }
24950}
24951#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24952pub struct TriviumSkippedNode<'db> {
24953 node: SyntaxNode<'db>,
24954}
24955impl<'db> TriviumSkippedNode<'db> {
24956 pub const INDEX_NODE: usize = 0;
24957 pub fn new_green(
24958 db: &'db dyn Database,
24959 node: SkippedNodeGreen<'db>,
24960 ) -> TriviumSkippedNodeGreen<'db> {
24961 let children = [node.0];
24962 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24963 TriviumSkippedNodeGreen(
24964 GreenNode {
24965 kind: SyntaxKind::TriviumSkippedNode,
24966 details: GreenNodeDetails::Node { children: children.into(), width },
24967 }
24968 .intern(db),
24969 )
24970 }
24971}
24972impl<'db> TriviumSkippedNode<'db> {
24973 pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24974 SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24975 }
24976}
24977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24978pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24979impl<'db> TriviumSkippedNodePtr<'db> {}
24980impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24981 type SyntaxNode = TriviumSkippedNode<'db>;
24982 fn untyped(self) -> SyntaxStablePtrId<'db> {
24983 self.0
24984 }
24985 fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24986 TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24987 }
24988}
24989impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24990 fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24991 ptr.untyped()
24992 }
24993}
24994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24995pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24996impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24997 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24998 type StablePtr = TriviumSkippedNodePtr<'db>;
24999 type Green = TriviumSkippedNodeGreen<'db>;
25000 fn missing(db: &'db dyn Database) -> Self::Green {
25001 TriviumSkippedNodeGreen(
25002 GreenNode {
25003 kind: SyntaxKind::TriviumSkippedNode,
25004 details: GreenNodeDetails::Node {
25005 children: [SkippedNode::missing(db).0].into(),
25006 width: TextWidth::default(),
25007 },
25008 }
25009 .intern(db),
25010 )
25011 }
25012 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25013 let kind = node.kind(db);
25014 assert_eq!(
25015 kind,
25016 SyntaxKind::TriviumSkippedNode,
25017 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25018 kind,
25019 SyntaxKind::TriviumSkippedNode
25020 );
25021 Self { node }
25022 }
25023 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25024 let kind = node.kind(db);
25025 if kind == SyntaxKind::TriviumSkippedNode {
25026 Some(Self::from_syntax_node(db, node))
25027 } else {
25028 None
25029 }
25030 }
25031 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25032 self.node
25033 }
25034 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25035 TriviumSkippedNodePtr(self.node.stable_ptr(db))
25036 }
25037}
25038#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25039pub enum SkippedNode<'db> {
25040 AttributeList(AttributeList<'db>),
25041 VisibilityPub(VisibilityPub<'db>),
25042 ExprPath(ExprPath<'db>),
25043}
25044#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25045pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
25046impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
25047 type SyntaxNode = SkippedNode<'db>;
25048 fn untyped(self) -> SyntaxStablePtrId<'db> {
25049 self.0
25050 }
25051 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
25052 SkippedNode::from_syntax_node(db, self.0.lookup(db))
25053 }
25054}
25055impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
25056 fn from(ptr: SkippedNodePtr<'db>) -> Self {
25057 ptr.untyped()
25058 }
25059}
25060impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
25061 fn from(value: AttributeListPtr<'db>) -> Self {
25062 Self(value.0)
25063 }
25064}
25065impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
25066 fn from(value: VisibilityPubPtr<'db>) -> Self {
25067 Self(value.0)
25068 }
25069}
25070impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
25071 fn from(value: ExprPathPtr<'db>) -> Self {
25072 Self(value.0)
25073 }
25074}
25075impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
25076 fn from(value: AttributeListGreen<'db>) -> Self {
25077 Self(value.0)
25078 }
25079}
25080impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
25081 fn from(value: VisibilityPubGreen<'db>) -> Self {
25082 Self(value.0)
25083 }
25084}
25085impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
25086 fn from(value: ExprPathGreen<'db>) -> Self {
25087 Self(value.0)
25088 }
25089}
25090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25091pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
25092impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
25093 const OPTIONAL_KIND: Option<SyntaxKind> = None;
25094 type StablePtr = SkippedNodePtr<'db>;
25095 type Green = SkippedNodeGreen<'db>;
25096 fn missing(db: &'db dyn Database) -> Self::Green {
25097 panic!("No missing variant.");
25098 }
25099 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25100 let kind = node.kind(db);
25101 match kind {
25102 SyntaxKind::AttributeList => {
25103 SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
25104 }
25105 SyntaxKind::VisibilityPub => {
25106 SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
25107 }
25108 SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
25109 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
25110 }
25111 }
25112 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25113 let kind = node.kind(db);
25114 match kind {
25115 SyntaxKind::AttributeList => {
25116 Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
25117 }
25118 SyntaxKind::VisibilityPub => {
25119 Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
25120 }
25121 SyntaxKind::ExprPath => {
25122 Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
25123 }
25124 _ => None,
25125 }
25126 }
25127 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25128 match self {
25129 SkippedNode::AttributeList(x) => x.as_syntax_node(),
25130 SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
25131 SkippedNode::ExprPath(x) => x.as_syntax_node(),
25132 }
25133 }
25134 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25135 SkippedNodePtr(self.as_syntax_node().long(db).stable_ptr)
25136 }
25137}
25138impl<'db> SkippedNode<'db> {
25139 pub fn is_variant(kind: SyntaxKind) -> bool {
25141 matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
25142 }
25143}
25144#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25145pub struct TokenIdentifier<'db> {
25146 node: SyntaxNode<'db>,
25147}
25148impl<'db> Token<'db> for TokenIdentifier<'db> {
25149 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25150 TokenIdentifierGreen(
25151 GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
25152 .intern(db),
25153 )
25154 }
25155 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25156 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25157 }
25158}
25159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25160pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25161impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
25162 type SyntaxNode = TokenIdentifier<'db>;
25163 fn untyped(self) -> SyntaxStablePtrId<'db> {
25164 self.0
25165 }
25166 fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25167 TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
25168 }
25169}
25170impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25171 fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
25172 ptr.untyped()
25173 }
25174}
25175#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25176pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
25177impl<'db> TokenIdentifierGreen<'db> {
25178 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25179 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25180 }
25181}
25182impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
25183 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
25184 type StablePtr = TokenIdentifierPtr<'db>;
25185 type Green = TokenIdentifierGreen<'db>;
25186 fn missing(db: &'db dyn Database) -> Self::Green {
25187 TokenIdentifierGreen(
25188 GreenNode {
25189 kind: SyntaxKind::TokenMissing,
25190 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25191 }
25192 .intern(db),
25193 )
25194 }
25195 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25196 match node.long(db).green.long(db).details {
25197 GreenNodeDetails::Token(_) => Self { node },
25198 GreenNodeDetails::Node { .. } => {
25199 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
25200 }
25201 }
25202 }
25203 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25204 match node.long(db).green.long(db).details {
25205 GreenNodeDetails::Token(_) => Some(Self { node }),
25206 GreenNodeDetails::Node { .. } => None,
25207 }
25208 }
25209 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25210 self.node
25211 }
25212 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25213 TokenIdentifierPtr(self.node.stable_ptr(db))
25214 }
25215}
25216#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25217pub struct TerminalIdentifier<'db> {
25218 node: SyntaxNode<'db>,
25219}
25220impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
25221 const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
25222 type TokenType = TokenIdentifier<'db>;
25223 fn new_green(
25224 db: &'db dyn Database,
25225 leading_trivia: TriviaGreen<'db>,
25226 token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25227 trailing_trivia: TriviaGreen<'db>,
25228 ) -> Self::Green {
25229 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25230 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25231 TerminalIdentifierGreen(
25232 GreenNode {
25233 kind: SyntaxKind::TerminalIdentifier,
25234 details: GreenNodeDetails::Node { children: children.into(), width },
25235 }
25236 .intern(db),
25237 )
25238 }
25239 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25240 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25241 else {
25242 unreachable!("Expected a node, not a token");
25243 };
25244 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25245 }
25246}
25247impl<'db> TerminalIdentifier<'db> {
25248 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25249 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25250 }
25251 pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25252 TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
25253 }
25254 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25255 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25256 }
25257}
25258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25259pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25260impl<'db> TerminalIdentifierPtr<'db> {}
25261impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
25262 type SyntaxNode = TerminalIdentifier<'db>;
25263 fn untyped(self) -> SyntaxStablePtrId<'db> {
25264 self.0
25265 }
25266 fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
25267 TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
25268 }
25269}
25270impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25271 fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
25272 ptr.untyped()
25273 }
25274}
25275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25276pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
25277impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
25278 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
25279 type StablePtr = TerminalIdentifierPtr<'db>;
25280 type Green = TerminalIdentifierGreen<'db>;
25281 fn missing(db: &'db dyn Database) -> Self::Green {
25282 TerminalIdentifierGreen(
25283 GreenNode {
25284 kind: SyntaxKind::TerminalIdentifier,
25285 details: GreenNodeDetails::Node {
25286 children: [
25287 Trivia::missing(db).0,
25288 TokenIdentifier::missing(db).0,
25289 Trivia::missing(db).0,
25290 ]
25291 .into(),
25292 width: TextWidth::default(),
25293 },
25294 }
25295 .intern(db),
25296 )
25297 }
25298 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25299 let kind = node.kind(db);
25300 assert_eq!(
25301 kind,
25302 SyntaxKind::TerminalIdentifier,
25303 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25304 kind,
25305 SyntaxKind::TerminalIdentifier
25306 );
25307 Self { node }
25308 }
25309 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25310 let kind = node.kind(db);
25311 if kind == SyntaxKind::TerminalIdentifier {
25312 Some(Self::from_syntax_node(db, node))
25313 } else {
25314 None
25315 }
25316 }
25317 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25318 self.node
25319 }
25320 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25321 TerminalIdentifierPtr(self.node.stable_ptr(db))
25322 }
25323}
25324#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25325pub struct TokenLiteralNumber<'db> {
25326 node: SyntaxNode<'db>,
25327}
25328impl<'db> Token<'db> for TokenLiteralNumber<'db> {
25329 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25330 TokenLiteralNumberGreen(
25331 GreenNode {
25332 kind: SyntaxKind::TokenLiteralNumber,
25333 details: GreenNodeDetails::Token(text),
25334 }
25335 .intern(db),
25336 )
25337 }
25338 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25339 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25340 }
25341}
25342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25343pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25344impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
25345 type SyntaxNode = TokenLiteralNumber<'db>;
25346 fn untyped(self) -> SyntaxStablePtrId<'db> {
25347 self.0
25348 }
25349 fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25350 TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25351 }
25352}
25353impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25354 fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
25355 ptr.untyped()
25356 }
25357}
25358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25359pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
25360impl<'db> TokenLiteralNumberGreen<'db> {
25361 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25362 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25363 }
25364}
25365impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
25366 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
25367 type StablePtr = TokenLiteralNumberPtr<'db>;
25368 type Green = TokenLiteralNumberGreen<'db>;
25369 fn missing(db: &'db dyn Database) -> Self::Green {
25370 TokenLiteralNumberGreen(
25371 GreenNode {
25372 kind: SyntaxKind::TokenMissing,
25373 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25374 }
25375 .intern(db),
25376 )
25377 }
25378 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25379 match node.long(db).green.long(db).details {
25380 GreenNodeDetails::Token(_) => Self { node },
25381 GreenNodeDetails::Node { .. } => panic!(
25382 "Expected a token {:?}, not an internal node",
25383 SyntaxKind::TokenLiteralNumber
25384 ),
25385 }
25386 }
25387 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25388 match node.long(db).green.long(db).details {
25389 GreenNodeDetails::Token(_) => Some(Self { node }),
25390 GreenNodeDetails::Node { .. } => None,
25391 }
25392 }
25393 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25394 self.node
25395 }
25396 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25397 TokenLiteralNumberPtr(self.node.stable_ptr(db))
25398 }
25399}
25400#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25401pub struct TerminalLiteralNumber<'db> {
25402 node: SyntaxNode<'db>,
25403}
25404impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25405 const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25406 type TokenType = TokenLiteralNumber<'db>;
25407 fn new_green(
25408 db: &'db dyn Database,
25409 leading_trivia: TriviaGreen<'db>,
25410 token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25411 trailing_trivia: TriviaGreen<'db>,
25412 ) -> Self::Green {
25413 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25414 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25415 TerminalLiteralNumberGreen(
25416 GreenNode {
25417 kind: SyntaxKind::TerminalLiteralNumber,
25418 details: GreenNodeDetails::Node { children: children.into(), width },
25419 }
25420 .intern(db),
25421 )
25422 }
25423 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25424 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25425 else {
25426 unreachable!("Expected a node, not a token");
25427 };
25428 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25429 }
25430}
25431impl<'db> TerminalLiteralNumber<'db> {
25432 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25433 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25434 }
25435 pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25436 TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25437 }
25438 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25439 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25440 }
25441}
25442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25443pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25444impl<'db> TerminalLiteralNumberPtr<'db> {}
25445impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25446 type SyntaxNode = TerminalLiteralNumber<'db>;
25447 fn untyped(self) -> SyntaxStablePtrId<'db> {
25448 self.0
25449 }
25450 fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25451 TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25452 }
25453}
25454impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25455 fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25456 ptr.untyped()
25457 }
25458}
25459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25460pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25461impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25462 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25463 type StablePtr = TerminalLiteralNumberPtr<'db>;
25464 type Green = TerminalLiteralNumberGreen<'db>;
25465 fn missing(db: &'db dyn Database) -> Self::Green {
25466 TerminalLiteralNumberGreen(
25467 GreenNode {
25468 kind: SyntaxKind::TerminalLiteralNumber,
25469 details: GreenNodeDetails::Node {
25470 children: [
25471 Trivia::missing(db).0,
25472 TokenLiteralNumber::missing(db).0,
25473 Trivia::missing(db).0,
25474 ]
25475 .into(),
25476 width: TextWidth::default(),
25477 },
25478 }
25479 .intern(db),
25480 )
25481 }
25482 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25483 let kind = node.kind(db);
25484 assert_eq!(
25485 kind,
25486 SyntaxKind::TerminalLiteralNumber,
25487 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25488 kind,
25489 SyntaxKind::TerminalLiteralNumber
25490 );
25491 Self { node }
25492 }
25493 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25494 let kind = node.kind(db);
25495 if kind == SyntaxKind::TerminalLiteralNumber {
25496 Some(Self::from_syntax_node(db, node))
25497 } else {
25498 None
25499 }
25500 }
25501 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25502 self.node
25503 }
25504 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25505 TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25506 }
25507}
25508#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25509pub struct TokenShortString<'db> {
25510 node: SyntaxNode<'db>,
25511}
25512impl<'db> Token<'db> for TokenShortString<'db> {
25513 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25514 TokenShortStringGreen(
25515 GreenNode {
25516 kind: SyntaxKind::TokenShortString,
25517 details: GreenNodeDetails::Token(text),
25518 }
25519 .intern(db),
25520 )
25521 }
25522 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25523 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25524 }
25525}
25526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25527pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25528impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25529 type SyntaxNode = TokenShortString<'db>;
25530 fn untyped(self) -> SyntaxStablePtrId<'db> {
25531 self.0
25532 }
25533 fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25534 TokenShortString::from_syntax_node(db, self.0.lookup(db))
25535 }
25536}
25537impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25538 fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25539 ptr.untyped()
25540 }
25541}
25542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25543pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25544impl<'db> TokenShortStringGreen<'db> {
25545 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25546 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25547 }
25548}
25549impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25550 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25551 type StablePtr = TokenShortStringPtr<'db>;
25552 type Green = TokenShortStringGreen<'db>;
25553 fn missing(db: &'db dyn Database) -> Self::Green {
25554 TokenShortStringGreen(
25555 GreenNode {
25556 kind: SyntaxKind::TokenMissing,
25557 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25558 }
25559 .intern(db),
25560 )
25561 }
25562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25563 match node.long(db).green.long(db).details {
25564 GreenNodeDetails::Token(_) => Self { node },
25565 GreenNodeDetails::Node { .. } => {
25566 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25567 }
25568 }
25569 }
25570 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25571 match node.long(db).green.long(db).details {
25572 GreenNodeDetails::Token(_) => Some(Self { node }),
25573 GreenNodeDetails::Node { .. } => None,
25574 }
25575 }
25576 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25577 self.node
25578 }
25579 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25580 TokenShortStringPtr(self.node.stable_ptr(db))
25581 }
25582}
25583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25584pub struct TerminalShortString<'db> {
25585 node: SyntaxNode<'db>,
25586}
25587impl<'db> Terminal<'db> for TerminalShortString<'db> {
25588 const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25589 type TokenType = TokenShortString<'db>;
25590 fn new_green(
25591 db: &'db dyn Database,
25592 leading_trivia: TriviaGreen<'db>,
25593 token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25594 trailing_trivia: TriviaGreen<'db>,
25595 ) -> Self::Green {
25596 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25597 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25598 TerminalShortStringGreen(
25599 GreenNode {
25600 kind: SyntaxKind::TerminalShortString,
25601 details: GreenNodeDetails::Node { children: children.into(), width },
25602 }
25603 .intern(db),
25604 )
25605 }
25606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25607 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25608 else {
25609 unreachable!("Expected a node, not a token");
25610 };
25611 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25612 }
25613}
25614impl<'db> TerminalShortString<'db> {
25615 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25616 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25617 }
25618 pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25619 TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25620 }
25621 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25622 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25623 }
25624}
25625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25626pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25627impl<'db> TerminalShortStringPtr<'db> {}
25628impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25629 type SyntaxNode = TerminalShortString<'db>;
25630 fn untyped(self) -> SyntaxStablePtrId<'db> {
25631 self.0
25632 }
25633 fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25634 TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25635 }
25636}
25637impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25638 fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25639 ptr.untyped()
25640 }
25641}
25642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25643pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25644impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25645 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25646 type StablePtr = TerminalShortStringPtr<'db>;
25647 type Green = TerminalShortStringGreen<'db>;
25648 fn missing(db: &'db dyn Database) -> Self::Green {
25649 TerminalShortStringGreen(
25650 GreenNode {
25651 kind: SyntaxKind::TerminalShortString,
25652 details: GreenNodeDetails::Node {
25653 children: [
25654 Trivia::missing(db).0,
25655 TokenShortString::missing(db).0,
25656 Trivia::missing(db).0,
25657 ]
25658 .into(),
25659 width: TextWidth::default(),
25660 },
25661 }
25662 .intern(db),
25663 )
25664 }
25665 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25666 let kind = node.kind(db);
25667 assert_eq!(
25668 kind,
25669 SyntaxKind::TerminalShortString,
25670 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25671 kind,
25672 SyntaxKind::TerminalShortString
25673 );
25674 Self { node }
25675 }
25676 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25677 let kind = node.kind(db);
25678 if kind == SyntaxKind::TerminalShortString {
25679 Some(Self::from_syntax_node(db, node))
25680 } else {
25681 None
25682 }
25683 }
25684 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25685 self.node
25686 }
25687 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25688 TerminalShortStringPtr(self.node.stable_ptr(db))
25689 }
25690}
25691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25692pub struct TokenString<'db> {
25693 node: SyntaxNode<'db>,
25694}
25695impl<'db> Token<'db> for TokenString<'db> {
25696 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25697 TokenStringGreen(
25698 GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25699 .intern(db),
25700 )
25701 }
25702 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25703 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25704 }
25705}
25706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25707pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25708impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25709 type SyntaxNode = TokenString<'db>;
25710 fn untyped(self) -> SyntaxStablePtrId<'db> {
25711 self.0
25712 }
25713 fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25714 TokenString::from_syntax_node(db, self.0.lookup(db))
25715 }
25716}
25717impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25718 fn from(ptr: TokenStringPtr<'db>) -> Self {
25719 ptr.untyped()
25720 }
25721}
25722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25723pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25724impl<'db> TokenStringGreen<'db> {
25725 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25726 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25727 }
25728}
25729impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25730 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25731 type StablePtr = TokenStringPtr<'db>;
25732 type Green = TokenStringGreen<'db>;
25733 fn missing(db: &'db dyn Database) -> Self::Green {
25734 TokenStringGreen(
25735 GreenNode {
25736 kind: SyntaxKind::TokenMissing,
25737 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25738 }
25739 .intern(db),
25740 )
25741 }
25742 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25743 match node.long(db).green.long(db).details {
25744 GreenNodeDetails::Token(_) => Self { node },
25745 GreenNodeDetails::Node { .. } => {
25746 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25747 }
25748 }
25749 }
25750 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25751 match node.long(db).green.long(db).details {
25752 GreenNodeDetails::Token(_) => Some(Self { node }),
25753 GreenNodeDetails::Node { .. } => None,
25754 }
25755 }
25756 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25757 self.node
25758 }
25759 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25760 TokenStringPtr(self.node.stable_ptr(db))
25761 }
25762}
25763#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25764pub struct TerminalString<'db> {
25765 node: SyntaxNode<'db>,
25766}
25767impl<'db> Terminal<'db> for TerminalString<'db> {
25768 const KIND: SyntaxKind = SyntaxKind::TerminalString;
25769 type TokenType = TokenString<'db>;
25770 fn new_green(
25771 db: &'db dyn Database,
25772 leading_trivia: TriviaGreen<'db>,
25773 token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25774 trailing_trivia: TriviaGreen<'db>,
25775 ) -> Self::Green {
25776 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25777 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25778 TerminalStringGreen(
25779 GreenNode {
25780 kind: SyntaxKind::TerminalString,
25781 details: GreenNodeDetails::Node { children: children.into(), width },
25782 }
25783 .intern(db),
25784 )
25785 }
25786 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25787 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25788 else {
25789 unreachable!("Expected a node, not a token");
25790 };
25791 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25792 }
25793}
25794impl<'db> TerminalString<'db> {
25795 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25796 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25797 }
25798 pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25799 TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25800 }
25801 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25802 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25803 }
25804}
25805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25806pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25807impl<'db> TerminalStringPtr<'db> {}
25808impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25809 type SyntaxNode = TerminalString<'db>;
25810 fn untyped(self) -> SyntaxStablePtrId<'db> {
25811 self.0
25812 }
25813 fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25814 TerminalString::from_syntax_node(db, self.0.lookup(db))
25815 }
25816}
25817impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25818 fn from(ptr: TerminalStringPtr<'db>) -> Self {
25819 ptr.untyped()
25820 }
25821}
25822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25823pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25824impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25825 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25826 type StablePtr = TerminalStringPtr<'db>;
25827 type Green = TerminalStringGreen<'db>;
25828 fn missing(db: &'db dyn Database) -> Self::Green {
25829 TerminalStringGreen(
25830 GreenNode {
25831 kind: SyntaxKind::TerminalString,
25832 details: GreenNodeDetails::Node {
25833 children: [
25834 Trivia::missing(db).0,
25835 TokenString::missing(db).0,
25836 Trivia::missing(db).0,
25837 ]
25838 .into(),
25839 width: TextWidth::default(),
25840 },
25841 }
25842 .intern(db),
25843 )
25844 }
25845 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25846 let kind = node.kind(db);
25847 assert_eq!(
25848 kind,
25849 SyntaxKind::TerminalString,
25850 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25851 kind,
25852 SyntaxKind::TerminalString
25853 );
25854 Self { node }
25855 }
25856 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25857 let kind = node.kind(db);
25858 if kind == SyntaxKind::TerminalString {
25859 Some(Self::from_syntax_node(db, node))
25860 } else {
25861 None
25862 }
25863 }
25864 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25865 self.node
25866 }
25867 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25868 TerminalStringPtr(self.node.stable_ptr(db))
25869 }
25870}
25871#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25872pub struct TokenAs<'db> {
25873 node: SyntaxNode<'db>,
25874}
25875impl<'db> Token<'db> for TokenAs<'db> {
25876 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25877 TokenAsGreen(
25878 GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25879 .intern(db),
25880 )
25881 }
25882 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25883 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25884 }
25885}
25886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25887pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25888impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25889 type SyntaxNode = TokenAs<'db>;
25890 fn untyped(self) -> SyntaxStablePtrId<'db> {
25891 self.0
25892 }
25893 fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25894 TokenAs::from_syntax_node(db, self.0.lookup(db))
25895 }
25896}
25897impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25898 fn from(ptr: TokenAsPtr<'db>) -> Self {
25899 ptr.untyped()
25900 }
25901}
25902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25903pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25904impl<'db> TokenAsGreen<'db> {
25905 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25906 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25907 }
25908}
25909impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25910 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25911 type StablePtr = TokenAsPtr<'db>;
25912 type Green = TokenAsGreen<'db>;
25913 fn missing(db: &'db dyn Database) -> Self::Green {
25914 TokenAsGreen(
25915 GreenNode {
25916 kind: SyntaxKind::TokenMissing,
25917 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25918 }
25919 .intern(db),
25920 )
25921 }
25922 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25923 match node.long(db).green.long(db).details {
25924 GreenNodeDetails::Token(_) => Self { node },
25925 GreenNodeDetails::Node { .. } => {
25926 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25927 }
25928 }
25929 }
25930 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25931 match node.long(db).green.long(db).details {
25932 GreenNodeDetails::Token(_) => Some(Self { node }),
25933 GreenNodeDetails::Node { .. } => None,
25934 }
25935 }
25936 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25937 self.node
25938 }
25939 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25940 TokenAsPtr(self.node.stable_ptr(db))
25941 }
25942}
25943#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25944pub struct TerminalAs<'db> {
25945 node: SyntaxNode<'db>,
25946}
25947impl<'db> Terminal<'db> for TerminalAs<'db> {
25948 const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25949 type TokenType = TokenAs<'db>;
25950 fn new_green(
25951 db: &'db dyn Database,
25952 leading_trivia: TriviaGreen<'db>,
25953 token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25954 trailing_trivia: TriviaGreen<'db>,
25955 ) -> Self::Green {
25956 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25957 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25958 TerminalAsGreen(
25959 GreenNode {
25960 kind: SyntaxKind::TerminalAs,
25961 details: GreenNodeDetails::Node { children: children.into(), width },
25962 }
25963 .intern(db),
25964 )
25965 }
25966 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25967 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25968 else {
25969 unreachable!("Expected a node, not a token");
25970 };
25971 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25972 }
25973}
25974impl<'db> TerminalAs<'db> {
25975 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25976 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25977 }
25978 pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25979 TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25980 }
25981 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25982 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25983 }
25984}
25985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25986pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25987impl<'db> TerminalAsPtr<'db> {}
25988impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25989 type SyntaxNode = TerminalAs<'db>;
25990 fn untyped(self) -> SyntaxStablePtrId<'db> {
25991 self.0
25992 }
25993 fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25994 TerminalAs::from_syntax_node(db, self.0.lookup(db))
25995 }
25996}
25997impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25998 fn from(ptr: TerminalAsPtr<'db>) -> Self {
25999 ptr.untyped()
26000 }
26001}
26002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26003pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
26004impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
26005 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
26006 type StablePtr = TerminalAsPtr<'db>;
26007 type Green = TerminalAsGreen<'db>;
26008 fn missing(db: &'db dyn Database) -> Self::Green {
26009 TerminalAsGreen(
26010 GreenNode {
26011 kind: SyntaxKind::TerminalAs,
26012 details: GreenNodeDetails::Node {
26013 children: [
26014 Trivia::missing(db).0,
26015 TokenAs::missing(db).0,
26016 Trivia::missing(db).0,
26017 ]
26018 .into(),
26019 width: TextWidth::default(),
26020 },
26021 }
26022 .intern(db),
26023 )
26024 }
26025 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26026 let kind = node.kind(db);
26027 assert_eq!(
26028 kind,
26029 SyntaxKind::TerminalAs,
26030 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26031 kind,
26032 SyntaxKind::TerminalAs
26033 );
26034 Self { node }
26035 }
26036 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26037 let kind = node.kind(db);
26038 if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
26039 }
26040 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26041 self.node
26042 }
26043 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26044 TerminalAsPtr(self.node.stable_ptr(db))
26045 }
26046}
26047#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26048pub struct TokenConst<'db> {
26049 node: SyntaxNode<'db>,
26050}
26051impl<'db> Token<'db> for TokenConst<'db> {
26052 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26053 TokenConstGreen(
26054 GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
26055 .intern(db),
26056 )
26057 }
26058 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26059 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26060 }
26061}
26062#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26063pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26064impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
26065 type SyntaxNode = TokenConst<'db>;
26066 fn untyped(self) -> SyntaxStablePtrId<'db> {
26067 self.0
26068 }
26069 fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
26070 TokenConst::from_syntax_node(db, self.0.lookup(db))
26071 }
26072}
26073impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
26074 fn from(ptr: TokenConstPtr<'db>) -> Self {
26075 ptr.untyped()
26076 }
26077}
26078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26079pub struct TokenConstGreen<'db>(pub GreenId<'db>);
26080impl<'db> TokenConstGreen<'db> {
26081 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26082 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26083 }
26084}
26085impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
26086 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
26087 type StablePtr = TokenConstPtr<'db>;
26088 type Green = TokenConstGreen<'db>;
26089 fn missing(db: &'db dyn Database) -> Self::Green {
26090 TokenConstGreen(
26091 GreenNode {
26092 kind: SyntaxKind::TokenMissing,
26093 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26094 }
26095 .intern(db),
26096 )
26097 }
26098 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26099 match node.long(db).green.long(db).details {
26100 GreenNodeDetails::Token(_) => Self { node },
26101 GreenNodeDetails::Node { .. } => {
26102 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
26103 }
26104 }
26105 }
26106 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26107 match node.long(db).green.long(db).details {
26108 GreenNodeDetails::Token(_) => Some(Self { node }),
26109 GreenNodeDetails::Node { .. } => None,
26110 }
26111 }
26112 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26113 self.node
26114 }
26115 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26116 TokenConstPtr(self.node.stable_ptr(db))
26117 }
26118}
26119#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26120pub struct TerminalConst<'db> {
26121 node: SyntaxNode<'db>,
26122}
26123impl<'db> Terminal<'db> for TerminalConst<'db> {
26124 const KIND: SyntaxKind = SyntaxKind::TerminalConst;
26125 type TokenType = TokenConst<'db>;
26126 fn new_green(
26127 db: &'db dyn Database,
26128 leading_trivia: TriviaGreen<'db>,
26129 token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26130 trailing_trivia: TriviaGreen<'db>,
26131 ) -> Self::Green {
26132 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26133 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26134 TerminalConstGreen(
26135 GreenNode {
26136 kind: SyntaxKind::TerminalConst,
26137 details: GreenNodeDetails::Node { children: children.into(), width },
26138 }
26139 .intern(db),
26140 )
26141 }
26142 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26143 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26144 else {
26145 unreachable!("Expected a node, not a token");
26146 };
26147 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26148 }
26149}
26150impl<'db> TerminalConst<'db> {
26151 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26152 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26153 }
26154 pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
26155 TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
26156 }
26157 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26158 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26159 }
26160}
26161#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26162pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26163impl<'db> TerminalConstPtr<'db> {}
26164impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
26165 type SyntaxNode = TerminalConst<'db>;
26166 fn untyped(self) -> SyntaxStablePtrId<'db> {
26167 self.0
26168 }
26169 fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
26170 TerminalConst::from_syntax_node(db, self.0.lookup(db))
26171 }
26172}
26173impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
26174 fn from(ptr: TerminalConstPtr<'db>) -> Self {
26175 ptr.untyped()
26176 }
26177}
26178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26179pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
26180impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
26181 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
26182 type StablePtr = TerminalConstPtr<'db>;
26183 type Green = TerminalConstGreen<'db>;
26184 fn missing(db: &'db dyn Database) -> Self::Green {
26185 TerminalConstGreen(
26186 GreenNode {
26187 kind: SyntaxKind::TerminalConst,
26188 details: GreenNodeDetails::Node {
26189 children: [
26190 Trivia::missing(db).0,
26191 TokenConst::missing(db).0,
26192 Trivia::missing(db).0,
26193 ]
26194 .into(),
26195 width: TextWidth::default(),
26196 },
26197 }
26198 .intern(db),
26199 )
26200 }
26201 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26202 let kind = node.kind(db);
26203 assert_eq!(
26204 kind,
26205 SyntaxKind::TerminalConst,
26206 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26207 kind,
26208 SyntaxKind::TerminalConst
26209 );
26210 Self { node }
26211 }
26212 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26213 let kind = node.kind(db);
26214 if kind == SyntaxKind::TerminalConst {
26215 Some(Self::from_syntax_node(db, node))
26216 } else {
26217 None
26218 }
26219 }
26220 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26221 self.node
26222 }
26223 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26224 TerminalConstPtr(self.node.stable_ptr(db))
26225 }
26226}
26227#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26228pub struct TokenElse<'db> {
26229 node: SyntaxNode<'db>,
26230}
26231impl<'db> Token<'db> for TokenElse<'db> {
26232 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26233 TokenElseGreen(
26234 GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
26235 .intern(db),
26236 )
26237 }
26238 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26239 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26240 }
26241}
26242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26243pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26244impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
26245 type SyntaxNode = TokenElse<'db>;
26246 fn untyped(self) -> SyntaxStablePtrId<'db> {
26247 self.0
26248 }
26249 fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
26250 TokenElse::from_syntax_node(db, self.0.lookup(db))
26251 }
26252}
26253impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
26254 fn from(ptr: TokenElsePtr<'db>) -> Self {
26255 ptr.untyped()
26256 }
26257}
26258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26259pub struct TokenElseGreen<'db>(pub GreenId<'db>);
26260impl<'db> TokenElseGreen<'db> {
26261 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26262 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26263 }
26264}
26265impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
26266 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
26267 type StablePtr = TokenElsePtr<'db>;
26268 type Green = TokenElseGreen<'db>;
26269 fn missing(db: &'db dyn Database) -> Self::Green {
26270 TokenElseGreen(
26271 GreenNode {
26272 kind: SyntaxKind::TokenMissing,
26273 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26274 }
26275 .intern(db),
26276 )
26277 }
26278 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26279 match node.long(db).green.long(db).details {
26280 GreenNodeDetails::Token(_) => Self { node },
26281 GreenNodeDetails::Node { .. } => {
26282 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
26283 }
26284 }
26285 }
26286 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26287 match node.long(db).green.long(db).details {
26288 GreenNodeDetails::Token(_) => Some(Self { node }),
26289 GreenNodeDetails::Node { .. } => None,
26290 }
26291 }
26292 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26293 self.node
26294 }
26295 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26296 TokenElsePtr(self.node.stable_ptr(db))
26297 }
26298}
26299#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26300pub struct TerminalElse<'db> {
26301 node: SyntaxNode<'db>,
26302}
26303impl<'db> Terminal<'db> for TerminalElse<'db> {
26304 const KIND: SyntaxKind = SyntaxKind::TerminalElse;
26305 type TokenType = TokenElse<'db>;
26306 fn new_green(
26307 db: &'db dyn Database,
26308 leading_trivia: TriviaGreen<'db>,
26309 token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26310 trailing_trivia: TriviaGreen<'db>,
26311 ) -> Self::Green {
26312 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26313 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26314 TerminalElseGreen(
26315 GreenNode {
26316 kind: SyntaxKind::TerminalElse,
26317 details: GreenNodeDetails::Node { children: children.into(), width },
26318 }
26319 .intern(db),
26320 )
26321 }
26322 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26323 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26324 else {
26325 unreachable!("Expected a node, not a token");
26326 };
26327 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26328 }
26329}
26330impl<'db> TerminalElse<'db> {
26331 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26332 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26333 }
26334 pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
26335 TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
26336 }
26337 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26338 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26339 }
26340}
26341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26342pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26343impl<'db> TerminalElsePtr<'db> {}
26344impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
26345 type SyntaxNode = TerminalElse<'db>;
26346 fn untyped(self) -> SyntaxStablePtrId<'db> {
26347 self.0
26348 }
26349 fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
26350 TerminalElse::from_syntax_node(db, self.0.lookup(db))
26351 }
26352}
26353impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
26354 fn from(ptr: TerminalElsePtr<'db>) -> Self {
26355 ptr.untyped()
26356 }
26357}
26358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26359pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
26360impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
26361 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
26362 type StablePtr = TerminalElsePtr<'db>;
26363 type Green = TerminalElseGreen<'db>;
26364 fn missing(db: &'db dyn Database) -> Self::Green {
26365 TerminalElseGreen(
26366 GreenNode {
26367 kind: SyntaxKind::TerminalElse,
26368 details: GreenNodeDetails::Node {
26369 children: [
26370 Trivia::missing(db).0,
26371 TokenElse::missing(db).0,
26372 Trivia::missing(db).0,
26373 ]
26374 .into(),
26375 width: TextWidth::default(),
26376 },
26377 }
26378 .intern(db),
26379 )
26380 }
26381 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26382 let kind = node.kind(db);
26383 assert_eq!(
26384 kind,
26385 SyntaxKind::TerminalElse,
26386 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26387 kind,
26388 SyntaxKind::TerminalElse
26389 );
26390 Self { node }
26391 }
26392 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26393 let kind = node.kind(db);
26394 if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
26395 }
26396 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26397 self.node
26398 }
26399 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26400 TerminalElsePtr(self.node.stable_ptr(db))
26401 }
26402}
26403#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26404pub struct TokenEnum<'db> {
26405 node: SyntaxNode<'db>,
26406}
26407impl<'db> Token<'db> for TokenEnum<'db> {
26408 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26409 TokenEnumGreen(
26410 GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26411 .intern(db),
26412 )
26413 }
26414 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26415 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26416 }
26417}
26418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26419pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26420impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26421 type SyntaxNode = TokenEnum<'db>;
26422 fn untyped(self) -> SyntaxStablePtrId<'db> {
26423 self.0
26424 }
26425 fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26426 TokenEnum::from_syntax_node(db, self.0.lookup(db))
26427 }
26428}
26429impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26430 fn from(ptr: TokenEnumPtr<'db>) -> Self {
26431 ptr.untyped()
26432 }
26433}
26434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26435pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26436impl<'db> TokenEnumGreen<'db> {
26437 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26438 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26439 }
26440}
26441impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26442 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26443 type StablePtr = TokenEnumPtr<'db>;
26444 type Green = TokenEnumGreen<'db>;
26445 fn missing(db: &'db dyn Database) -> Self::Green {
26446 TokenEnumGreen(
26447 GreenNode {
26448 kind: SyntaxKind::TokenMissing,
26449 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26450 }
26451 .intern(db),
26452 )
26453 }
26454 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26455 match node.long(db).green.long(db).details {
26456 GreenNodeDetails::Token(_) => Self { node },
26457 GreenNodeDetails::Node { .. } => {
26458 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26459 }
26460 }
26461 }
26462 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26463 match node.long(db).green.long(db).details {
26464 GreenNodeDetails::Token(_) => Some(Self { node }),
26465 GreenNodeDetails::Node { .. } => None,
26466 }
26467 }
26468 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26469 self.node
26470 }
26471 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26472 TokenEnumPtr(self.node.stable_ptr(db))
26473 }
26474}
26475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26476pub struct TerminalEnum<'db> {
26477 node: SyntaxNode<'db>,
26478}
26479impl<'db> Terminal<'db> for TerminalEnum<'db> {
26480 const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26481 type TokenType = TokenEnum<'db>;
26482 fn new_green(
26483 db: &'db dyn Database,
26484 leading_trivia: TriviaGreen<'db>,
26485 token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26486 trailing_trivia: TriviaGreen<'db>,
26487 ) -> Self::Green {
26488 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26489 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26490 TerminalEnumGreen(
26491 GreenNode {
26492 kind: SyntaxKind::TerminalEnum,
26493 details: GreenNodeDetails::Node { children: children.into(), width },
26494 }
26495 .intern(db),
26496 )
26497 }
26498 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26499 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26500 else {
26501 unreachable!("Expected a node, not a token");
26502 };
26503 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26504 }
26505}
26506impl<'db> TerminalEnum<'db> {
26507 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26508 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26509 }
26510 pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26511 TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26512 }
26513 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26514 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26515 }
26516}
26517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26518pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26519impl<'db> TerminalEnumPtr<'db> {}
26520impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26521 type SyntaxNode = TerminalEnum<'db>;
26522 fn untyped(self) -> SyntaxStablePtrId<'db> {
26523 self.0
26524 }
26525 fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26526 TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26527 }
26528}
26529impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26530 fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26531 ptr.untyped()
26532 }
26533}
26534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26535pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26536impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26537 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26538 type StablePtr = TerminalEnumPtr<'db>;
26539 type Green = TerminalEnumGreen<'db>;
26540 fn missing(db: &'db dyn Database) -> Self::Green {
26541 TerminalEnumGreen(
26542 GreenNode {
26543 kind: SyntaxKind::TerminalEnum,
26544 details: GreenNodeDetails::Node {
26545 children: [
26546 Trivia::missing(db).0,
26547 TokenEnum::missing(db).0,
26548 Trivia::missing(db).0,
26549 ]
26550 .into(),
26551 width: TextWidth::default(),
26552 },
26553 }
26554 .intern(db),
26555 )
26556 }
26557 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26558 let kind = node.kind(db);
26559 assert_eq!(
26560 kind,
26561 SyntaxKind::TerminalEnum,
26562 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26563 kind,
26564 SyntaxKind::TerminalEnum
26565 );
26566 Self { node }
26567 }
26568 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26569 let kind = node.kind(db);
26570 if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26571 }
26572 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26573 self.node
26574 }
26575 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26576 TerminalEnumPtr(self.node.stable_ptr(db))
26577 }
26578}
26579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26580pub struct TokenExtern<'db> {
26581 node: SyntaxNode<'db>,
26582}
26583impl<'db> Token<'db> for TokenExtern<'db> {
26584 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26585 TokenExternGreen(
26586 GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26587 .intern(db),
26588 )
26589 }
26590 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26591 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26592 }
26593}
26594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26595pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26596impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26597 type SyntaxNode = TokenExtern<'db>;
26598 fn untyped(self) -> SyntaxStablePtrId<'db> {
26599 self.0
26600 }
26601 fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26602 TokenExtern::from_syntax_node(db, self.0.lookup(db))
26603 }
26604}
26605impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26606 fn from(ptr: TokenExternPtr<'db>) -> Self {
26607 ptr.untyped()
26608 }
26609}
26610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26611pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26612impl<'db> TokenExternGreen<'db> {
26613 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26614 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26615 }
26616}
26617impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26618 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26619 type StablePtr = TokenExternPtr<'db>;
26620 type Green = TokenExternGreen<'db>;
26621 fn missing(db: &'db dyn Database) -> Self::Green {
26622 TokenExternGreen(
26623 GreenNode {
26624 kind: SyntaxKind::TokenMissing,
26625 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26626 }
26627 .intern(db),
26628 )
26629 }
26630 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26631 match node.long(db).green.long(db).details {
26632 GreenNodeDetails::Token(_) => Self { node },
26633 GreenNodeDetails::Node { .. } => {
26634 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26635 }
26636 }
26637 }
26638 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26639 match node.long(db).green.long(db).details {
26640 GreenNodeDetails::Token(_) => Some(Self { node }),
26641 GreenNodeDetails::Node { .. } => None,
26642 }
26643 }
26644 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26645 self.node
26646 }
26647 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26648 TokenExternPtr(self.node.stable_ptr(db))
26649 }
26650}
26651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26652pub struct TerminalExtern<'db> {
26653 node: SyntaxNode<'db>,
26654}
26655impl<'db> Terminal<'db> for TerminalExtern<'db> {
26656 const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26657 type TokenType = TokenExtern<'db>;
26658 fn new_green(
26659 db: &'db dyn Database,
26660 leading_trivia: TriviaGreen<'db>,
26661 token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26662 trailing_trivia: TriviaGreen<'db>,
26663 ) -> Self::Green {
26664 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26665 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26666 TerminalExternGreen(
26667 GreenNode {
26668 kind: SyntaxKind::TerminalExtern,
26669 details: GreenNodeDetails::Node { children: children.into(), width },
26670 }
26671 .intern(db),
26672 )
26673 }
26674 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26675 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26676 else {
26677 unreachable!("Expected a node, not a token");
26678 };
26679 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26680 }
26681}
26682impl<'db> TerminalExtern<'db> {
26683 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26684 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26685 }
26686 pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26687 TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26688 }
26689 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26690 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26691 }
26692}
26693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26694pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26695impl<'db> TerminalExternPtr<'db> {}
26696impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26697 type SyntaxNode = TerminalExtern<'db>;
26698 fn untyped(self) -> SyntaxStablePtrId<'db> {
26699 self.0
26700 }
26701 fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26702 TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26703 }
26704}
26705impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26706 fn from(ptr: TerminalExternPtr<'db>) -> Self {
26707 ptr.untyped()
26708 }
26709}
26710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26711pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26712impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26713 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26714 type StablePtr = TerminalExternPtr<'db>;
26715 type Green = TerminalExternGreen<'db>;
26716 fn missing(db: &'db dyn Database) -> Self::Green {
26717 TerminalExternGreen(
26718 GreenNode {
26719 kind: SyntaxKind::TerminalExtern,
26720 details: GreenNodeDetails::Node {
26721 children: [
26722 Trivia::missing(db).0,
26723 TokenExtern::missing(db).0,
26724 Trivia::missing(db).0,
26725 ]
26726 .into(),
26727 width: TextWidth::default(),
26728 },
26729 }
26730 .intern(db),
26731 )
26732 }
26733 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26734 let kind = node.kind(db);
26735 assert_eq!(
26736 kind,
26737 SyntaxKind::TerminalExtern,
26738 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26739 kind,
26740 SyntaxKind::TerminalExtern
26741 );
26742 Self { node }
26743 }
26744 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26745 let kind = node.kind(db);
26746 if kind == SyntaxKind::TerminalExtern {
26747 Some(Self::from_syntax_node(db, node))
26748 } else {
26749 None
26750 }
26751 }
26752 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26753 self.node
26754 }
26755 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26756 TerminalExternPtr(self.node.stable_ptr(db))
26757 }
26758}
26759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26760pub struct TokenFalse<'db> {
26761 node: SyntaxNode<'db>,
26762}
26763impl<'db> Token<'db> for TokenFalse<'db> {
26764 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26765 TokenFalseGreen(
26766 GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26767 .intern(db),
26768 )
26769 }
26770 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26771 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26772 }
26773}
26774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26775pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26776impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26777 type SyntaxNode = TokenFalse<'db>;
26778 fn untyped(self) -> SyntaxStablePtrId<'db> {
26779 self.0
26780 }
26781 fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26782 TokenFalse::from_syntax_node(db, self.0.lookup(db))
26783 }
26784}
26785impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26786 fn from(ptr: TokenFalsePtr<'db>) -> Self {
26787 ptr.untyped()
26788 }
26789}
26790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26791pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26792impl<'db> TokenFalseGreen<'db> {
26793 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26794 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26795 }
26796}
26797impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26798 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26799 type StablePtr = TokenFalsePtr<'db>;
26800 type Green = TokenFalseGreen<'db>;
26801 fn missing(db: &'db dyn Database) -> Self::Green {
26802 TokenFalseGreen(
26803 GreenNode {
26804 kind: SyntaxKind::TokenMissing,
26805 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26806 }
26807 .intern(db),
26808 )
26809 }
26810 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26811 match node.long(db).green.long(db).details {
26812 GreenNodeDetails::Token(_) => Self { node },
26813 GreenNodeDetails::Node { .. } => {
26814 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26815 }
26816 }
26817 }
26818 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26819 match node.long(db).green.long(db).details {
26820 GreenNodeDetails::Token(_) => Some(Self { node }),
26821 GreenNodeDetails::Node { .. } => None,
26822 }
26823 }
26824 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26825 self.node
26826 }
26827 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26828 TokenFalsePtr(self.node.stable_ptr(db))
26829 }
26830}
26831#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26832pub struct TerminalFalse<'db> {
26833 node: SyntaxNode<'db>,
26834}
26835impl<'db> Terminal<'db> for TerminalFalse<'db> {
26836 const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26837 type TokenType = TokenFalse<'db>;
26838 fn new_green(
26839 db: &'db dyn Database,
26840 leading_trivia: TriviaGreen<'db>,
26841 token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26842 trailing_trivia: TriviaGreen<'db>,
26843 ) -> Self::Green {
26844 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26845 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26846 TerminalFalseGreen(
26847 GreenNode {
26848 kind: SyntaxKind::TerminalFalse,
26849 details: GreenNodeDetails::Node { children: children.into(), width },
26850 }
26851 .intern(db),
26852 )
26853 }
26854 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26855 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26856 else {
26857 unreachable!("Expected a node, not a token");
26858 };
26859 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26860 }
26861}
26862impl<'db> TerminalFalse<'db> {
26863 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26864 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26865 }
26866 pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26867 TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26868 }
26869 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26870 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26871 }
26872}
26873#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26874pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26875impl<'db> TerminalFalsePtr<'db> {}
26876impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26877 type SyntaxNode = TerminalFalse<'db>;
26878 fn untyped(self) -> SyntaxStablePtrId<'db> {
26879 self.0
26880 }
26881 fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26882 TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26883 }
26884}
26885impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26886 fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26887 ptr.untyped()
26888 }
26889}
26890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26891pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26892impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26893 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26894 type StablePtr = TerminalFalsePtr<'db>;
26895 type Green = TerminalFalseGreen<'db>;
26896 fn missing(db: &'db dyn Database) -> Self::Green {
26897 TerminalFalseGreen(
26898 GreenNode {
26899 kind: SyntaxKind::TerminalFalse,
26900 details: GreenNodeDetails::Node {
26901 children: [
26902 Trivia::missing(db).0,
26903 TokenFalse::missing(db).0,
26904 Trivia::missing(db).0,
26905 ]
26906 .into(),
26907 width: TextWidth::default(),
26908 },
26909 }
26910 .intern(db),
26911 )
26912 }
26913 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26914 let kind = node.kind(db);
26915 assert_eq!(
26916 kind,
26917 SyntaxKind::TerminalFalse,
26918 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26919 kind,
26920 SyntaxKind::TerminalFalse
26921 );
26922 Self { node }
26923 }
26924 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26925 let kind = node.kind(db);
26926 if kind == SyntaxKind::TerminalFalse {
26927 Some(Self::from_syntax_node(db, node))
26928 } else {
26929 None
26930 }
26931 }
26932 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26933 self.node
26934 }
26935 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26936 TerminalFalsePtr(self.node.stable_ptr(db))
26937 }
26938}
26939#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26940pub struct TokenFunction<'db> {
26941 node: SyntaxNode<'db>,
26942}
26943impl<'db> Token<'db> for TokenFunction<'db> {
26944 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26945 TokenFunctionGreen(
26946 GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26947 .intern(db),
26948 )
26949 }
26950 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26951 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26952 }
26953}
26954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26955pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26956impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26957 type SyntaxNode = TokenFunction<'db>;
26958 fn untyped(self) -> SyntaxStablePtrId<'db> {
26959 self.0
26960 }
26961 fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26962 TokenFunction::from_syntax_node(db, self.0.lookup(db))
26963 }
26964}
26965impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26966 fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26967 ptr.untyped()
26968 }
26969}
26970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26971pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26972impl<'db> TokenFunctionGreen<'db> {
26973 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26974 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26975 }
26976}
26977impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26978 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26979 type StablePtr = TokenFunctionPtr<'db>;
26980 type Green = TokenFunctionGreen<'db>;
26981 fn missing(db: &'db dyn Database) -> Self::Green {
26982 TokenFunctionGreen(
26983 GreenNode {
26984 kind: SyntaxKind::TokenMissing,
26985 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26986 }
26987 .intern(db),
26988 )
26989 }
26990 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26991 match node.long(db).green.long(db).details {
26992 GreenNodeDetails::Token(_) => Self { node },
26993 GreenNodeDetails::Node { .. } => {
26994 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26995 }
26996 }
26997 }
26998 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26999 match node.long(db).green.long(db).details {
27000 GreenNodeDetails::Token(_) => Some(Self { node }),
27001 GreenNodeDetails::Node { .. } => None,
27002 }
27003 }
27004 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27005 self.node
27006 }
27007 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27008 TokenFunctionPtr(self.node.stable_ptr(db))
27009 }
27010}
27011#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27012pub struct TerminalFunction<'db> {
27013 node: SyntaxNode<'db>,
27014}
27015impl<'db> Terminal<'db> for TerminalFunction<'db> {
27016 const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
27017 type TokenType = TokenFunction<'db>;
27018 fn new_green(
27019 db: &'db dyn Database,
27020 leading_trivia: TriviaGreen<'db>,
27021 token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27022 trailing_trivia: TriviaGreen<'db>,
27023 ) -> Self::Green {
27024 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27025 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27026 TerminalFunctionGreen(
27027 GreenNode {
27028 kind: SyntaxKind::TerminalFunction,
27029 details: GreenNodeDetails::Node { children: children.into(), width },
27030 }
27031 .intern(db),
27032 )
27033 }
27034 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27035 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27036 else {
27037 unreachable!("Expected a node, not a token");
27038 };
27039 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27040 }
27041}
27042impl<'db> TerminalFunction<'db> {
27043 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27044 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27045 }
27046 pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
27047 TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
27048 }
27049 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27050 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27051 }
27052}
27053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27054pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
27055impl<'db> TerminalFunctionPtr<'db> {}
27056impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
27057 type SyntaxNode = TerminalFunction<'db>;
27058 fn untyped(self) -> SyntaxStablePtrId<'db> {
27059 self.0
27060 }
27061 fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
27062 TerminalFunction::from_syntax_node(db, self.0.lookup(db))
27063 }
27064}
27065impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
27066 fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
27067 ptr.untyped()
27068 }
27069}
27070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27071pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
27072impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
27073 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
27074 type StablePtr = TerminalFunctionPtr<'db>;
27075 type Green = TerminalFunctionGreen<'db>;
27076 fn missing(db: &'db dyn Database) -> Self::Green {
27077 TerminalFunctionGreen(
27078 GreenNode {
27079 kind: SyntaxKind::TerminalFunction,
27080 details: GreenNodeDetails::Node {
27081 children: [
27082 Trivia::missing(db).0,
27083 TokenFunction::missing(db).0,
27084 Trivia::missing(db).0,
27085 ]
27086 .into(),
27087 width: TextWidth::default(),
27088 },
27089 }
27090 .intern(db),
27091 )
27092 }
27093 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27094 let kind = node.kind(db);
27095 assert_eq!(
27096 kind,
27097 SyntaxKind::TerminalFunction,
27098 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27099 kind,
27100 SyntaxKind::TerminalFunction
27101 );
27102 Self { node }
27103 }
27104 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27105 let kind = node.kind(db);
27106 if kind == SyntaxKind::TerminalFunction {
27107 Some(Self::from_syntax_node(db, node))
27108 } else {
27109 None
27110 }
27111 }
27112 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27113 self.node
27114 }
27115 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27116 TerminalFunctionPtr(self.node.stable_ptr(db))
27117 }
27118}
27119#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27120pub struct TokenIf<'db> {
27121 node: SyntaxNode<'db>,
27122}
27123impl<'db> Token<'db> for TokenIf<'db> {
27124 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27125 TokenIfGreen(
27126 GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
27127 .intern(db),
27128 )
27129 }
27130 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27131 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27132 }
27133}
27134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27135pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27136impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
27137 type SyntaxNode = TokenIf<'db>;
27138 fn untyped(self) -> SyntaxStablePtrId<'db> {
27139 self.0
27140 }
27141 fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
27142 TokenIf::from_syntax_node(db, self.0.lookup(db))
27143 }
27144}
27145impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
27146 fn from(ptr: TokenIfPtr<'db>) -> Self {
27147 ptr.untyped()
27148 }
27149}
27150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27151pub struct TokenIfGreen<'db>(pub GreenId<'db>);
27152impl<'db> TokenIfGreen<'db> {
27153 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27154 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27155 }
27156}
27157impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
27158 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
27159 type StablePtr = TokenIfPtr<'db>;
27160 type Green = TokenIfGreen<'db>;
27161 fn missing(db: &'db dyn Database) -> Self::Green {
27162 TokenIfGreen(
27163 GreenNode {
27164 kind: SyntaxKind::TokenMissing,
27165 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27166 }
27167 .intern(db),
27168 )
27169 }
27170 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27171 match node.long(db).green.long(db).details {
27172 GreenNodeDetails::Token(_) => Self { node },
27173 GreenNodeDetails::Node { .. } => {
27174 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
27175 }
27176 }
27177 }
27178 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27179 match node.long(db).green.long(db).details {
27180 GreenNodeDetails::Token(_) => Some(Self { node }),
27181 GreenNodeDetails::Node { .. } => None,
27182 }
27183 }
27184 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27185 self.node
27186 }
27187 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27188 TokenIfPtr(self.node.stable_ptr(db))
27189 }
27190}
27191#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27192pub struct TerminalIf<'db> {
27193 node: SyntaxNode<'db>,
27194}
27195impl<'db> Terminal<'db> for TerminalIf<'db> {
27196 const KIND: SyntaxKind = SyntaxKind::TerminalIf;
27197 type TokenType = TokenIf<'db>;
27198 fn new_green(
27199 db: &'db dyn Database,
27200 leading_trivia: TriviaGreen<'db>,
27201 token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27202 trailing_trivia: TriviaGreen<'db>,
27203 ) -> Self::Green {
27204 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27205 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27206 TerminalIfGreen(
27207 GreenNode {
27208 kind: SyntaxKind::TerminalIf,
27209 details: GreenNodeDetails::Node { children: children.into(), width },
27210 }
27211 .intern(db),
27212 )
27213 }
27214 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27215 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27216 else {
27217 unreachable!("Expected a node, not a token");
27218 };
27219 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27220 }
27221}
27222impl<'db> TerminalIf<'db> {
27223 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27224 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27225 }
27226 pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
27227 TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
27228 }
27229 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27230 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27231 }
27232}
27233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27234pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27235impl<'db> TerminalIfPtr<'db> {}
27236impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
27237 type SyntaxNode = TerminalIf<'db>;
27238 fn untyped(self) -> SyntaxStablePtrId<'db> {
27239 self.0
27240 }
27241 fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
27242 TerminalIf::from_syntax_node(db, self.0.lookup(db))
27243 }
27244}
27245impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
27246 fn from(ptr: TerminalIfPtr<'db>) -> Self {
27247 ptr.untyped()
27248 }
27249}
27250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27251pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
27252impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
27253 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
27254 type StablePtr = TerminalIfPtr<'db>;
27255 type Green = TerminalIfGreen<'db>;
27256 fn missing(db: &'db dyn Database) -> Self::Green {
27257 TerminalIfGreen(
27258 GreenNode {
27259 kind: SyntaxKind::TerminalIf,
27260 details: GreenNodeDetails::Node {
27261 children: [
27262 Trivia::missing(db).0,
27263 TokenIf::missing(db).0,
27264 Trivia::missing(db).0,
27265 ]
27266 .into(),
27267 width: TextWidth::default(),
27268 },
27269 }
27270 .intern(db),
27271 )
27272 }
27273 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27274 let kind = node.kind(db);
27275 assert_eq!(
27276 kind,
27277 SyntaxKind::TerminalIf,
27278 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27279 kind,
27280 SyntaxKind::TerminalIf
27281 );
27282 Self { node }
27283 }
27284 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27285 let kind = node.kind(db);
27286 if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
27287 }
27288 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27289 self.node
27290 }
27291 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27292 TerminalIfPtr(self.node.stable_ptr(db))
27293 }
27294}
27295#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27296pub struct TokenWhile<'db> {
27297 node: SyntaxNode<'db>,
27298}
27299impl<'db> Token<'db> for TokenWhile<'db> {
27300 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27301 TokenWhileGreen(
27302 GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
27303 .intern(db),
27304 )
27305 }
27306 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27307 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27308 }
27309}
27310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27311pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27312impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
27313 type SyntaxNode = TokenWhile<'db>;
27314 fn untyped(self) -> SyntaxStablePtrId<'db> {
27315 self.0
27316 }
27317 fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27318 TokenWhile::from_syntax_node(db, self.0.lookup(db))
27319 }
27320}
27321impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27322 fn from(ptr: TokenWhilePtr<'db>) -> Self {
27323 ptr.untyped()
27324 }
27325}
27326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27327pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
27328impl<'db> TokenWhileGreen<'db> {
27329 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27330 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27331 }
27332}
27333impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
27334 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
27335 type StablePtr = TokenWhilePtr<'db>;
27336 type Green = TokenWhileGreen<'db>;
27337 fn missing(db: &'db dyn Database) -> Self::Green {
27338 TokenWhileGreen(
27339 GreenNode {
27340 kind: SyntaxKind::TokenMissing,
27341 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27342 }
27343 .intern(db),
27344 )
27345 }
27346 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27347 match node.long(db).green.long(db).details {
27348 GreenNodeDetails::Token(_) => Self { node },
27349 GreenNodeDetails::Node { .. } => {
27350 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
27351 }
27352 }
27353 }
27354 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27355 match node.long(db).green.long(db).details {
27356 GreenNodeDetails::Token(_) => Some(Self { node }),
27357 GreenNodeDetails::Node { .. } => None,
27358 }
27359 }
27360 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27361 self.node
27362 }
27363 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27364 TokenWhilePtr(self.node.stable_ptr(db))
27365 }
27366}
27367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27368pub struct TerminalWhile<'db> {
27369 node: SyntaxNode<'db>,
27370}
27371impl<'db> Terminal<'db> for TerminalWhile<'db> {
27372 const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
27373 type TokenType = TokenWhile<'db>;
27374 fn new_green(
27375 db: &'db dyn Database,
27376 leading_trivia: TriviaGreen<'db>,
27377 token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27378 trailing_trivia: TriviaGreen<'db>,
27379 ) -> Self::Green {
27380 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27381 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27382 TerminalWhileGreen(
27383 GreenNode {
27384 kind: SyntaxKind::TerminalWhile,
27385 details: GreenNodeDetails::Node { children: children.into(), width },
27386 }
27387 .intern(db),
27388 )
27389 }
27390 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27391 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27392 else {
27393 unreachable!("Expected a node, not a token");
27394 };
27395 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27396 }
27397}
27398impl<'db> TerminalWhile<'db> {
27399 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27400 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27401 }
27402 pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27403 TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
27404 }
27405 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27406 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27407 }
27408}
27409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27410pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27411impl<'db> TerminalWhilePtr<'db> {}
27412impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27413 type SyntaxNode = TerminalWhile<'db>;
27414 fn untyped(self) -> SyntaxStablePtrId<'db> {
27415 self.0
27416 }
27417 fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27418 TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27419 }
27420}
27421impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27422 fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27423 ptr.untyped()
27424 }
27425}
27426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27427pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27428impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27429 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27430 type StablePtr = TerminalWhilePtr<'db>;
27431 type Green = TerminalWhileGreen<'db>;
27432 fn missing(db: &'db dyn Database) -> Self::Green {
27433 TerminalWhileGreen(
27434 GreenNode {
27435 kind: SyntaxKind::TerminalWhile,
27436 details: GreenNodeDetails::Node {
27437 children: [
27438 Trivia::missing(db).0,
27439 TokenWhile::missing(db).0,
27440 Trivia::missing(db).0,
27441 ]
27442 .into(),
27443 width: TextWidth::default(),
27444 },
27445 }
27446 .intern(db),
27447 )
27448 }
27449 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27450 let kind = node.kind(db);
27451 assert_eq!(
27452 kind,
27453 SyntaxKind::TerminalWhile,
27454 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27455 kind,
27456 SyntaxKind::TerminalWhile
27457 );
27458 Self { node }
27459 }
27460 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27461 let kind = node.kind(db);
27462 if kind == SyntaxKind::TerminalWhile {
27463 Some(Self::from_syntax_node(db, node))
27464 } else {
27465 None
27466 }
27467 }
27468 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27469 self.node
27470 }
27471 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27472 TerminalWhilePtr(self.node.stable_ptr(db))
27473 }
27474}
27475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27476pub struct TokenFor<'db> {
27477 node: SyntaxNode<'db>,
27478}
27479impl<'db> Token<'db> for TokenFor<'db> {
27480 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27481 TokenForGreen(
27482 GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27483 .intern(db),
27484 )
27485 }
27486 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27487 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27488 }
27489}
27490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27491pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27492impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27493 type SyntaxNode = TokenFor<'db>;
27494 fn untyped(self) -> SyntaxStablePtrId<'db> {
27495 self.0
27496 }
27497 fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27498 TokenFor::from_syntax_node(db, self.0.lookup(db))
27499 }
27500}
27501impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27502 fn from(ptr: TokenForPtr<'db>) -> Self {
27503 ptr.untyped()
27504 }
27505}
27506#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27507pub struct TokenForGreen<'db>(pub GreenId<'db>);
27508impl<'db> TokenForGreen<'db> {
27509 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27510 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27511 }
27512}
27513impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27514 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27515 type StablePtr = TokenForPtr<'db>;
27516 type Green = TokenForGreen<'db>;
27517 fn missing(db: &'db dyn Database) -> Self::Green {
27518 TokenForGreen(
27519 GreenNode {
27520 kind: SyntaxKind::TokenMissing,
27521 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27522 }
27523 .intern(db),
27524 )
27525 }
27526 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27527 match node.long(db).green.long(db).details {
27528 GreenNodeDetails::Token(_) => Self { node },
27529 GreenNodeDetails::Node { .. } => {
27530 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27531 }
27532 }
27533 }
27534 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27535 match node.long(db).green.long(db).details {
27536 GreenNodeDetails::Token(_) => Some(Self { node }),
27537 GreenNodeDetails::Node { .. } => None,
27538 }
27539 }
27540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27541 self.node
27542 }
27543 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27544 TokenForPtr(self.node.stable_ptr(db))
27545 }
27546}
27547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27548pub struct TerminalFor<'db> {
27549 node: SyntaxNode<'db>,
27550}
27551impl<'db> Terminal<'db> for TerminalFor<'db> {
27552 const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27553 type TokenType = TokenFor<'db>;
27554 fn new_green(
27555 db: &'db dyn Database,
27556 leading_trivia: TriviaGreen<'db>,
27557 token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27558 trailing_trivia: TriviaGreen<'db>,
27559 ) -> Self::Green {
27560 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27561 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27562 TerminalForGreen(
27563 GreenNode {
27564 kind: SyntaxKind::TerminalFor,
27565 details: GreenNodeDetails::Node { children: children.into(), width },
27566 }
27567 .intern(db),
27568 )
27569 }
27570 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27571 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27572 else {
27573 unreachable!("Expected a node, not a token");
27574 };
27575 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27576 }
27577}
27578impl<'db> TerminalFor<'db> {
27579 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27580 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27581 }
27582 pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27583 TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27584 }
27585 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27586 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27587 }
27588}
27589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27590pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27591impl<'db> TerminalForPtr<'db> {}
27592impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27593 type SyntaxNode = TerminalFor<'db>;
27594 fn untyped(self) -> SyntaxStablePtrId<'db> {
27595 self.0
27596 }
27597 fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27598 TerminalFor::from_syntax_node(db, self.0.lookup(db))
27599 }
27600}
27601impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27602 fn from(ptr: TerminalForPtr<'db>) -> Self {
27603 ptr.untyped()
27604 }
27605}
27606#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27607pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27608impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27609 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27610 type StablePtr = TerminalForPtr<'db>;
27611 type Green = TerminalForGreen<'db>;
27612 fn missing(db: &'db dyn Database) -> Self::Green {
27613 TerminalForGreen(
27614 GreenNode {
27615 kind: SyntaxKind::TerminalFor,
27616 details: GreenNodeDetails::Node {
27617 children: [
27618 Trivia::missing(db).0,
27619 TokenFor::missing(db).0,
27620 Trivia::missing(db).0,
27621 ]
27622 .into(),
27623 width: TextWidth::default(),
27624 },
27625 }
27626 .intern(db),
27627 )
27628 }
27629 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27630 let kind = node.kind(db);
27631 assert_eq!(
27632 kind,
27633 SyntaxKind::TerminalFor,
27634 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27635 kind,
27636 SyntaxKind::TerminalFor
27637 );
27638 Self { node }
27639 }
27640 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27641 let kind = node.kind(db);
27642 if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27643 }
27644 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27645 self.node
27646 }
27647 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27648 TerminalForPtr(self.node.stable_ptr(db))
27649 }
27650}
27651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27652pub struct TokenLoop<'db> {
27653 node: SyntaxNode<'db>,
27654}
27655impl<'db> Token<'db> for TokenLoop<'db> {
27656 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27657 TokenLoopGreen(
27658 GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27659 .intern(db),
27660 )
27661 }
27662 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27663 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27664 }
27665}
27666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27667pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27668impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27669 type SyntaxNode = TokenLoop<'db>;
27670 fn untyped(self) -> SyntaxStablePtrId<'db> {
27671 self.0
27672 }
27673 fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27674 TokenLoop::from_syntax_node(db, self.0.lookup(db))
27675 }
27676}
27677impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27678 fn from(ptr: TokenLoopPtr<'db>) -> Self {
27679 ptr.untyped()
27680 }
27681}
27682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27683pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27684impl<'db> TokenLoopGreen<'db> {
27685 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27686 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27687 }
27688}
27689impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27690 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27691 type StablePtr = TokenLoopPtr<'db>;
27692 type Green = TokenLoopGreen<'db>;
27693 fn missing(db: &'db dyn Database) -> Self::Green {
27694 TokenLoopGreen(
27695 GreenNode {
27696 kind: SyntaxKind::TokenMissing,
27697 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27698 }
27699 .intern(db),
27700 )
27701 }
27702 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27703 match node.long(db).green.long(db).details {
27704 GreenNodeDetails::Token(_) => Self { node },
27705 GreenNodeDetails::Node { .. } => {
27706 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27707 }
27708 }
27709 }
27710 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27711 match node.long(db).green.long(db).details {
27712 GreenNodeDetails::Token(_) => Some(Self { node }),
27713 GreenNodeDetails::Node { .. } => None,
27714 }
27715 }
27716 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27717 self.node
27718 }
27719 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27720 TokenLoopPtr(self.node.stable_ptr(db))
27721 }
27722}
27723#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27724pub struct TerminalLoop<'db> {
27725 node: SyntaxNode<'db>,
27726}
27727impl<'db> Terminal<'db> for TerminalLoop<'db> {
27728 const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27729 type TokenType = TokenLoop<'db>;
27730 fn new_green(
27731 db: &'db dyn Database,
27732 leading_trivia: TriviaGreen<'db>,
27733 token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27734 trailing_trivia: TriviaGreen<'db>,
27735 ) -> Self::Green {
27736 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27737 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27738 TerminalLoopGreen(
27739 GreenNode {
27740 kind: SyntaxKind::TerminalLoop,
27741 details: GreenNodeDetails::Node { children: children.into(), width },
27742 }
27743 .intern(db),
27744 )
27745 }
27746 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27747 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27748 else {
27749 unreachable!("Expected a node, not a token");
27750 };
27751 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27752 }
27753}
27754impl<'db> TerminalLoop<'db> {
27755 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27756 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27757 }
27758 pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27759 TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27760 }
27761 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27762 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27763 }
27764}
27765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27766pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27767impl<'db> TerminalLoopPtr<'db> {}
27768impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27769 type SyntaxNode = TerminalLoop<'db>;
27770 fn untyped(self) -> SyntaxStablePtrId<'db> {
27771 self.0
27772 }
27773 fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27774 TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27775 }
27776}
27777impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27778 fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27779 ptr.untyped()
27780 }
27781}
27782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27783pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27784impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27785 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27786 type StablePtr = TerminalLoopPtr<'db>;
27787 type Green = TerminalLoopGreen<'db>;
27788 fn missing(db: &'db dyn Database) -> Self::Green {
27789 TerminalLoopGreen(
27790 GreenNode {
27791 kind: SyntaxKind::TerminalLoop,
27792 details: GreenNodeDetails::Node {
27793 children: [
27794 Trivia::missing(db).0,
27795 TokenLoop::missing(db).0,
27796 Trivia::missing(db).0,
27797 ]
27798 .into(),
27799 width: TextWidth::default(),
27800 },
27801 }
27802 .intern(db),
27803 )
27804 }
27805 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27806 let kind = node.kind(db);
27807 assert_eq!(
27808 kind,
27809 SyntaxKind::TerminalLoop,
27810 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27811 kind,
27812 SyntaxKind::TerminalLoop
27813 );
27814 Self { node }
27815 }
27816 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27817 let kind = node.kind(db);
27818 if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27819 }
27820 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27821 self.node
27822 }
27823 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27824 TerminalLoopPtr(self.node.stable_ptr(db))
27825 }
27826}
27827#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27828pub struct TokenImpl<'db> {
27829 node: SyntaxNode<'db>,
27830}
27831impl<'db> Token<'db> for TokenImpl<'db> {
27832 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27833 TokenImplGreen(
27834 GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27835 .intern(db),
27836 )
27837 }
27838 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27839 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27840 }
27841}
27842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27843pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27844impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27845 type SyntaxNode = TokenImpl<'db>;
27846 fn untyped(self) -> SyntaxStablePtrId<'db> {
27847 self.0
27848 }
27849 fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27850 TokenImpl::from_syntax_node(db, self.0.lookup(db))
27851 }
27852}
27853impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27854 fn from(ptr: TokenImplPtr<'db>) -> Self {
27855 ptr.untyped()
27856 }
27857}
27858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27859pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27860impl<'db> TokenImplGreen<'db> {
27861 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27862 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27863 }
27864}
27865impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27866 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27867 type StablePtr = TokenImplPtr<'db>;
27868 type Green = TokenImplGreen<'db>;
27869 fn missing(db: &'db dyn Database) -> Self::Green {
27870 TokenImplGreen(
27871 GreenNode {
27872 kind: SyntaxKind::TokenMissing,
27873 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27874 }
27875 .intern(db),
27876 )
27877 }
27878 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27879 match node.long(db).green.long(db).details {
27880 GreenNodeDetails::Token(_) => Self { node },
27881 GreenNodeDetails::Node { .. } => {
27882 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27883 }
27884 }
27885 }
27886 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27887 match node.long(db).green.long(db).details {
27888 GreenNodeDetails::Token(_) => Some(Self { node }),
27889 GreenNodeDetails::Node { .. } => None,
27890 }
27891 }
27892 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27893 self.node
27894 }
27895 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27896 TokenImplPtr(self.node.stable_ptr(db))
27897 }
27898}
27899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27900pub struct TerminalImpl<'db> {
27901 node: SyntaxNode<'db>,
27902}
27903impl<'db> Terminal<'db> for TerminalImpl<'db> {
27904 const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27905 type TokenType = TokenImpl<'db>;
27906 fn new_green(
27907 db: &'db dyn Database,
27908 leading_trivia: TriviaGreen<'db>,
27909 token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27910 trailing_trivia: TriviaGreen<'db>,
27911 ) -> Self::Green {
27912 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27913 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27914 TerminalImplGreen(
27915 GreenNode {
27916 kind: SyntaxKind::TerminalImpl,
27917 details: GreenNodeDetails::Node { children: children.into(), width },
27918 }
27919 .intern(db),
27920 )
27921 }
27922 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27923 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27924 else {
27925 unreachable!("Expected a node, not a token");
27926 };
27927 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27928 }
27929}
27930impl<'db> TerminalImpl<'db> {
27931 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27932 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27933 }
27934 pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27935 TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27936 }
27937 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27938 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27939 }
27940}
27941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27942pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27943impl<'db> TerminalImplPtr<'db> {}
27944impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27945 type SyntaxNode = TerminalImpl<'db>;
27946 fn untyped(self) -> SyntaxStablePtrId<'db> {
27947 self.0
27948 }
27949 fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27950 TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27951 }
27952}
27953impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27954 fn from(ptr: TerminalImplPtr<'db>) -> Self {
27955 ptr.untyped()
27956 }
27957}
27958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27959pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27960impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27961 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27962 type StablePtr = TerminalImplPtr<'db>;
27963 type Green = TerminalImplGreen<'db>;
27964 fn missing(db: &'db dyn Database) -> Self::Green {
27965 TerminalImplGreen(
27966 GreenNode {
27967 kind: SyntaxKind::TerminalImpl,
27968 details: GreenNodeDetails::Node {
27969 children: [
27970 Trivia::missing(db).0,
27971 TokenImpl::missing(db).0,
27972 Trivia::missing(db).0,
27973 ]
27974 .into(),
27975 width: TextWidth::default(),
27976 },
27977 }
27978 .intern(db),
27979 )
27980 }
27981 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27982 let kind = node.kind(db);
27983 assert_eq!(
27984 kind,
27985 SyntaxKind::TerminalImpl,
27986 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27987 kind,
27988 SyntaxKind::TerminalImpl
27989 );
27990 Self { node }
27991 }
27992 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27993 let kind = node.kind(db);
27994 if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27995 }
27996 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27997 self.node
27998 }
27999 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28000 TerminalImplPtr(self.node.stable_ptr(db))
28001 }
28002}
28003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28004pub struct TokenImplicits<'db> {
28005 node: SyntaxNode<'db>,
28006}
28007impl<'db> Token<'db> for TokenImplicits<'db> {
28008 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28009 TokenImplicitsGreen(
28010 GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
28011 .intern(db),
28012 )
28013 }
28014 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28015 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28016 }
28017}
28018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28019pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
28020impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
28021 type SyntaxNode = TokenImplicits<'db>;
28022 fn untyped(self) -> SyntaxStablePtrId<'db> {
28023 self.0
28024 }
28025 fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
28026 TokenImplicits::from_syntax_node(db, self.0.lookup(db))
28027 }
28028}
28029impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
28030 fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
28031 ptr.untyped()
28032 }
28033}
28034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28035pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
28036impl<'db> TokenImplicitsGreen<'db> {
28037 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28038 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28039 }
28040}
28041impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
28042 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
28043 type StablePtr = TokenImplicitsPtr<'db>;
28044 type Green = TokenImplicitsGreen<'db>;
28045 fn missing(db: &'db dyn Database) -> Self::Green {
28046 TokenImplicitsGreen(
28047 GreenNode {
28048 kind: SyntaxKind::TokenMissing,
28049 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28050 }
28051 .intern(db),
28052 )
28053 }
28054 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28055 match node.long(db).green.long(db).details {
28056 GreenNodeDetails::Token(_) => Self { node },
28057 GreenNodeDetails::Node { .. } => {
28058 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
28059 }
28060 }
28061 }
28062 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28063 match node.long(db).green.long(db).details {
28064 GreenNodeDetails::Token(_) => Some(Self { node }),
28065 GreenNodeDetails::Node { .. } => None,
28066 }
28067 }
28068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28069 self.node
28070 }
28071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28072 TokenImplicitsPtr(self.node.stable_ptr(db))
28073 }
28074}
28075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28076pub struct TerminalImplicits<'db> {
28077 node: SyntaxNode<'db>,
28078}
28079impl<'db> Terminal<'db> for TerminalImplicits<'db> {
28080 const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
28081 type TokenType = TokenImplicits<'db>;
28082 fn new_green(
28083 db: &'db dyn Database,
28084 leading_trivia: TriviaGreen<'db>,
28085 token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28086 trailing_trivia: TriviaGreen<'db>,
28087 ) -> Self::Green {
28088 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28089 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28090 TerminalImplicitsGreen(
28091 GreenNode {
28092 kind: SyntaxKind::TerminalImplicits,
28093 details: GreenNodeDetails::Node { children: children.into(), width },
28094 }
28095 .intern(db),
28096 )
28097 }
28098 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28099 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28100 else {
28101 unreachable!("Expected a node, not a token");
28102 };
28103 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28104 }
28105}
28106impl<'db> TerminalImplicits<'db> {
28107 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28108 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28109 }
28110 pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
28111 TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
28112 }
28113 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28114 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28115 }
28116}
28117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28118pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
28119impl<'db> TerminalImplicitsPtr<'db> {}
28120impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
28121 type SyntaxNode = TerminalImplicits<'db>;
28122 fn untyped(self) -> SyntaxStablePtrId<'db> {
28123 self.0
28124 }
28125 fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
28126 TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
28127 }
28128}
28129impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
28130 fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
28131 ptr.untyped()
28132 }
28133}
28134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28135pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
28136impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
28137 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
28138 type StablePtr = TerminalImplicitsPtr<'db>;
28139 type Green = TerminalImplicitsGreen<'db>;
28140 fn missing(db: &'db dyn Database) -> Self::Green {
28141 TerminalImplicitsGreen(
28142 GreenNode {
28143 kind: SyntaxKind::TerminalImplicits,
28144 details: GreenNodeDetails::Node {
28145 children: [
28146 Trivia::missing(db).0,
28147 TokenImplicits::missing(db).0,
28148 Trivia::missing(db).0,
28149 ]
28150 .into(),
28151 width: TextWidth::default(),
28152 },
28153 }
28154 .intern(db),
28155 )
28156 }
28157 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28158 let kind = node.kind(db);
28159 assert_eq!(
28160 kind,
28161 SyntaxKind::TerminalImplicits,
28162 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28163 kind,
28164 SyntaxKind::TerminalImplicits
28165 );
28166 Self { node }
28167 }
28168 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28169 let kind = node.kind(db);
28170 if kind == SyntaxKind::TerminalImplicits {
28171 Some(Self::from_syntax_node(db, node))
28172 } else {
28173 None
28174 }
28175 }
28176 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28177 self.node
28178 }
28179 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28180 TerminalImplicitsPtr(self.node.stable_ptr(db))
28181 }
28182}
28183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28184pub struct TokenLet<'db> {
28185 node: SyntaxNode<'db>,
28186}
28187impl<'db> Token<'db> for TokenLet<'db> {
28188 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28189 TokenLetGreen(
28190 GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
28191 .intern(db),
28192 )
28193 }
28194 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28195 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28196 }
28197}
28198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28199pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28200impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
28201 type SyntaxNode = TokenLet<'db>;
28202 fn untyped(self) -> SyntaxStablePtrId<'db> {
28203 self.0
28204 }
28205 fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
28206 TokenLet::from_syntax_node(db, self.0.lookup(db))
28207 }
28208}
28209impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
28210 fn from(ptr: TokenLetPtr<'db>) -> Self {
28211 ptr.untyped()
28212 }
28213}
28214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28215pub struct TokenLetGreen<'db>(pub GreenId<'db>);
28216impl<'db> TokenLetGreen<'db> {
28217 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28218 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28219 }
28220}
28221impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
28222 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
28223 type StablePtr = TokenLetPtr<'db>;
28224 type Green = TokenLetGreen<'db>;
28225 fn missing(db: &'db dyn Database) -> Self::Green {
28226 TokenLetGreen(
28227 GreenNode {
28228 kind: SyntaxKind::TokenMissing,
28229 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28230 }
28231 .intern(db),
28232 )
28233 }
28234 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28235 match node.long(db).green.long(db).details {
28236 GreenNodeDetails::Token(_) => Self { node },
28237 GreenNodeDetails::Node { .. } => {
28238 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
28239 }
28240 }
28241 }
28242 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28243 match node.long(db).green.long(db).details {
28244 GreenNodeDetails::Token(_) => Some(Self { node }),
28245 GreenNodeDetails::Node { .. } => None,
28246 }
28247 }
28248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28249 self.node
28250 }
28251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28252 TokenLetPtr(self.node.stable_ptr(db))
28253 }
28254}
28255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28256pub struct TerminalLet<'db> {
28257 node: SyntaxNode<'db>,
28258}
28259impl<'db> Terminal<'db> for TerminalLet<'db> {
28260 const KIND: SyntaxKind = SyntaxKind::TerminalLet;
28261 type TokenType = TokenLet<'db>;
28262 fn new_green(
28263 db: &'db dyn Database,
28264 leading_trivia: TriviaGreen<'db>,
28265 token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28266 trailing_trivia: TriviaGreen<'db>,
28267 ) -> Self::Green {
28268 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28269 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28270 TerminalLetGreen(
28271 GreenNode {
28272 kind: SyntaxKind::TerminalLet,
28273 details: GreenNodeDetails::Node { children: children.into(), width },
28274 }
28275 .intern(db),
28276 )
28277 }
28278 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28279 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28280 else {
28281 unreachable!("Expected a node, not a token");
28282 };
28283 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28284 }
28285}
28286impl<'db> TerminalLet<'db> {
28287 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28288 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28289 }
28290 pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
28291 TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
28292 }
28293 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28294 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28295 }
28296}
28297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28298pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28299impl<'db> TerminalLetPtr<'db> {}
28300impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
28301 type SyntaxNode = TerminalLet<'db>;
28302 fn untyped(self) -> SyntaxStablePtrId<'db> {
28303 self.0
28304 }
28305 fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
28306 TerminalLet::from_syntax_node(db, self.0.lookup(db))
28307 }
28308}
28309impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
28310 fn from(ptr: TerminalLetPtr<'db>) -> Self {
28311 ptr.untyped()
28312 }
28313}
28314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28315pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
28316impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
28317 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
28318 type StablePtr = TerminalLetPtr<'db>;
28319 type Green = TerminalLetGreen<'db>;
28320 fn missing(db: &'db dyn Database) -> Self::Green {
28321 TerminalLetGreen(
28322 GreenNode {
28323 kind: SyntaxKind::TerminalLet,
28324 details: GreenNodeDetails::Node {
28325 children: [
28326 Trivia::missing(db).0,
28327 TokenLet::missing(db).0,
28328 Trivia::missing(db).0,
28329 ]
28330 .into(),
28331 width: TextWidth::default(),
28332 },
28333 }
28334 .intern(db),
28335 )
28336 }
28337 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28338 let kind = node.kind(db);
28339 assert_eq!(
28340 kind,
28341 SyntaxKind::TerminalLet,
28342 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28343 kind,
28344 SyntaxKind::TerminalLet
28345 );
28346 Self { node }
28347 }
28348 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28349 let kind = node.kind(db);
28350 if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
28351 }
28352 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28353 self.node
28354 }
28355 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28356 TerminalLetPtr(self.node.stable_ptr(db))
28357 }
28358}
28359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28360pub struct TokenMacro<'db> {
28361 node: SyntaxNode<'db>,
28362}
28363impl<'db> Token<'db> for TokenMacro<'db> {
28364 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28365 TokenMacroGreen(
28366 GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
28367 .intern(db),
28368 )
28369 }
28370 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28371 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28372 }
28373}
28374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28375pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28376impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
28377 type SyntaxNode = TokenMacro<'db>;
28378 fn untyped(self) -> SyntaxStablePtrId<'db> {
28379 self.0
28380 }
28381 fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28382 TokenMacro::from_syntax_node(db, self.0.lookup(db))
28383 }
28384}
28385impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28386 fn from(ptr: TokenMacroPtr<'db>) -> Self {
28387 ptr.untyped()
28388 }
28389}
28390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28391pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
28392impl<'db> TokenMacroGreen<'db> {
28393 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28394 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28395 }
28396}
28397impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
28398 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
28399 type StablePtr = TokenMacroPtr<'db>;
28400 type Green = TokenMacroGreen<'db>;
28401 fn missing(db: &'db dyn Database) -> Self::Green {
28402 TokenMacroGreen(
28403 GreenNode {
28404 kind: SyntaxKind::TokenMissing,
28405 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28406 }
28407 .intern(db),
28408 )
28409 }
28410 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28411 match node.long(db).green.long(db).details {
28412 GreenNodeDetails::Token(_) => Self { node },
28413 GreenNodeDetails::Node { .. } => {
28414 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28415 }
28416 }
28417 }
28418 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28419 match node.long(db).green.long(db).details {
28420 GreenNodeDetails::Token(_) => Some(Self { node }),
28421 GreenNodeDetails::Node { .. } => None,
28422 }
28423 }
28424 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28425 self.node
28426 }
28427 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28428 TokenMacroPtr(self.node.stable_ptr(db))
28429 }
28430}
28431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28432pub struct TerminalMacro<'db> {
28433 node: SyntaxNode<'db>,
28434}
28435impl<'db> Terminal<'db> for TerminalMacro<'db> {
28436 const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28437 type TokenType = TokenMacro<'db>;
28438 fn new_green(
28439 db: &'db dyn Database,
28440 leading_trivia: TriviaGreen<'db>,
28441 token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28442 trailing_trivia: TriviaGreen<'db>,
28443 ) -> Self::Green {
28444 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28445 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28446 TerminalMacroGreen(
28447 GreenNode {
28448 kind: SyntaxKind::TerminalMacro,
28449 details: GreenNodeDetails::Node { children: children.into(), width },
28450 }
28451 .intern(db),
28452 )
28453 }
28454 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28455 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28456 else {
28457 unreachable!("Expected a node, not a token");
28458 };
28459 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28460 }
28461}
28462impl<'db> TerminalMacro<'db> {
28463 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28464 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28465 }
28466 pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28467 TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28468 }
28469 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28470 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28471 }
28472}
28473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28474pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28475impl<'db> TerminalMacroPtr<'db> {}
28476impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28477 type SyntaxNode = TerminalMacro<'db>;
28478 fn untyped(self) -> SyntaxStablePtrId<'db> {
28479 self.0
28480 }
28481 fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28482 TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28483 }
28484}
28485impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28486 fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28487 ptr.untyped()
28488 }
28489}
28490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28491pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28492impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28493 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28494 type StablePtr = TerminalMacroPtr<'db>;
28495 type Green = TerminalMacroGreen<'db>;
28496 fn missing(db: &'db dyn Database) -> Self::Green {
28497 TerminalMacroGreen(
28498 GreenNode {
28499 kind: SyntaxKind::TerminalMacro,
28500 details: GreenNodeDetails::Node {
28501 children: [
28502 Trivia::missing(db).0,
28503 TokenMacro::missing(db).0,
28504 Trivia::missing(db).0,
28505 ]
28506 .into(),
28507 width: TextWidth::default(),
28508 },
28509 }
28510 .intern(db),
28511 )
28512 }
28513 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28514 let kind = node.kind(db);
28515 assert_eq!(
28516 kind,
28517 SyntaxKind::TerminalMacro,
28518 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28519 kind,
28520 SyntaxKind::TerminalMacro
28521 );
28522 Self { node }
28523 }
28524 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28525 let kind = node.kind(db);
28526 if kind == SyntaxKind::TerminalMacro {
28527 Some(Self::from_syntax_node(db, node))
28528 } else {
28529 None
28530 }
28531 }
28532 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28533 self.node
28534 }
28535 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28536 TerminalMacroPtr(self.node.stable_ptr(db))
28537 }
28538}
28539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28540pub struct TokenMatch<'db> {
28541 node: SyntaxNode<'db>,
28542}
28543impl<'db> Token<'db> for TokenMatch<'db> {
28544 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28545 TokenMatchGreen(
28546 GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28547 .intern(db),
28548 )
28549 }
28550 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28551 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28552 }
28553}
28554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28555pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28556impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28557 type SyntaxNode = TokenMatch<'db>;
28558 fn untyped(self) -> SyntaxStablePtrId<'db> {
28559 self.0
28560 }
28561 fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28562 TokenMatch::from_syntax_node(db, self.0.lookup(db))
28563 }
28564}
28565impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28566 fn from(ptr: TokenMatchPtr<'db>) -> Self {
28567 ptr.untyped()
28568 }
28569}
28570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28571pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28572impl<'db> TokenMatchGreen<'db> {
28573 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28574 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28575 }
28576}
28577impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28578 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28579 type StablePtr = TokenMatchPtr<'db>;
28580 type Green = TokenMatchGreen<'db>;
28581 fn missing(db: &'db dyn Database) -> Self::Green {
28582 TokenMatchGreen(
28583 GreenNode {
28584 kind: SyntaxKind::TokenMissing,
28585 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28586 }
28587 .intern(db),
28588 )
28589 }
28590 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28591 match node.long(db).green.long(db).details {
28592 GreenNodeDetails::Token(_) => Self { node },
28593 GreenNodeDetails::Node { .. } => {
28594 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28595 }
28596 }
28597 }
28598 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28599 match node.long(db).green.long(db).details {
28600 GreenNodeDetails::Token(_) => Some(Self { node }),
28601 GreenNodeDetails::Node { .. } => None,
28602 }
28603 }
28604 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28605 self.node
28606 }
28607 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28608 TokenMatchPtr(self.node.stable_ptr(db))
28609 }
28610}
28611#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28612pub struct TerminalMatch<'db> {
28613 node: SyntaxNode<'db>,
28614}
28615impl<'db> Terminal<'db> for TerminalMatch<'db> {
28616 const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28617 type TokenType = TokenMatch<'db>;
28618 fn new_green(
28619 db: &'db dyn Database,
28620 leading_trivia: TriviaGreen<'db>,
28621 token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28622 trailing_trivia: TriviaGreen<'db>,
28623 ) -> Self::Green {
28624 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28625 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28626 TerminalMatchGreen(
28627 GreenNode {
28628 kind: SyntaxKind::TerminalMatch,
28629 details: GreenNodeDetails::Node { children: children.into(), width },
28630 }
28631 .intern(db),
28632 )
28633 }
28634 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28635 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28636 else {
28637 unreachable!("Expected a node, not a token");
28638 };
28639 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28640 }
28641}
28642impl<'db> TerminalMatch<'db> {
28643 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28644 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28645 }
28646 pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28647 TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28648 }
28649 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28650 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28651 }
28652}
28653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28654pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28655impl<'db> TerminalMatchPtr<'db> {}
28656impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28657 type SyntaxNode = TerminalMatch<'db>;
28658 fn untyped(self) -> SyntaxStablePtrId<'db> {
28659 self.0
28660 }
28661 fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28662 TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28663 }
28664}
28665impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28666 fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28667 ptr.untyped()
28668 }
28669}
28670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28671pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28672impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28673 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28674 type StablePtr = TerminalMatchPtr<'db>;
28675 type Green = TerminalMatchGreen<'db>;
28676 fn missing(db: &'db dyn Database) -> Self::Green {
28677 TerminalMatchGreen(
28678 GreenNode {
28679 kind: SyntaxKind::TerminalMatch,
28680 details: GreenNodeDetails::Node {
28681 children: [
28682 Trivia::missing(db).0,
28683 TokenMatch::missing(db).0,
28684 Trivia::missing(db).0,
28685 ]
28686 .into(),
28687 width: TextWidth::default(),
28688 },
28689 }
28690 .intern(db),
28691 )
28692 }
28693 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28694 let kind = node.kind(db);
28695 assert_eq!(
28696 kind,
28697 SyntaxKind::TerminalMatch,
28698 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28699 kind,
28700 SyntaxKind::TerminalMatch
28701 );
28702 Self { node }
28703 }
28704 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28705 let kind = node.kind(db);
28706 if kind == SyntaxKind::TerminalMatch {
28707 Some(Self::from_syntax_node(db, node))
28708 } else {
28709 None
28710 }
28711 }
28712 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28713 self.node
28714 }
28715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28716 TerminalMatchPtr(self.node.stable_ptr(db))
28717 }
28718}
28719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28720pub struct TokenModule<'db> {
28721 node: SyntaxNode<'db>,
28722}
28723impl<'db> Token<'db> for TokenModule<'db> {
28724 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28725 TokenModuleGreen(
28726 GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28727 .intern(db),
28728 )
28729 }
28730 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28731 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28732 }
28733}
28734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28735pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28736impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28737 type SyntaxNode = TokenModule<'db>;
28738 fn untyped(self) -> SyntaxStablePtrId<'db> {
28739 self.0
28740 }
28741 fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28742 TokenModule::from_syntax_node(db, self.0.lookup(db))
28743 }
28744}
28745impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28746 fn from(ptr: TokenModulePtr<'db>) -> Self {
28747 ptr.untyped()
28748 }
28749}
28750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28751pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28752impl<'db> TokenModuleGreen<'db> {
28753 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28754 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28755 }
28756}
28757impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28758 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28759 type StablePtr = TokenModulePtr<'db>;
28760 type Green = TokenModuleGreen<'db>;
28761 fn missing(db: &'db dyn Database) -> Self::Green {
28762 TokenModuleGreen(
28763 GreenNode {
28764 kind: SyntaxKind::TokenMissing,
28765 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28766 }
28767 .intern(db),
28768 )
28769 }
28770 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28771 match node.long(db).green.long(db).details {
28772 GreenNodeDetails::Token(_) => Self { node },
28773 GreenNodeDetails::Node { .. } => {
28774 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28775 }
28776 }
28777 }
28778 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28779 match node.long(db).green.long(db).details {
28780 GreenNodeDetails::Token(_) => Some(Self { node }),
28781 GreenNodeDetails::Node { .. } => None,
28782 }
28783 }
28784 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28785 self.node
28786 }
28787 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28788 TokenModulePtr(self.node.stable_ptr(db))
28789 }
28790}
28791#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28792pub struct TerminalModule<'db> {
28793 node: SyntaxNode<'db>,
28794}
28795impl<'db> Terminal<'db> for TerminalModule<'db> {
28796 const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28797 type TokenType = TokenModule<'db>;
28798 fn new_green(
28799 db: &'db dyn Database,
28800 leading_trivia: TriviaGreen<'db>,
28801 token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28802 trailing_trivia: TriviaGreen<'db>,
28803 ) -> Self::Green {
28804 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28805 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28806 TerminalModuleGreen(
28807 GreenNode {
28808 kind: SyntaxKind::TerminalModule,
28809 details: GreenNodeDetails::Node { children: children.into(), width },
28810 }
28811 .intern(db),
28812 )
28813 }
28814 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28815 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28816 else {
28817 unreachable!("Expected a node, not a token");
28818 };
28819 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28820 }
28821}
28822impl<'db> TerminalModule<'db> {
28823 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28824 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28825 }
28826 pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28827 TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28828 }
28829 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28830 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28831 }
28832}
28833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28834pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28835impl<'db> TerminalModulePtr<'db> {}
28836impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28837 type SyntaxNode = TerminalModule<'db>;
28838 fn untyped(self) -> SyntaxStablePtrId<'db> {
28839 self.0
28840 }
28841 fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28842 TerminalModule::from_syntax_node(db, self.0.lookup(db))
28843 }
28844}
28845impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28846 fn from(ptr: TerminalModulePtr<'db>) -> Self {
28847 ptr.untyped()
28848 }
28849}
28850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28851pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28852impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28853 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28854 type StablePtr = TerminalModulePtr<'db>;
28855 type Green = TerminalModuleGreen<'db>;
28856 fn missing(db: &'db dyn Database) -> Self::Green {
28857 TerminalModuleGreen(
28858 GreenNode {
28859 kind: SyntaxKind::TerminalModule,
28860 details: GreenNodeDetails::Node {
28861 children: [
28862 Trivia::missing(db).0,
28863 TokenModule::missing(db).0,
28864 Trivia::missing(db).0,
28865 ]
28866 .into(),
28867 width: TextWidth::default(),
28868 },
28869 }
28870 .intern(db),
28871 )
28872 }
28873 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28874 let kind = node.kind(db);
28875 assert_eq!(
28876 kind,
28877 SyntaxKind::TerminalModule,
28878 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28879 kind,
28880 SyntaxKind::TerminalModule
28881 );
28882 Self { node }
28883 }
28884 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28885 let kind = node.kind(db);
28886 if kind == SyntaxKind::TerminalModule {
28887 Some(Self::from_syntax_node(db, node))
28888 } else {
28889 None
28890 }
28891 }
28892 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28893 self.node
28894 }
28895 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28896 TerminalModulePtr(self.node.stable_ptr(db))
28897 }
28898}
28899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28900pub struct TokenMut<'db> {
28901 node: SyntaxNode<'db>,
28902}
28903impl<'db> Token<'db> for TokenMut<'db> {
28904 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28905 TokenMutGreen(
28906 GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28907 .intern(db),
28908 )
28909 }
28910 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28911 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28912 }
28913}
28914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28915pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28916impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28917 type SyntaxNode = TokenMut<'db>;
28918 fn untyped(self) -> SyntaxStablePtrId<'db> {
28919 self.0
28920 }
28921 fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28922 TokenMut::from_syntax_node(db, self.0.lookup(db))
28923 }
28924}
28925impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28926 fn from(ptr: TokenMutPtr<'db>) -> Self {
28927 ptr.untyped()
28928 }
28929}
28930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28931pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28932impl<'db> TokenMutGreen<'db> {
28933 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28934 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28935 }
28936}
28937impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28938 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28939 type StablePtr = TokenMutPtr<'db>;
28940 type Green = TokenMutGreen<'db>;
28941 fn missing(db: &'db dyn Database) -> Self::Green {
28942 TokenMutGreen(
28943 GreenNode {
28944 kind: SyntaxKind::TokenMissing,
28945 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28946 }
28947 .intern(db),
28948 )
28949 }
28950 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28951 match node.long(db).green.long(db).details {
28952 GreenNodeDetails::Token(_) => Self { node },
28953 GreenNodeDetails::Node { .. } => {
28954 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28955 }
28956 }
28957 }
28958 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28959 match node.long(db).green.long(db).details {
28960 GreenNodeDetails::Token(_) => Some(Self { node }),
28961 GreenNodeDetails::Node { .. } => None,
28962 }
28963 }
28964 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28965 self.node
28966 }
28967 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28968 TokenMutPtr(self.node.stable_ptr(db))
28969 }
28970}
28971#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28972pub struct TerminalMut<'db> {
28973 node: SyntaxNode<'db>,
28974}
28975impl<'db> Terminal<'db> for TerminalMut<'db> {
28976 const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28977 type TokenType = TokenMut<'db>;
28978 fn new_green(
28979 db: &'db dyn Database,
28980 leading_trivia: TriviaGreen<'db>,
28981 token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28982 trailing_trivia: TriviaGreen<'db>,
28983 ) -> Self::Green {
28984 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28985 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28986 TerminalMutGreen(
28987 GreenNode {
28988 kind: SyntaxKind::TerminalMut,
28989 details: GreenNodeDetails::Node { children: children.into(), width },
28990 }
28991 .intern(db),
28992 )
28993 }
28994 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28995 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28996 else {
28997 unreachable!("Expected a node, not a token");
28998 };
28999 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29000 }
29001}
29002impl<'db> TerminalMut<'db> {
29003 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29004 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29005 }
29006 pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
29007 TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
29008 }
29009 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29010 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29011 }
29012}
29013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29014pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
29015impl<'db> TerminalMutPtr<'db> {}
29016impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
29017 type SyntaxNode = TerminalMut<'db>;
29018 fn untyped(self) -> SyntaxStablePtrId<'db> {
29019 self.0
29020 }
29021 fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
29022 TerminalMut::from_syntax_node(db, self.0.lookup(db))
29023 }
29024}
29025impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
29026 fn from(ptr: TerminalMutPtr<'db>) -> Self {
29027 ptr.untyped()
29028 }
29029}
29030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29031pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
29032impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
29033 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
29034 type StablePtr = TerminalMutPtr<'db>;
29035 type Green = TerminalMutGreen<'db>;
29036 fn missing(db: &'db dyn Database) -> Self::Green {
29037 TerminalMutGreen(
29038 GreenNode {
29039 kind: SyntaxKind::TerminalMut,
29040 details: GreenNodeDetails::Node {
29041 children: [
29042 Trivia::missing(db).0,
29043 TokenMut::missing(db).0,
29044 Trivia::missing(db).0,
29045 ]
29046 .into(),
29047 width: TextWidth::default(),
29048 },
29049 }
29050 .intern(db),
29051 )
29052 }
29053 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29054 let kind = node.kind(db);
29055 assert_eq!(
29056 kind,
29057 SyntaxKind::TerminalMut,
29058 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29059 kind,
29060 SyntaxKind::TerminalMut
29061 );
29062 Self { node }
29063 }
29064 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29065 let kind = node.kind(db);
29066 if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
29067 }
29068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29069 self.node
29070 }
29071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29072 TerminalMutPtr(self.node.stable_ptr(db))
29073 }
29074}
29075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29076pub struct TokenNoPanic<'db> {
29077 node: SyntaxNode<'db>,
29078}
29079impl<'db> Token<'db> for TokenNoPanic<'db> {
29080 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29081 TokenNoPanicGreen(
29082 GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
29083 .intern(db),
29084 )
29085 }
29086 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29087 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29088 }
29089}
29090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29091pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29092impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
29093 type SyntaxNode = TokenNoPanic<'db>;
29094 fn untyped(self) -> SyntaxStablePtrId<'db> {
29095 self.0
29096 }
29097 fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29098 TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
29099 }
29100}
29101impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29102 fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
29103 ptr.untyped()
29104 }
29105}
29106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29107pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
29108impl<'db> TokenNoPanicGreen<'db> {
29109 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29110 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29111 }
29112}
29113impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
29114 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
29115 type StablePtr = TokenNoPanicPtr<'db>;
29116 type Green = TokenNoPanicGreen<'db>;
29117 fn missing(db: &'db dyn Database) -> Self::Green {
29118 TokenNoPanicGreen(
29119 GreenNode {
29120 kind: SyntaxKind::TokenMissing,
29121 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29122 }
29123 .intern(db),
29124 )
29125 }
29126 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29127 match node.long(db).green.long(db).details {
29128 GreenNodeDetails::Token(_) => Self { node },
29129 GreenNodeDetails::Node { .. } => {
29130 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
29131 }
29132 }
29133 }
29134 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29135 match node.long(db).green.long(db).details {
29136 GreenNodeDetails::Token(_) => Some(Self { node }),
29137 GreenNodeDetails::Node { .. } => None,
29138 }
29139 }
29140 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29141 self.node
29142 }
29143 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29144 TokenNoPanicPtr(self.node.stable_ptr(db))
29145 }
29146}
29147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29148pub struct TerminalNoPanic<'db> {
29149 node: SyntaxNode<'db>,
29150}
29151impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
29152 const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
29153 type TokenType = TokenNoPanic<'db>;
29154 fn new_green(
29155 db: &'db dyn Database,
29156 leading_trivia: TriviaGreen<'db>,
29157 token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29158 trailing_trivia: TriviaGreen<'db>,
29159 ) -> Self::Green {
29160 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29161 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29162 TerminalNoPanicGreen(
29163 GreenNode {
29164 kind: SyntaxKind::TerminalNoPanic,
29165 details: GreenNodeDetails::Node { children: children.into(), width },
29166 }
29167 .intern(db),
29168 )
29169 }
29170 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29171 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29172 else {
29173 unreachable!("Expected a node, not a token");
29174 };
29175 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29176 }
29177}
29178impl<'db> TerminalNoPanic<'db> {
29179 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29180 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29181 }
29182 pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29183 TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
29184 }
29185 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29186 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29187 }
29188}
29189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29190pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29191impl<'db> TerminalNoPanicPtr<'db> {}
29192impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
29193 type SyntaxNode = TerminalNoPanic<'db>;
29194 fn untyped(self) -> SyntaxStablePtrId<'db> {
29195 self.0
29196 }
29197 fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
29198 TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
29199 }
29200}
29201impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29202 fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
29203 ptr.untyped()
29204 }
29205}
29206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29207pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
29208impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
29209 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
29210 type StablePtr = TerminalNoPanicPtr<'db>;
29211 type Green = TerminalNoPanicGreen<'db>;
29212 fn missing(db: &'db dyn Database) -> Self::Green {
29213 TerminalNoPanicGreen(
29214 GreenNode {
29215 kind: SyntaxKind::TerminalNoPanic,
29216 details: GreenNodeDetails::Node {
29217 children: [
29218 Trivia::missing(db).0,
29219 TokenNoPanic::missing(db).0,
29220 Trivia::missing(db).0,
29221 ]
29222 .into(),
29223 width: TextWidth::default(),
29224 },
29225 }
29226 .intern(db),
29227 )
29228 }
29229 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29230 let kind = node.kind(db);
29231 assert_eq!(
29232 kind,
29233 SyntaxKind::TerminalNoPanic,
29234 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29235 kind,
29236 SyntaxKind::TerminalNoPanic
29237 );
29238 Self { node }
29239 }
29240 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29241 let kind = node.kind(db);
29242 if kind == SyntaxKind::TerminalNoPanic {
29243 Some(Self::from_syntax_node(db, node))
29244 } else {
29245 None
29246 }
29247 }
29248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29249 self.node
29250 }
29251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29252 TerminalNoPanicPtr(self.node.stable_ptr(db))
29253 }
29254}
29255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29256pub struct TokenOf<'db> {
29257 node: SyntaxNode<'db>,
29258}
29259impl<'db> Token<'db> for TokenOf<'db> {
29260 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29261 TokenOfGreen(
29262 GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
29263 .intern(db),
29264 )
29265 }
29266 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29267 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29268 }
29269}
29270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29271pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29272impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
29273 type SyntaxNode = TokenOf<'db>;
29274 fn untyped(self) -> SyntaxStablePtrId<'db> {
29275 self.0
29276 }
29277 fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
29278 TokenOf::from_syntax_node(db, self.0.lookup(db))
29279 }
29280}
29281impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
29282 fn from(ptr: TokenOfPtr<'db>) -> Self {
29283 ptr.untyped()
29284 }
29285}
29286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29287pub struct TokenOfGreen<'db>(pub GreenId<'db>);
29288impl<'db> TokenOfGreen<'db> {
29289 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29290 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29291 }
29292}
29293impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
29294 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
29295 type StablePtr = TokenOfPtr<'db>;
29296 type Green = TokenOfGreen<'db>;
29297 fn missing(db: &'db dyn Database) -> Self::Green {
29298 TokenOfGreen(
29299 GreenNode {
29300 kind: SyntaxKind::TokenMissing,
29301 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29302 }
29303 .intern(db),
29304 )
29305 }
29306 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29307 match node.long(db).green.long(db).details {
29308 GreenNodeDetails::Token(_) => Self { node },
29309 GreenNodeDetails::Node { .. } => {
29310 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
29311 }
29312 }
29313 }
29314 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29315 match node.long(db).green.long(db).details {
29316 GreenNodeDetails::Token(_) => Some(Self { node }),
29317 GreenNodeDetails::Node { .. } => None,
29318 }
29319 }
29320 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29321 self.node
29322 }
29323 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29324 TokenOfPtr(self.node.stable_ptr(db))
29325 }
29326}
29327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29328pub struct TerminalOf<'db> {
29329 node: SyntaxNode<'db>,
29330}
29331impl<'db> Terminal<'db> for TerminalOf<'db> {
29332 const KIND: SyntaxKind = SyntaxKind::TerminalOf;
29333 type TokenType = TokenOf<'db>;
29334 fn new_green(
29335 db: &'db dyn Database,
29336 leading_trivia: TriviaGreen<'db>,
29337 token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29338 trailing_trivia: TriviaGreen<'db>,
29339 ) -> Self::Green {
29340 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29341 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29342 TerminalOfGreen(
29343 GreenNode {
29344 kind: SyntaxKind::TerminalOf,
29345 details: GreenNodeDetails::Node { children: children.into(), width },
29346 }
29347 .intern(db),
29348 )
29349 }
29350 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29351 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29352 else {
29353 unreachable!("Expected a node, not a token");
29354 };
29355 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29356 }
29357}
29358impl<'db> TerminalOf<'db> {
29359 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29360 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29361 }
29362 pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
29363 TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
29364 }
29365 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29366 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29367 }
29368}
29369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29370pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29371impl<'db> TerminalOfPtr<'db> {}
29372impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
29373 type SyntaxNode = TerminalOf<'db>;
29374 fn untyped(self) -> SyntaxStablePtrId<'db> {
29375 self.0
29376 }
29377 fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
29378 TerminalOf::from_syntax_node(db, self.0.lookup(db))
29379 }
29380}
29381impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
29382 fn from(ptr: TerminalOfPtr<'db>) -> Self {
29383 ptr.untyped()
29384 }
29385}
29386#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29387pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
29388impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
29389 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
29390 type StablePtr = TerminalOfPtr<'db>;
29391 type Green = TerminalOfGreen<'db>;
29392 fn missing(db: &'db dyn Database) -> Self::Green {
29393 TerminalOfGreen(
29394 GreenNode {
29395 kind: SyntaxKind::TerminalOf,
29396 details: GreenNodeDetails::Node {
29397 children: [
29398 Trivia::missing(db).0,
29399 TokenOf::missing(db).0,
29400 Trivia::missing(db).0,
29401 ]
29402 .into(),
29403 width: TextWidth::default(),
29404 },
29405 }
29406 .intern(db),
29407 )
29408 }
29409 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29410 let kind = node.kind(db);
29411 assert_eq!(
29412 kind,
29413 SyntaxKind::TerminalOf,
29414 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29415 kind,
29416 SyntaxKind::TerminalOf
29417 );
29418 Self { node }
29419 }
29420 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29421 let kind = node.kind(db);
29422 if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29423 }
29424 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29425 self.node
29426 }
29427 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29428 TerminalOfPtr(self.node.stable_ptr(db))
29429 }
29430}
29431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29432pub struct TokenRef<'db> {
29433 node: SyntaxNode<'db>,
29434}
29435impl<'db> Token<'db> for TokenRef<'db> {
29436 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29437 TokenRefGreen(
29438 GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29439 .intern(db),
29440 )
29441 }
29442 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29443 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29444 }
29445}
29446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29447pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29448impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29449 type SyntaxNode = TokenRef<'db>;
29450 fn untyped(self) -> SyntaxStablePtrId<'db> {
29451 self.0
29452 }
29453 fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29454 TokenRef::from_syntax_node(db, self.0.lookup(db))
29455 }
29456}
29457impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29458 fn from(ptr: TokenRefPtr<'db>) -> Self {
29459 ptr.untyped()
29460 }
29461}
29462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29463pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29464impl<'db> TokenRefGreen<'db> {
29465 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29466 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29467 }
29468}
29469impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29470 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29471 type StablePtr = TokenRefPtr<'db>;
29472 type Green = TokenRefGreen<'db>;
29473 fn missing(db: &'db dyn Database) -> Self::Green {
29474 TokenRefGreen(
29475 GreenNode {
29476 kind: SyntaxKind::TokenMissing,
29477 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29478 }
29479 .intern(db),
29480 )
29481 }
29482 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29483 match node.long(db).green.long(db).details {
29484 GreenNodeDetails::Token(_) => Self { node },
29485 GreenNodeDetails::Node { .. } => {
29486 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29487 }
29488 }
29489 }
29490 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29491 match node.long(db).green.long(db).details {
29492 GreenNodeDetails::Token(_) => Some(Self { node }),
29493 GreenNodeDetails::Node { .. } => None,
29494 }
29495 }
29496 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29497 self.node
29498 }
29499 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29500 TokenRefPtr(self.node.stable_ptr(db))
29501 }
29502}
29503#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29504pub struct TerminalRef<'db> {
29505 node: SyntaxNode<'db>,
29506}
29507impl<'db> Terminal<'db> for TerminalRef<'db> {
29508 const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29509 type TokenType = TokenRef<'db>;
29510 fn new_green(
29511 db: &'db dyn Database,
29512 leading_trivia: TriviaGreen<'db>,
29513 token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29514 trailing_trivia: TriviaGreen<'db>,
29515 ) -> Self::Green {
29516 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29517 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29518 TerminalRefGreen(
29519 GreenNode {
29520 kind: SyntaxKind::TerminalRef,
29521 details: GreenNodeDetails::Node { children: children.into(), width },
29522 }
29523 .intern(db),
29524 )
29525 }
29526 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29527 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29528 else {
29529 unreachable!("Expected a node, not a token");
29530 };
29531 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29532 }
29533}
29534impl<'db> TerminalRef<'db> {
29535 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29536 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29537 }
29538 pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29539 TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29540 }
29541 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29542 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29543 }
29544}
29545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29546pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29547impl<'db> TerminalRefPtr<'db> {}
29548impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29549 type SyntaxNode = TerminalRef<'db>;
29550 fn untyped(self) -> SyntaxStablePtrId<'db> {
29551 self.0
29552 }
29553 fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29554 TerminalRef::from_syntax_node(db, self.0.lookup(db))
29555 }
29556}
29557impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29558 fn from(ptr: TerminalRefPtr<'db>) -> Self {
29559 ptr.untyped()
29560 }
29561}
29562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29563pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29564impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29565 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29566 type StablePtr = TerminalRefPtr<'db>;
29567 type Green = TerminalRefGreen<'db>;
29568 fn missing(db: &'db dyn Database) -> Self::Green {
29569 TerminalRefGreen(
29570 GreenNode {
29571 kind: SyntaxKind::TerminalRef,
29572 details: GreenNodeDetails::Node {
29573 children: [
29574 Trivia::missing(db).0,
29575 TokenRef::missing(db).0,
29576 Trivia::missing(db).0,
29577 ]
29578 .into(),
29579 width: TextWidth::default(),
29580 },
29581 }
29582 .intern(db),
29583 )
29584 }
29585 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29586 let kind = node.kind(db);
29587 assert_eq!(
29588 kind,
29589 SyntaxKind::TerminalRef,
29590 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29591 kind,
29592 SyntaxKind::TerminalRef
29593 );
29594 Self { node }
29595 }
29596 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29597 let kind = node.kind(db);
29598 if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29599 }
29600 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29601 self.node
29602 }
29603 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29604 TerminalRefPtr(self.node.stable_ptr(db))
29605 }
29606}
29607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29608pub struct TokenContinue<'db> {
29609 node: SyntaxNode<'db>,
29610}
29611impl<'db> Token<'db> for TokenContinue<'db> {
29612 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29613 TokenContinueGreen(
29614 GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29615 .intern(db),
29616 )
29617 }
29618 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29619 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29620 }
29621}
29622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29623pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29624impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29625 type SyntaxNode = TokenContinue<'db>;
29626 fn untyped(self) -> SyntaxStablePtrId<'db> {
29627 self.0
29628 }
29629 fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29630 TokenContinue::from_syntax_node(db, self.0.lookup(db))
29631 }
29632}
29633impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29634 fn from(ptr: TokenContinuePtr<'db>) -> Self {
29635 ptr.untyped()
29636 }
29637}
29638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29639pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29640impl<'db> TokenContinueGreen<'db> {
29641 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29642 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29643 }
29644}
29645impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29646 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29647 type StablePtr = TokenContinuePtr<'db>;
29648 type Green = TokenContinueGreen<'db>;
29649 fn missing(db: &'db dyn Database) -> Self::Green {
29650 TokenContinueGreen(
29651 GreenNode {
29652 kind: SyntaxKind::TokenMissing,
29653 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29654 }
29655 .intern(db),
29656 )
29657 }
29658 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29659 match node.long(db).green.long(db).details {
29660 GreenNodeDetails::Token(_) => Self { node },
29661 GreenNodeDetails::Node { .. } => {
29662 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29663 }
29664 }
29665 }
29666 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29667 match node.long(db).green.long(db).details {
29668 GreenNodeDetails::Token(_) => Some(Self { node }),
29669 GreenNodeDetails::Node { .. } => None,
29670 }
29671 }
29672 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29673 self.node
29674 }
29675 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29676 TokenContinuePtr(self.node.stable_ptr(db))
29677 }
29678}
29679#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29680pub struct TerminalContinue<'db> {
29681 node: SyntaxNode<'db>,
29682}
29683impl<'db> Terminal<'db> for TerminalContinue<'db> {
29684 const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29685 type TokenType = TokenContinue<'db>;
29686 fn new_green(
29687 db: &'db dyn Database,
29688 leading_trivia: TriviaGreen<'db>,
29689 token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29690 trailing_trivia: TriviaGreen<'db>,
29691 ) -> Self::Green {
29692 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29693 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29694 TerminalContinueGreen(
29695 GreenNode {
29696 kind: SyntaxKind::TerminalContinue,
29697 details: GreenNodeDetails::Node { children: children.into(), width },
29698 }
29699 .intern(db),
29700 )
29701 }
29702 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29703 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29704 else {
29705 unreachable!("Expected a node, not a token");
29706 };
29707 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29708 }
29709}
29710impl<'db> TerminalContinue<'db> {
29711 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29712 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29713 }
29714 pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29715 TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29716 }
29717 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29718 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29719 }
29720}
29721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29722pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29723impl<'db> TerminalContinuePtr<'db> {}
29724impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29725 type SyntaxNode = TerminalContinue<'db>;
29726 fn untyped(self) -> SyntaxStablePtrId<'db> {
29727 self.0
29728 }
29729 fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29730 TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29731 }
29732}
29733impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29734 fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29735 ptr.untyped()
29736 }
29737}
29738#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29739pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29740impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29741 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29742 type StablePtr = TerminalContinuePtr<'db>;
29743 type Green = TerminalContinueGreen<'db>;
29744 fn missing(db: &'db dyn Database) -> Self::Green {
29745 TerminalContinueGreen(
29746 GreenNode {
29747 kind: SyntaxKind::TerminalContinue,
29748 details: GreenNodeDetails::Node {
29749 children: [
29750 Trivia::missing(db).0,
29751 TokenContinue::missing(db).0,
29752 Trivia::missing(db).0,
29753 ]
29754 .into(),
29755 width: TextWidth::default(),
29756 },
29757 }
29758 .intern(db),
29759 )
29760 }
29761 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29762 let kind = node.kind(db);
29763 assert_eq!(
29764 kind,
29765 SyntaxKind::TerminalContinue,
29766 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29767 kind,
29768 SyntaxKind::TerminalContinue
29769 );
29770 Self { node }
29771 }
29772 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29773 let kind = node.kind(db);
29774 if kind == SyntaxKind::TerminalContinue {
29775 Some(Self::from_syntax_node(db, node))
29776 } else {
29777 None
29778 }
29779 }
29780 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29781 self.node
29782 }
29783 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29784 TerminalContinuePtr(self.node.stable_ptr(db))
29785 }
29786}
29787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29788pub struct TokenReturn<'db> {
29789 node: SyntaxNode<'db>,
29790}
29791impl<'db> Token<'db> for TokenReturn<'db> {
29792 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29793 TokenReturnGreen(
29794 GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29795 .intern(db),
29796 )
29797 }
29798 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29799 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29800 }
29801}
29802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29803pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29804impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29805 type SyntaxNode = TokenReturn<'db>;
29806 fn untyped(self) -> SyntaxStablePtrId<'db> {
29807 self.0
29808 }
29809 fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29810 TokenReturn::from_syntax_node(db, self.0.lookup(db))
29811 }
29812}
29813impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29814 fn from(ptr: TokenReturnPtr<'db>) -> Self {
29815 ptr.untyped()
29816 }
29817}
29818#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29819pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29820impl<'db> TokenReturnGreen<'db> {
29821 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29822 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29823 }
29824}
29825impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29826 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29827 type StablePtr = TokenReturnPtr<'db>;
29828 type Green = TokenReturnGreen<'db>;
29829 fn missing(db: &'db dyn Database) -> Self::Green {
29830 TokenReturnGreen(
29831 GreenNode {
29832 kind: SyntaxKind::TokenMissing,
29833 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29834 }
29835 .intern(db),
29836 )
29837 }
29838 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29839 match node.long(db).green.long(db).details {
29840 GreenNodeDetails::Token(_) => Self { node },
29841 GreenNodeDetails::Node { .. } => {
29842 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29843 }
29844 }
29845 }
29846 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29847 match node.long(db).green.long(db).details {
29848 GreenNodeDetails::Token(_) => Some(Self { node }),
29849 GreenNodeDetails::Node { .. } => None,
29850 }
29851 }
29852 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29853 self.node
29854 }
29855 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29856 TokenReturnPtr(self.node.stable_ptr(db))
29857 }
29858}
29859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29860pub struct TerminalReturn<'db> {
29861 node: SyntaxNode<'db>,
29862}
29863impl<'db> Terminal<'db> for TerminalReturn<'db> {
29864 const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29865 type TokenType = TokenReturn<'db>;
29866 fn new_green(
29867 db: &'db dyn Database,
29868 leading_trivia: TriviaGreen<'db>,
29869 token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29870 trailing_trivia: TriviaGreen<'db>,
29871 ) -> Self::Green {
29872 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29873 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29874 TerminalReturnGreen(
29875 GreenNode {
29876 kind: SyntaxKind::TerminalReturn,
29877 details: GreenNodeDetails::Node { children: children.into(), width },
29878 }
29879 .intern(db),
29880 )
29881 }
29882 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29883 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29884 else {
29885 unreachable!("Expected a node, not a token");
29886 };
29887 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29888 }
29889}
29890impl<'db> TerminalReturn<'db> {
29891 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29892 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29893 }
29894 pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29895 TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29896 }
29897 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29898 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29899 }
29900}
29901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29902pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29903impl<'db> TerminalReturnPtr<'db> {}
29904impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29905 type SyntaxNode = TerminalReturn<'db>;
29906 fn untyped(self) -> SyntaxStablePtrId<'db> {
29907 self.0
29908 }
29909 fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29910 TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29911 }
29912}
29913impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29914 fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29915 ptr.untyped()
29916 }
29917}
29918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29919pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29920impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29921 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29922 type StablePtr = TerminalReturnPtr<'db>;
29923 type Green = TerminalReturnGreen<'db>;
29924 fn missing(db: &'db dyn Database) -> Self::Green {
29925 TerminalReturnGreen(
29926 GreenNode {
29927 kind: SyntaxKind::TerminalReturn,
29928 details: GreenNodeDetails::Node {
29929 children: [
29930 Trivia::missing(db).0,
29931 TokenReturn::missing(db).0,
29932 Trivia::missing(db).0,
29933 ]
29934 .into(),
29935 width: TextWidth::default(),
29936 },
29937 }
29938 .intern(db),
29939 )
29940 }
29941 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29942 let kind = node.kind(db);
29943 assert_eq!(
29944 kind,
29945 SyntaxKind::TerminalReturn,
29946 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29947 kind,
29948 SyntaxKind::TerminalReturn
29949 );
29950 Self { node }
29951 }
29952 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29953 let kind = node.kind(db);
29954 if kind == SyntaxKind::TerminalReturn {
29955 Some(Self::from_syntax_node(db, node))
29956 } else {
29957 None
29958 }
29959 }
29960 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29961 self.node
29962 }
29963 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29964 TerminalReturnPtr(self.node.stable_ptr(db))
29965 }
29966}
29967#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29968pub struct TokenBreak<'db> {
29969 node: SyntaxNode<'db>,
29970}
29971impl<'db> Token<'db> for TokenBreak<'db> {
29972 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29973 TokenBreakGreen(
29974 GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29975 .intern(db),
29976 )
29977 }
29978 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29979 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29980 }
29981}
29982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29983pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29984impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29985 type SyntaxNode = TokenBreak<'db>;
29986 fn untyped(self) -> SyntaxStablePtrId<'db> {
29987 self.0
29988 }
29989 fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29990 TokenBreak::from_syntax_node(db, self.0.lookup(db))
29991 }
29992}
29993impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29994 fn from(ptr: TokenBreakPtr<'db>) -> Self {
29995 ptr.untyped()
29996 }
29997}
29998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29999pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
30000impl<'db> TokenBreakGreen<'db> {
30001 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30002 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30003 }
30004}
30005impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
30006 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
30007 type StablePtr = TokenBreakPtr<'db>;
30008 type Green = TokenBreakGreen<'db>;
30009 fn missing(db: &'db dyn Database) -> Self::Green {
30010 TokenBreakGreen(
30011 GreenNode {
30012 kind: SyntaxKind::TokenMissing,
30013 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30014 }
30015 .intern(db),
30016 )
30017 }
30018 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30019 match node.long(db).green.long(db).details {
30020 GreenNodeDetails::Token(_) => Self { node },
30021 GreenNodeDetails::Node { .. } => {
30022 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
30023 }
30024 }
30025 }
30026 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30027 match node.long(db).green.long(db).details {
30028 GreenNodeDetails::Token(_) => Some(Self { node }),
30029 GreenNodeDetails::Node { .. } => None,
30030 }
30031 }
30032 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30033 self.node
30034 }
30035 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30036 TokenBreakPtr(self.node.stable_ptr(db))
30037 }
30038}
30039#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30040pub struct TerminalBreak<'db> {
30041 node: SyntaxNode<'db>,
30042}
30043impl<'db> Terminal<'db> for TerminalBreak<'db> {
30044 const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
30045 type TokenType = TokenBreak<'db>;
30046 fn new_green(
30047 db: &'db dyn Database,
30048 leading_trivia: TriviaGreen<'db>,
30049 token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30050 trailing_trivia: TriviaGreen<'db>,
30051 ) -> Self::Green {
30052 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30053 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30054 TerminalBreakGreen(
30055 GreenNode {
30056 kind: SyntaxKind::TerminalBreak,
30057 details: GreenNodeDetails::Node { children: children.into(), width },
30058 }
30059 .intern(db),
30060 )
30061 }
30062 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30063 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30064 else {
30065 unreachable!("Expected a node, not a token");
30066 };
30067 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30068 }
30069}
30070impl<'db> TerminalBreak<'db> {
30071 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30072 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30073 }
30074 pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
30075 TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
30076 }
30077 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30078 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30079 }
30080}
30081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30082pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
30083impl<'db> TerminalBreakPtr<'db> {}
30084impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
30085 type SyntaxNode = TerminalBreak<'db>;
30086 fn untyped(self) -> SyntaxStablePtrId<'db> {
30087 self.0
30088 }
30089 fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
30090 TerminalBreak::from_syntax_node(db, self.0.lookup(db))
30091 }
30092}
30093impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
30094 fn from(ptr: TerminalBreakPtr<'db>) -> Self {
30095 ptr.untyped()
30096 }
30097}
30098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30099pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
30100impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
30101 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
30102 type StablePtr = TerminalBreakPtr<'db>;
30103 type Green = TerminalBreakGreen<'db>;
30104 fn missing(db: &'db dyn Database) -> Self::Green {
30105 TerminalBreakGreen(
30106 GreenNode {
30107 kind: SyntaxKind::TerminalBreak,
30108 details: GreenNodeDetails::Node {
30109 children: [
30110 Trivia::missing(db).0,
30111 TokenBreak::missing(db).0,
30112 Trivia::missing(db).0,
30113 ]
30114 .into(),
30115 width: TextWidth::default(),
30116 },
30117 }
30118 .intern(db),
30119 )
30120 }
30121 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30122 let kind = node.kind(db);
30123 assert_eq!(
30124 kind,
30125 SyntaxKind::TerminalBreak,
30126 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30127 kind,
30128 SyntaxKind::TerminalBreak
30129 );
30130 Self { node }
30131 }
30132 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30133 let kind = node.kind(db);
30134 if kind == SyntaxKind::TerminalBreak {
30135 Some(Self::from_syntax_node(db, node))
30136 } else {
30137 None
30138 }
30139 }
30140 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30141 self.node
30142 }
30143 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30144 TerminalBreakPtr(self.node.stable_ptr(db))
30145 }
30146}
30147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30148pub struct TokenStruct<'db> {
30149 node: SyntaxNode<'db>,
30150}
30151impl<'db> Token<'db> for TokenStruct<'db> {
30152 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30153 TokenStructGreen(
30154 GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
30155 .intern(db),
30156 )
30157 }
30158 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30159 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30160 }
30161}
30162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30163pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30164impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
30165 type SyntaxNode = TokenStruct<'db>;
30166 fn untyped(self) -> SyntaxStablePtrId<'db> {
30167 self.0
30168 }
30169 fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30170 TokenStruct::from_syntax_node(db, self.0.lookup(db))
30171 }
30172}
30173impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
30174 fn from(ptr: TokenStructPtr<'db>) -> Self {
30175 ptr.untyped()
30176 }
30177}
30178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30179pub struct TokenStructGreen<'db>(pub GreenId<'db>);
30180impl<'db> TokenStructGreen<'db> {
30181 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30182 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30183 }
30184}
30185impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
30186 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
30187 type StablePtr = TokenStructPtr<'db>;
30188 type Green = TokenStructGreen<'db>;
30189 fn missing(db: &'db dyn Database) -> Self::Green {
30190 TokenStructGreen(
30191 GreenNode {
30192 kind: SyntaxKind::TokenMissing,
30193 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30194 }
30195 .intern(db),
30196 )
30197 }
30198 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30199 match node.long(db).green.long(db).details {
30200 GreenNodeDetails::Token(_) => Self { node },
30201 GreenNodeDetails::Node { .. } => {
30202 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
30203 }
30204 }
30205 }
30206 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30207 match node.long(db).green.long(db).details {
30208 GreenNodeDetails::Token(_) => Some(Self { node }),
30209 GreenNodeDetails::Node { .. } => None,
30210 }
30211 }
30212 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30213 self.node
30214 }
30215 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30216 TokenStructPtr(self.node.stable_ptr(db))
30217 }
30218}
30219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30220pub struct TerminalStruct<'db> {
30221 node: SyntaxNode<'db>,
30222}
30223impl<'db> Terminal<'db> for TerminalStruct<'db> {
30224 const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
30225 type TokenType = TokenStruct<'db>;
30226 fn new_green(
30227 db: &'db dyn Database,
30228 leading_trivia: TriviaGreen<'db>,
30229 token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30230 trailing_trivia: TriviaGreen<'db>,
30231 ) -> Self::Green {
30232 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30233 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30234 TerminalStructGreen(
30235 GreenNode {
30236 kind: SyntaxKind::TerminalStruct,
30237 details: GreenNodeDetails::Node { children: children.into(), width },
30238 }
30239 .intern(db),
30240 )
30241 }
30242 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30243 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30244 else {
30245 unreachable!("Expected a node, not a token");
30246 };
30247 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30248 }
30249}
30250impl<'db> TerminalStruct<'db> {
30251 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30252 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30253 }
30254 pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30255 TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
30256 }
30257 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30258 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30259 }
30260}
30261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30262pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30263impl<'db> TerminalStructPtr<'db> {}
30264impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
30265 type SyntaxNode = TerminalStruct<'db>;
30266 fn untyped(self) -> SyntaxStablePtrId<'db> {
30267 self.0
30268 }
30269 fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
30270 TerminalStruct::from_syntax_node(db, self.0.lookup(db))
30271 }
30272}
30273impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
30274 fn from(ptr: TerminalStructPtr<'db>) -> Self {
30275 ptr.untyped()
30276 }
30277}
30278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30279pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
30280impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
30281 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
30282 type StablePtr = TerminalStructPtr<'db>;
30283 type Green = TerminalStructGreen<'db>;
30284 fn missing(db: &'db dyn Database) -> Self::Green {
30285 TerminalStructGreen(
30286 GreenNode {
30287 kind: SyntaxKind::TerminalStruct,
30288 details: GreenNodeDetails::Node {
30289 children: [
30290 Trivia::missing(db).0,
30291 TokenStruct::missing(db).0,
30292 Trivia::missing(db).0,
30293 ]
30294 .into(),
30295 width: TextWidth::default(),
30296 },
30297 }
30298 .intern(db),
30299 )
30300 }
30301 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30302 let kind = node.kind(db);
30303 assert_eq!(
30304 kind,
30305 SyntaxKind::TerminalStruct,
30306 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30307 kind,
30308 SyntaxKind::TerminalStruct
30309 );
30310 Self { node }
30311 }
30312 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30313 let kind = node.kind(db);
30314 if kind == SyntaxKind::TerminalStruct {
30315 Some(Self::from_syntax_node(db, node))
30316 } else {
30317 None
30318 }
30319 }
30320 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30321 self.node
30322 }
30323 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30324 TerminalStructPtr(self.node.stable_ptr(db))
30325 }
30326}
30327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30328pub struct TokenTrait<'db> {
30329 node: SyntaxNode<'db>,
30330}
30331impl<'db> Token<'db> for TokenTrait<'db> {
30332 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30333 TokenTraitGreen(
30334 GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
30335 .intern(db),
30336 )
30337 }
30338 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30339 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30340 }
30341}
30342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30343pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30344impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
30345 type SyntaxNode = TokenTrait<'db>;
30346 fn untyped(self) -> SyntaxStablePtrId<'db> {
30347 self.0
30348 }
30349 fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30350 TokenTrait::from_syntax_node(db, self.0.lookup(db))
30351 }
30352}
30353impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30354 fn from(ptr: TokenTraitPtr<'db>) -> Self {
30355 ptr.untyped()
30356 }
30357}
30358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30359pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
30360impl<'db> TokenTraitGreen<'db> {
30361 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30362 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30363 }
30364}
30365impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
30366 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
30367 type StablePtr = TokenTraitPtr<'db>;
30368 type Green = TokenTraitGreen<'db>;
30369 fn missing(db: &'db dyn Database) -> Self::Green {
30370 TokenTraitGreen(
30371 GreenNode {
30372 kind: SyntaxKind::TokenMissing,
30373 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30374 }
30375 .intern(db),
30376 )
30377 }
30378 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30379 match node.long(db).green.long(db).details {
30380 GreenNodeDetails::Token(_) => Self { node },
30381 GreenNodeDetails::Node { .. } => {
30382 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
30383 }
30384 }
30385 }
30386 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30387 match node.long(db).green.long(db).details {
30388 GreenNodeDetails::Token(_) => Some(Self { node }),
30389 GreenNodeDetails::Node { .. } => None,
30390 }
30391 }
30392 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30393 self.node
30394 }
30395 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30396 TokenTraitPtr(self.node.stable_ptr(db))
30397 }
30398}
30399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30400pub struct TerminalTrait<'db> {
30401 node: SyntaxNode<'db>,
30402}
30403impl<'db> Terminal<'db> for TerminalTrait<'db> {
30404 const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
30405 type TokenType = TokenTrait<'db>;
30406 fn new_green(
30407 db: &'db dyn Database,
30408 leading_trivia: TriviaGreen<'db>,
30409 token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30410 trailing_trivia: TriviaGreen<'db>,
30411 ) -> Self::Green {
30412 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30413 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30414 TerminalTraitGreen(
30415 GreenNode {
30416 kind: SyntaxKind::TerminalTrait,
30417 details: GreenNodeDetails::Node { children: children.into(), width },
30418 }
30419 .intern(db),
30420 )
30421 }
30422 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30423 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30424 else {
30425 unreachable!("Expected a node, not a token");
30426 };
30427 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30428 }
30429}
30430impl<'db> TerminalTrait<'db> {
30431 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30432 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30433 }
30434 pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30435 TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30436 }
30437 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30438 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30439 }
30440}
30441#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30442pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30443impl<'db> TerminalTraitPtr<'db> {}
30444impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30445 type SyntaxNode = TerminalTrait<'db>;
30446 fn untyped(self) -> SyntaxStablePtrId<'db> {
30447 self.0
30448 }
30449 fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30450 TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30451 }
30452}
30453impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30454 fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30455 ptr.untyped()
30456 }
30457}
30458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30459pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30460impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30461 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30462 type StablePtr = TerminalTraitPtr<'db>;
30463 type Green = TerminalTraitGreen<'db>;
30464 fn missing(db: &'db dyn Database) -> Self::Green {
30465 TerminalTraitGreen(
30466 GreenNode {
30467 kind: SyntaxKind::TerminalTrait,
30468 details: GreenNodeDetails::Node {
30469 children: [
30470 Trivia::missing(db).0,
30471 TokenTrait::missing(db).0,
30472 Trivia::missing(db).0,
30473 ]
30474 .into(),
30475 width: TextWidth::default(),
30476 },
30477 }
30478 .intern(db),
30479 )
30480 }
30481 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30482 let kind = node.kind(db);
30483 assert_eq!(
30484 kind,
30485 SyntaxKind::TerminalTrait,
30486 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30487 kind,
30488 SyntaxKind::TerminalTrait
30489 );
30490 Self { node }
30491 }
30492 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30493 let kind = node.kind(db);
30494 if kind == SyntaxKind::TerminalTrait {
30495 Some(Self::from_syntax_node(db, node))
30496 } else {
30497 None
30498 }
30499 }
30500 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30501 self.node
30502 }
30503 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30504 TerminalTraitPtr(self.node.stable_ptr(db))
30505 }
30506}
30507#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30508pub struct TokenTrue<'db> {
30509 node: SyntaxNode<'db>,
30510}
30511impl<'db> Token<'db> for TokenTrue<'db> {
30512 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30513 TokenTrueGreen(
30514 GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30515 .intern(db),
30516 )
30517 }
30518 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30519 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30520 }
30521}
30522#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30523pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30524impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30525 type SyntaxNode = TokenTrue<'db>;
30526 fn untyped(self) -> SyntaxStablePtrId<'db> {
30527 self.0
30528 }
30529 fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30530 TokenTrue::from_syntax_node(db, self.0.lookup(db))
30531 }
30532}
30533impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30534 fn from(ptr: TokenTruePtr<'db>) -> Self {
30535 ptr.untyped()
30536 }
30537}
30538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30539pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30540impl<'db> TokenTrueGreen<'db> {
30541 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30542 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30543 }
30544}
30545impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30546 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30547 type StablePtr = TokenTruePtr<'db>;
30548 type Green = TokenTrueGreen<'db>;
30549 fn missing(db: &'db dyn Database) -> Self::Green {
30550 TokenTrueGreen(
30551 GreenNode {
30552 kind: SyntaxKind::TokenMissing,
30553 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30554 }
30555 .intern(db),
30556 )
30557 }
30558 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30559 match node.long(db).green.long(db).details {
30560 GreenNodeDetails::Token(_) => Self { node },
30561 GreenNodeDetails::Node { .. } => {
30562 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30563 }
30564 }
30565 }
30566 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30567 match node.long(db).green.long(db).details {
30568 GreenNodeDetails::Token(_) => Some(Self { node }),
30569 GreenNodeDetails::Node { .. } => None,
30570 }
30571 }
30572 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30573 self.node
30574 }
30575 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30576 TokenTruePtr(self.node.stable_ptr(db))
30577 }
30578}
30579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30580pub struct TerminalTrue<'db> {
30581 node: SyntaxNode<'db>,
30582}
30583impl<'db> Terminal<'db> for TerminalTrue<'db> {
30584 const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30585 type TokenType = TokenTrue<'db>;
30586 fn new_green(
30587 db: &'db dyn Database,
30588 leading_trivia: TriviaGreen<'db>,
30589 token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30590 trailing_trivia: TriviaGreen<'db>,
30591 ) -> Self::Green {
30592 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30593 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30594 TerminalTrueGreen(
30595 GreenNode {
30596 kind: SyntaxKind::TerminalTrue,
30597 details: GreenNodeDetails::Node { children: children.into(), width },
30598 }
30599 .intern(db),
30600 )
30601 }
30602 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30603 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30604 else {
30605 unreachable!("Expected a node, not a token");
30606 };
30607 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30608 }
30609}
30610impl<'db> TerminalTrue<'db> {
30611 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30612 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30613 }
30614 pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30615 TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30616 }
30617 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30618 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30619 }
30620}
30621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30622pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30623impl<'db> TerminalTruePtr<'db> {}
30624impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30625 type SyntaxNode = TerminalTrue<'db>;
30626 fn untyped(self) -> SyntaxStablePtrId<'db> {
30627 self.0
30628 }
30629 fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30630 TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30631 }
30632}
30633impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30634 fn from(ptr: TerminalTruePtr<'db>) -> Self {
30635 ptr.untyped()
30636 }
30637}
30638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30639pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30640impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30641 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30642 type StablePtr = TerminalTruePtr<'db>;
30643 type Green = TerminalTrueGreen<'db>;
30644 fn missing(db: &'db dyn Database) -> Self::Green {
30645 TerminalTrueGreen(
30646 GreenNode {
30647 kind: SyntaxKind::TerminalTrue,
30648 details: GreenNodeDetails::Node {
30649 children: [
30650 Trivia::missing(db).0,
30651 TokenTrue::missing(db).0,
30652 Trivia::missing(db).0,
30653 ]
30654 .into(),
30655 width: TextWidth::default(),
30656 },
30657 }
30658 .intern(db),
30659 )
30660 }
30661 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30662 let kind = node.kind(db);
30663 assert_eq!(
30664 kind,
30665 SyntaxKind::TerminalTrue,
30666 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30667 kind,
30668 SyntaxKind::TerminalTrue
30669 );
30670 Self { node }
30671 }
30672 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30673 let kind = node.kind(db);
30674 if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30675 }
30676 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30677 self.node
30678 }
30679 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30680 TerminalTruePtr(self.node.stable_ptr(db))
30681 }
30682}
30683#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30684pub struct TokenType<'db> {
30685 node: SyntaxNode<'db>,
30686}
30687impl<'db> Token<'db> for TokenType<'db> {
30688 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30689 TokenTypeGreen(
30690 GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30691 .intern(db),
30692 )
30693 }
30694 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30695 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30696 }
30697}
30698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30699pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30700impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30701 type SyntaxNode = TokenType<'db>;
30702 fn untyped(self) -> SyntaxStablePtrId<'db> {
30703 self.0
30704 }
30705 fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30706 TokenType::from_syntax_node(db, self.0.lookup(db))
30707 }
30708}
30709impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30710 fn from(ptr: TokenTypePtr<'db>) -> Self {
30711 ptr.untyped()
30712 }
30713}
30714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30715pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30716impl<'db> TokenTypeGreen<'db> {
30717 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30718 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30719 }
30720}
30721impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30722 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30723 type StablePtr = TokenTypePtr<'db>;
30724 type Green = TokenTypeGreen<'db>;
30725 fn missing(db: &'db dyn Database) -> Self::Green {
30726 TokenTypeGreen(
30727 GreenNode {
30728 kind: SyntaxKind::TokenMissing,
30729 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30730 }
30731 .intern(db),
30732 )
30733 }
30734 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30735 match node.long(db).green.long(db).details {
30736 GreenNodeDetails::Token(_) => Self { node },
30737 GreenNodeDetails::Node { .. } => {
30738 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30739 }
30740 }
30741 }
30742 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30743 match node.long(db).green.long(db).details {
30744 GreenNodeDetails::Token(_) => Some(Self { node }),
30745 GreenNodeDetails::Node { .. } => None,
30746 }
30747 }
30748 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30749 self.node
30750 }
30751 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30752 TokenTypePtr(self.node.stable_ptr(db))
30753 }
30754}
30755#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30756pub struct TerminalType<'db> {
30757 node: SyntaxNode<'db>,
30758}
30759impl<'db> Terminal<'db> for TerminalType<'db> {
30760 const KIND: SyntaxKind = SyntaxKind::TerminalType;
30761 type TokenType = TokenType<'db>;
30762 fn new_green(
30763 db: &'db dyn Database,
30764 leading_trivia: TriviaGreen<'db>,
30765 token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30766 trailing_trivia: TriviaGreen<'db>,
30767 ) -> Self::Green {
30768 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30769 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30770 TerminalTypeGreen(
30771 GreenNode {
30772 kind: SyntaxKind::TerminalType,
30773 details: GreenNodeDetails::Node { children: children.into(), width },
30774 }
30775 .intern(db),
30776 )
30777 }
30778 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30779 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30780 else {
30781 unreachable!("Expected a node, not a token");
30782 };
30783 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30784 }
30785}
30786impl<'db> TerminalType<'db> {
30787 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30788 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30789 }
30790 pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30791 TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30792 }
30793 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30794 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30795 }
30796}
30797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30798pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30799impl<'db> TerminalTypePtr<'db> {}
30800impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30801 type SyntaxNode = TerminalType<'db>;
30802 fn untyped(self) -> SyntaxStablePtrId<'db> {
30803 self.0
30804 }
30805 fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30806 TerminalType::from_syntax_node(db, self.0.lookup(db))
30807 }
30808}
30809impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30810 fn from(ptr: TerminalTypePtr<'db>) -> Self {
30811 ptr.untyped()
30812 }
30813}
30814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30815pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30816impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30817 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30818 type StablePtr = TerminalTypePtr<'db>;
30819 type Green = TerminalTypeGreen<'db>;
30820 fn missing(db: &'db dyn Database) -> Self::Green {
30821 TerminalTypeGreen(
30822 GreenNode {
30823 kind: SyntaxKind::TerminalType,
30824 details: GreenNodeDetails::Node {
30825 children: [
30826 Trivia::missing(db).0,
30827 TokenType::missing(db).0,
30828 Trivia::missing(db).0,
30829 ]
30830 .into(),
30831 width: TextWidth::default(),
30832 },
30833 }
30834 .intern(db),
30835 )
30836 }
30837 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30838 let kind = node.kind(db);
30839 assert_eq!(
30840 kind,
30841 SyntaxKind::TerminalType,
30842 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30843 kind,
30844 SyntaxKind::TerminalType
30845 );
30846 Self { node }
30847 }
30848 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30849 let kind = node.kind(db);
30850 if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30851 }
30852 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30853 self.node
30854 }
30855 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30856 TerminalTypePtr(self.node.stable_ptr(db))
30857 }
30858}
30859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30860pub struct TokenUse<'db> {
30861 node: SyntaxNode<'db>,
30862}
30863impl<'db> Token<'db> for TokenUse<'db> {
30864 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30865 TokenUseGreen(
30866 GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30867 .intern(db),
30868 )
30869 }
30870 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30871 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30872 }
30873}
30874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30875pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30876impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30877 type SyntaxNode = TokenUse<'db>;
30878 fn untyped(self) -> SyntaxStablePtrId<'db> {
30879 self.0
30880 }
30881 fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30882 TokenUse::from_syntax_node(db, self.0.lookup(db))
30883 }
30884}
30885impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30886 fn from(ptr: TokenUsePtr<'db>) -> Self {
30887 ptr.untyped()
30888 }
30889}
30890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30891pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30892impl<'db> TokenUseGreen<'db> {
30893 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30894 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30895 }
30896}
30897impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30898 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30899 type StablePtr = TokenUsePtr<'db>;
30900 type Green = TokenUseGreen<'db>;
30901 fn missing(db: &'db dyn Database) -> Self::Green {
30902 TokenUseGreen(
30903 GreenNode {
30904 kind: SyntaxKind::TokenMissing,
30905 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30906 }
30907 .intern(db),
30908 )
30909 }
30910 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30911 match node.long(db).green.long(db).details {
30912 GreenNodeDetails::Token(_) => Self { node },
30913 GreenNodeDetails::Node { .. } => {
30914 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30915 }
30916 }
30917 }
30918 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30919 match node.long(db).green.long(db).details {
30920 GreenNodeDetails::Token(_) => Some(Self { node }),
30921 GreenNodeDetails::Node { .. } => None,
30922 }
30923 }
30924 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30925 self.node
30926 }
30927 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30928 TokenUsePtr(self.node.stable_ptr(db))
30929 }
30930}
30931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30932pub struct TerminalUse<'db> {
30933 node: SyntaxNode<'db>,
30934}
30935impl<'db> Terminal<'db> for TerminalUse<'db> {
30936 const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30937 type TokenType = TokenUse<'db>;
30938 fn new_green(
30939 db: &'db dyn Database,
30940 leading_trivia: TriviaGreen<'db>,
30941 token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30942 trailing_trivia: TriviaGreen<'db>,
30943 ) -> Self::Green {
30944 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30945 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30946 TerminalUseGreen(
30947 GreenNode {
30948 kind: SyntaxKind::TerminalUse,
30949 details: GreenNodeDetails::Node { children: children.into(), width },
30950 }
30951 .intern(db),
30952 )
30953 }
30954 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30955 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30956 else {
30957 unreachable!("Expected a node, not a token");
30958 };
30959 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30960 }
30961}
30962impl<'db> TerminalUse<'db> {
30963 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30964 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30965 }
30966 pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30967 TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30968 }
30969 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30970 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30971 }
30972}
30973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30974pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30975impl<'db> TerminalUsePtr<'db> {}
30976impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30977 type SyntaxNode = TerminalUse<'db>;
30978 fn untyped(self) -> SyntaxStablePtrId<'db> {
30979 self.0
30980 }
30981 fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30982 TerminalUse::from_syntax_node(db, self.0.lookup(db))
30983 }
30984}
30985impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30986 fn from(ptr: TerminalUsePtr<'db>) -> Self {
30987 ptr.untyped()
30988 }
30989}
30990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30991pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30992impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30993 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30994 type StablePtr = TerminalUsePtr<'db>;
30995 type Green = TerminalUseGreen<'db>;
30996 fn missing(db: &'db dyn Database) -> Self::Green {
30997 TerminalUseGreen(
30998 GreenNode {
30999 kind: SyntaxKind::TerminalUse,
31000 details: GreenNodeDetails::Node {
31001 children: [
31002 Trivia::missing(db).0,
31003 TokenUse::missing(db).0,
31004 Trivia::missing(db).0,
31005 ]
31006 .into(),
31007 width: TextWidth::default(),
31008 },
31009 }
31010 .intern(db),
31011 )
31012 }
31013 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31014 let kind = node.kind(db);
31015 assert_eq!(
31016 kind,
31017 SyntaxKind::TerminalUse,
31018 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31019 kind,
31020 SyntaxKind::TerminalUse
31021 );
31022 Self { node }
31023 }
31024 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31025 let kind = node.kind(db);
31026 if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
31027 }
31028 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31029 self.node
31030 }
31031 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31032 TerminalUsePtr(self.node.stable_ptr(db))
31033 }
31034}
31035#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31036pub struct TokenPub<'db> {
31037 node: SyntaxNode<'db>,
31038}
31039impl<'db> Token<'db> for TokenPub<'db> {
31040 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31041 TokenPubGreen(
31042 GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
31043 .intern(db),
31044 )
31045 }
31046 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31047 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31048 }
31049}
31050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31051pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
31052impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
31053 type SyntaxNode = TokenPub<'db>;
31054 fn untyped(self) -> SyntaxStablePtrId<'db> {
31055 self.0
31056 }
31057 fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
31058 TokenPub::from_syntax_node(db, self.0.lookup(db))
31059 }
31060}
31061impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
31062 fn from(ptr: TokenPubPtr<'db>) -> Self {
31063 ptr.untyped()
31064 }
31065}
31066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31067pub struct TokenPubGreen<'db>(pub GreenId<'db>);
31068impl<'db> TokenPubGreen<'db> {
31069 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31070 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31071 }
31072}
31073impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
31074 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
31075 type StablePtr = TokenPubPtr<'db>;
31076 type Green = TokenPubGreen<'db>;
31077 fn missing(db: &'db dyn Database) -> Self::Green {
31078 TokenPubGreen(
31079 GreenNode {
31080 kind: SyntaxKind::TokenMissing,
31081 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31082 }
31083 .intern(db),
31084 )
31085 }
31086 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31087 match node.long(db).green.long(db).details {
31088 GreenNodeDetails::Token(_) => Self { node },
31089 GreenNodeDetails::Node { .. } => {
31090 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
31091 }
31092 }
31093 }
31094 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31095 match node.long(db).green.long(db).details {
31096 GreenNodeDetails::Token(_) => Some(Self { node }),
31097 GreenNodeDetails::Node { .. } => None,
31098 }
31099 }
31100 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31101 self.node
31102 }
31103 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31104 TokenPubPtr(self.node.stable_ptr(db))
31105 }
31106}
31107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31108pub struct TerminalPub<'db> {
31109 node: SyntaxNode<'db>,
31110}
31111impl<'db> Terminal<'db> for TerminalPub<'db> {
31112 const KIND: SyntaxKind = SyntaxKind::TerminalPub;
31113 type TokenType = TokenPub<'db>;
31114 fn new_green(
31115 db: &'db dyn Database,
31116 leading_trivia: TriviaGreen<'db>,
31117 token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31118 trailing_trivia: TriviaGreen<'db>,
31119 ) -> Self::Green {
31120 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31121 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31122 TerminalPubGreen(
31123 GreenNode {
31124 kind: SyntaxKind::TerminalPub,
31125 details: GreenNodeDetails::Node { children: children.into(), width },
31126 }
31127 .intern(db),
31128 )
31129 }
31130 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31131 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31132 else {
31133 unreachable!("Expected a node, not a token");
31134 };
31135 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31136 }
31137}
31138impl<'db> TerminalPub<'db> {
31139 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31140 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31141 }
31142 pub fn token(&self, db: &'db dyn Database) -> TokenPub<'db> {
31143 TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
31144 }
31145 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31146 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31147 }
31148}
31149#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31150pub struct TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
31151impl<'db> TerminalPubPtr<'db> {}
31152impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
31153 type SyntaxNode = TerminalPub<'db>;
31154 fn untyped(self) -> SyntaxStablePtrId<'db> {
31155 self.0
31156 }
31157 fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
31158 TerminalPub::from_syntax_node(db, self.0.lookup(db))
31159 }
31160}
31161impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
31162 fn from(ptr: TerminalPubPtr<'db>) -> Self {
31163 ptr.untyped()
31164 }
31165}
31166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31167pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
31168impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
31169 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
31170 type StablePtr = TerminalPubPtr<'db>;
31171 type Green = TerminalPubGreen<'db>;
31172 fn missing(db: &'db dyn Database) -> Self::Green {
31173 TerminalPubGreen(
31174 GreenNode {
31175 kind: SyntaxKind::TerminalPub,
31176 details: GreenNodeDetails::Node {
31177 children: [
31178 Trivia::missing(db).0,
31179 TokenPub::missing(db).0,
31180 Trivia::missing(db).0,
31181 ]
31182 .into(),
31183 width: TextWidth::default(),
31184 },
31185 }
31186 .intern(db),
31187 )
31188 }
31189 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31190 let kind = node.kind(db);
31191 assert_eq!(
31192 kind,
31193 SyntaxKind::TerminalPub,
31194 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31195 kind,
31196 SyntaxKind::TerminalPub
31197 );
31198 Self { node }
31199 }
31200 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31201 let kind = node.kind(db);
31202 if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
31203 }
31204 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31205 self.node
31206 }
31207 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31208 TerminalPubPtr(self.node.stable_ptr(db))
31209 }
31210}
31211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31212pub struct TokenAnd<'db> {
31213 node: SyntaxNode<'db>,
31214}
31215impl<'db> Token<'db> for TokenAnd<'db> {
31216 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31217 TokenAndGreen(
31218 GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
31219 .intern(db),
31220 )
31221 }
31222 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31223 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31224 }
31225}
31226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31227pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31228impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
31229 type SyntaxNode = TokenAnd<'db>;
31230 fn untyped(self) -> SyntaxStablePtrId<'db> {
31231 self.0
31232 }
31233 fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31234 TokenAnd::from_syntax_node(db, self.0.lookup(db))
31235 }
31236}
31237impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
31238 fn from(ptr: TokenAndPtr<'db>) -> Self {
31239 ptr.untyped()
31240 }
31241}
31242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31243pub struct TokenAndGreen<'db>(pub GreenId<'db>);
31244impl<'db> TokenAndGreen<'db> {
31245 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31246 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31247 }
31248}
31249impl<'db> TypedSyntaxNode<'db> for TokenAnd<'db> {
31250 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
31251 type StablePtr = TokenAndPtr<'db>;
31252 type Green = TokenAndGreen<'db>;
31253 fn missing(db: &'db dyn Database) -> Self::Green {
31254 TokenAndGreen(
31255 GreenNode {
31256 kind: SyntaxKind::TokenMissing,
31257 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31258 }
31259 .intern(db),
31260 )
31261 }
31262 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31263 match node.long(db).green.long(db).details {
31264 GreenNodeDetails::Token(_) => Self { node },
31265 GreenNodeDetails::Node { .. } => {
31266 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
31267 }
31268 }
31269 }
31270 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31271 match node.long(db).green.long(db).details {
31272 GreenNodeDetails::Token(_) => Some(Self { node }),
31273 GreenNodeDetails::Node { .. } => None,
31274 }
31275 }
31276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31277 self.node
31278 }
31279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31280 TokenAndPtr(self.node.stable_ptr(db))
31281 }
31282}
31283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31284pub struct TerminalAnd<'db> {
31285 node: SyntaxNode<'db>,
31286}
31287impl<'db> Terminal<'db> for TerminalAnd<'db> {
31288 const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
31289 type TokenType = TokenAnd<'db>;
31290 fn new_green(
31291 db: &'db dyn Database,
31292 leading_trivia: TriviaGreen<'db>,
31293 token: <<TerminalAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31294 trailing_trivia: TriviaGreen<'db>,
31295 ) -> Self::Green {
31296 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31297 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31298 TerminalAndGreen(
31299 GreenNode {
31300 kind: SyntaxKind::TerminalAnd,
31301 details: GreenNodeDetails::Node { children: children.into(), width },
31302 }
31303 .intern(db),
31304 )
31305 }
31306 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31307 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31308 else {
31309 unreachable!("Expected a node, not a token");
31310 };
31311 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31312 }
31313}
31314impl<'db> TerminalAnd<'db> {
31315 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31316 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31317 }
31318 pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31319 TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
31320 }
31321 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31322 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31323 }
31324}
31325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31326pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31327impl<'db> TerminalAndPtr<'db> {}
31328impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
31329 type SyntaxNode = TerminalAnd<'db>;
31330 fn untyped(self) -> SyntaxStablePtrId<'db> {
31331 self.0
31332 }
31333 fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
31334 TerminalAnd::from_syntax_node(db, self.0.lookup(db))
31335 }
31336}
31337impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
31338 fn from(ptr: TerminalAndPtr<'db>) -> Self {
31339 ptr.untyped()
31340 }
31341}
31342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31343pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
31344impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
31345 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
31346 type StablePtr = TerminalAndPtr<'db>;
31347 type Green = TerminalAndGreen<'db>;
31348 fn missing(db: &'db dyn Database) -> Self::Green {
31349 TerminalAndGreen(
31350 GreenNode {
31351 kind: SyntaxKind::TerminalAnd,
31352 details: GreenNodeDetails::Node {
31353 children: [
31354 Trivia::missing(db).0,
31355 TokenAnd::missing(db).0,
31356 Trivia::missing(db).0,
31357 ]
31358 .into(),
31359 width: TextWidth::default(),
31360 },
31361 }
31362 .intern(db),
31363 )
31364 }
31365 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31366 let kind = node.kind(db);
31367 assert_eq!(
31368 kind,
31369 SyntaxKind::TerminalAnd,
31370 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31371 kind,
31372 SyntaxKind::TerminalAnd
31373 );
31374 Self { node }
31375 }
31376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31377 let kind = node.kind(db);
31378 if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
31379 }
31380 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31381 self.node
31382 }
31383 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31384 TerminalAndPtr(self.node.stable_ptr(db))
31385 }
31386}
31387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31388pub struct TokenAndAnd<'db> {
31389 node: SyntaxNode<'db>,
31390}
31391impl<'db> Token<'db> for TokenAndAnd<'db> {
31392 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31393 TokenAndAndGreen(
31394 GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
31395 .intern(db),
31396 )
31397 }
31398 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31399 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31400 }
31401}
31402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31403pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31404impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
31405 type SyntaxNode = TokenAndAnd<'db>;
31406 fn untyped(self) -> SyntaxStablePtrId<'db> {
31407 self.0
31408 }
31409 fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31410 TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
31411 }
31412}
31413impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31414 fn from(ptr: TokenAndAndPtr<'db>) -> Self {
31415 ptr.untyped()
31416 }
31417}
31418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31419pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
31420impl<'db> TokenAndAndGreen<'db> {
31421 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31422 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31423 }
31424}
31425impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
31426 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
31427 type StablePtr = TokenAndAndPtr<'db>;
31428 type Green = TokenAndAndGreen<'db>;
31429 fn missing(db: &'db dyn Database) -> Self::Green {
31430 TokenAndAndGreen(
31431 GreenNode {
31432 kind: SyntaxKind::TokenMissing,
31433 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31434 }
31435 .intern(db),
31436 )
31437 }
31438 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31439 match node.long(db).green.long(db).details {
31440 GreenNodeDetails::Token(_) => Self { node },
31441 GreenNodeDetails::Node { .. } => {
31442 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31443 }
31444 }
31445 }
31446 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31447 match node.long(db).green.long(db).details {
31448 GreenNodeDetails::Token(_) => Some(Self { node }),
31449 GreenNodeDetails::Node { .. } => None,
31450 }
31451 }
31452 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31453 self.node
31454 }
31455 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31456 TokenAndAndPtr(self.node.stable_ptr(db))
31457 }
31458}
31459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31460pub struct TerminalAndAnd<'db> {
31461 node: SyntaxNode<'db>,
31462}
31463impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31464 const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31465 type TokenType = TokenAndAnd<'db>;
31466 fn new_green(
31467 db: &'db dyn Database,
31468 leading_trivia: TriviaGreen<'db>,
31469 token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31470 trailing_trivia: TriviaGreen<'db>,
31471 ) -> Self::Green {
31472 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31473 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31474 TerminalAndAndGreen(
31475 GreenNode {
31476 kind: SyntaxKind::TerminalAndAnd,
31477 details: GreenNodeDetails::Node { children: children.into(), width },
31478 }
31479 .intern(db),
31480 )
31481 }
31482 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31483 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31484 else {
31485 unreachable!("Expected a node, not a token");
31486 };
31487 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31488 }
31489}
31490impl<'db> TerminalAndAnd<'db> {
31491 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31492 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31493 }
31494 pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31495 TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31496 }
31497 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31498 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31499 }
31500}
31501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31502pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31503impl<'db> TerminalAndAndPtr<'db> {}
31504impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31505 type SyntaxNode = TerminalAndAnd<'db>;
31506 fn untyped(self) -> SyntaxStablePtrId<'db> {
31507 self.0
31508 }
31509 fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31510 TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31511 }
31512}
31513impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31514 fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31515 ptr.untyped()
31516 }
31517}
31518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31519pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31520impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31521 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31522 type StablePtr = TerminalAndAndPtr<'db>;
31523 type Green = TerminalAndAndGreen<'db>;
31524 fn missing(db: &'db dyn Database) -> Self::Green {
31525 TerminalAndAndGreen(
31526 GreenNode {
31527 kind: SyntaxKind::TerminalAndAnd,
31528 details: GreenNodeDetails::Node {
31529 children: [
31530 Trivia::missing(db).0,
31531 TokenAndAnd::missing(db).0,
31532 Trivia::missing(db).0,
31533 ]
31534 .into(),
31535 width: TextWidth::default(),
31536 },
31537 }
31538 .intern(db),
31539 )
31540 }
31541 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31542 let kind = node.kind(db);
31543 assert_eq!(
31544 kind,
31545 SyntaxKind::TerminalAndAnd,
31546 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31547 kind,
31548 SyntaxKind::TerminalAndAnd
31549 );
31550 Self { node }
31551 }
31552 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31553 let kind = node.kind(db);
31554 if kind == SyntaxKind::TerminalAndAnd {
31555 Some(Self::from_syntax_node(db, node))
31556 } else {
31557 None
31558 }
31559 }
31560 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31561 self.node
31562 }
31563 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31564 TerminalAndAndPtr(self.node.stable_ptr(db))
31565 }
31566}
31567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31568pub struct TokenArrow<'db> {
31569 node: SyntaxNode<'db>,
31570}
31571impl<'db> Token<'db> for TokenArrow<'db> {
31572 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31573 TokenArrowGreen(
31574 GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31575 .intern(db),
31576 )
31577 }
31578 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31579 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31580 }
31581}
31582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31583pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31584impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31585 type SyntaxNode = TokenArrow<'db>;
31586 fn untyped(self) -> SyntaxStablePtrId<'db> {
31587 self.0
31588 }
31589 fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31590 TokenArrow::from_syntax_node(db, self.0.lookup(db))
31591 }
31592}
31593impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31594 fn from(ptr: TokenArrowPtr<'db>) -> Self {
31595 ptr.untyped()
31596 }
31597}
31598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31599pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31600impl<'db> TokenArrowGreen<'db> {
31601 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31602 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31603 }
31604}
31605impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31606 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31607 type StablePtr = TokenArrowPtr<'db>;
31608 type Green = TokenArrowGreen<'db>;
31609 fn missing(db: &'db dyn Database) -> Self::Green {
31610 TokenArrowGreen(
31611 GreenNode {
31612 kind: SyntaxKind::TokenMissing,
31613 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31614 }
31615 .intern(db),
31616 )
31617 }
31618 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31619 match node.long(db).green.long(db).details {
31620 GreenNodeDetails::Token(_) => Self { node },
31621 GreenNodeDetails::Node { .. } => {
31622 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31623 }
31624 }
31625 }
31626 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31627 match node.long(db).green.long(db).details {
31628 GreenNodeDetails::Token(_) => Some(Self { node }),
31629 GreenNodeDetails::Node { .. } => None,
31630 }
31631 }
31632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31633 self.node
31634 }
31635 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31636 TokenArrowPtr(self.node.stable_ptr(db))
31637 }
31638}
31639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31640pub struct TerminalArrow<'db> {
31641 node: SyntaxNode<'db>,
31642}
31643impl<'db> Terminal<'db> for TerminalArrow<'db> {
31644 const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31645 type TokenType = TokenArrow<'db>;
31646 fn new_green(
31647 db: &'db dyn Database,
31648 leading_trivia: TriviaGreen<'db>,
31649 token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31650 trailing_trivia: TriviaGreen<'db>,
31651 ) -> Self::Green {
31652 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31653 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31654 TerminalArrowGreen(
31655 GreenNode {
31656 kind: SyntaxKind::TerminalArrow,
31657 details: GreenNodeDetails::Node { children: children.into(), width },
31658 }
31659 .intern(db),
31660 )
31661 }
31662 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31663 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31664 else {
31665 unreachable!("Expected a node, not a token");
31666 };
31667 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31668 }
31669}
31670impl<'db> TerminalArrow<'db> {
31671 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31672 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31673 }
31674 pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31675 TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31676 }
31677 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31678 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31679 }
31680}
31681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31682pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31683impl<'db> TerminalArrowPtr<'db> {}
31684impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31685 type SyntaxNode = TerminalArrow<'db>;
31686 fn untyped(self) -> SyntaxStablePtrId<'db> {
31687 self.0
31688 }
31689 fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31690 TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31691 }
31692}
31693impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31694 fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31695 ptr.untyped()
31696 }
31697}
31698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31699pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31700impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31701 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31702 type StablePtr = TerminalArrowPtr<'db>;
31703 type Green = TerminalArrowGreen<'db>;
31704 fn missing(db: &'db dyn Database) -> Self::Green {
31705 TerminalArrowGreen(
31706 GreenNode {
31707 kind: SyntaxKind::TerminalArrow,
31708 details: GreenNodeDetails::Node {
31709 children: [
31710 Trivia::missing(db).0,
31711 TokenArrow::missing(db).0,
31712 Trivia::missing(db).0,
31713 ]
31714 .into(),
31715 width: TextWidth::default(),
31716 },
31717 }
31718 .intern(db),
31719 )
31720 }
31721 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31722 let kind = node.kind(db);
31723 assert_eq!(
31724 kind,
31725 SyntaxKind::TerminalArrow,
31726 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31727 kind,
31728 SyntaxKind::TerminalArrow
31729 );
31730 Self { node }
31731 }
31732 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31733 let kind = node.kind(db);
31734 if kind == SyntaxKind::TerminalArrow {
31735 Some(Self::from_syntax_node(db, node))
31736 } else {
31737 None
31738 }
31739 }
31740 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31741 self.node
31742 }
31743 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31744 TerminalArrowPtr(self.node.stable_ptr(db))
31745 }
31746}
31747#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31748pub struct TokenAt<'db> {
31749 node: SyntaxNode<'db>,
31750}
31751impl<'db> Token<'db> for TokenAt<'db> {
31752 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31753 TokenAtGreen(
31754 GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31755 .intern(db),
31756 )
31757 }
31758 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31759 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31760 }
31761}
31762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31763pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31764impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31765 type SyntaxNode = TokenAt<'db>;
31766 fn untyped(self) -> SyntaxStablePtrId<'db> {
31767 self.0
31768 }
31769 fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31770 TokenAt::from_syntax_node(db, self.0.lookup(db))
31771 }
31772}
31773impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31774 fn from(ptr: TokenAtPtr<'db>) -> Self {
31775 ptr.untyped()
31776 }
31777}
31778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31779pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31780impl<'db> TokenAtGreen<'db> {
31781 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31782 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31783 }
31784}
31785impl<'db> TypedSyntaxNode<'db> for TokenAt<'db> {
31786 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31787 type StablePtr = TokenAtPtr<'db>;
31788 type Green = TokenAtGreen<'db>;
31789 fn missing(db: &'db dyn Database) -> Self::Green {
31790 TokenAtGreen(
31791 GreenNode {
31792 kind: SyntaxKind::TokenMissing,
31793 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31794 }
31795 .intern(db),
31796 )
31797 }
31798 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31799 match node.long(db).green.long(db).details {
31800 GreenNodeDetails::Token(_) => Self { node },
31801 GreenNodeDetails::Node { .. } => {
31802 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31803 }
31804 }
31805 }
31806 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31807 match node.long(db).green.long(db).details {
31808 GreenNodeDetails::Token(_) => Some(Self { node }),
31809 GreenNodeDetails::Node { .. } => None,
31810 }
31811 }
31812 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31813 self.node
31814 }
31815 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31816 TokenAtPtr(self.node.stable_ptr(db))
31817 }
31818}
31819#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31820pub struct TerminalAt<'db> {
31821 node: SyntaxNode<'db>,
31822}
31823impl<'db> Terminal<'db> for TerminalAt<'db> {
31824 const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31825 type TokenType = TokenAt<'db>;
31826 fn new_green(
31827 db: &'db dyn Database,
31828 leading_trivia: TriviaGreen<'db>,
31829 token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31830 trailing_trivia: TriviaGreen<'db>,
31831 ) -> Self::Green {
31832 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31833 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31834 TerminalAtGreen(
31835 GreenNode {
31836 kind: SyntaxKind::TerminalAt,
31837 details: GreenNodeDetails::Node { children: children.into(), width },
31838 }
31839 .intern(db),
31840 )
31841 }
31842 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31843 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31844 else {
31845 unreachable!("Expected a node, not a token");
31846 };
31847 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31848 }
31849}
31850impl<'db> TerminalAt<'db> {
31851 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31852 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31853 }
31854 pub fn token(&self, db: &'db dyn Database) -> TokenAt<'db> {
31855 TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
31856 }
31857 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31858 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31859 }
31860}
31861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31862pub struct TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31863impl<'db> TerminalAtPtr<'db> {}
31864impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31865 type SyntaxNode = TerminalAt<'db>;
31866 fn untyped(self) -> SyntaxStablePtrId<'db> {
31867 self.0
31868 }
31869 fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31870 TerminalAt::from_syntax_node(db, self.0.lookup(db))
31871 }
31872}
31873impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31874 fn from(ptr: TerminalAtPtr<'db>) -> Self {
31875 ptr.untyped()
31876 }
31877}
31878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31879pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31880impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31881 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31882 type StablePtr = TerminalAtPtr<'db>;
31883 type Green = TerminalAtGreen<'db>;
31884 fn missing(db: &'db dyn Database) -> Self::Green {
31885 TerminalAtGreen(
31886 GreenNode {
31887 kind: SyntaxKind::TerminalAt,
31888 details: GreenNodeDetails::Node {
31889 children: [
31890 Trivia::missing(db).0,
31891 TokenAt::missing(db).0,
31892 Trivia::missing(db).0,
31893 ]
31894 .into(),
31895 width: TextWidth::default(),
31896 },
31897 }
31898 .intern(db),
31899 )
31900 }
31901 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31902 let kind = node.kind(db);
31903 assert_eq!(
31904 kind,
31905 SyntaxKind::TerminalAt,
31906 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31907 kind,
31908 SyntaxKind::TerminalAt
31909 );
31910 Self { node }
31911 }
31912 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31913 let kind = node.kind(db);
31914 if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31915 }
31916 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31917 self.node
31918 }
31919 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31920 TerminalAtPtr(self.node.stable_ptr(db))
31921 }
31922}
31923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31924pub struct TokenBadCharacters<'db> {
31925 node: SyntaxNode<'db>,
31926}
31927impl<'db> Token<'db> for TokenBadCharacters<'db> {
31928 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31929 TokenBadCharactersGreen(
31930 GreenNode {
31931 kind: SyntaxKind::TokenBadCharacters,
31932 details: GreenNodeDetails::Token(text),
31933 }
31934 .intern(db),
31935 )
31936 }
31937 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31938 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31939 }
31940}
31941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31942pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31943impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31944 type SyntaxNode = TokenBadCharacters<'db>;
31945 fn untyped(self) -> SyntaxStablePtrId<'db> {
31946 self.0
31947 }
31948 fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31949 TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31950 }
31951}
31952impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31953 fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31954 ptr.untyped()
31955 }
31956}
31957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31958pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31959impl<'db> TokenBadCharactersGreen<'db> {
31960 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31961 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31962 }
31963}
31964impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31965 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31966 type StablePtr = TokenBadCharactersPtr<'db>;
31967 type Green = TokenBadCharactersGreen<'db>;
31968 fn missing(db: &'db dyn Database) -> Self::Green {
31969 TokenBadCharactersGreen(
31970 GreenNode {
31971 kind: SyntaxKind::TokenMissing,
31972 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31973 }
31974 .intern(db),
31975 )
31976 }
31977 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31978 match node.long(db).green.long(db).details {
31979 GreenNodeDetails::Token(_) => Self { node },
31980 GreenNodeDetails::Node { .. } => panic!(
31981 "Expected a token {:?}, not an internal node",
31982 SyntaxKind::TokenBadCharacters
31983 ),
31984 }
31985 }
31986 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31987 match node.long(db).green.long(db).details {
31988 GreenNodeDetails::Token(_) => Some(Self { node }),
31989 GreenNodeDetails::Node { .. } => None,
31990 }
31991 }
31992 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31993 self.node
31994 }
31995 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31996 TokenBadCharactersPtr(self.node.stable_ptr(db))
31997 }
31998}
31999#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32000pub struct TerminalBadCharacters<'db> {
32001 node: SyntaxNode<'db>,
32002}
32003impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
32004 const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
32005 type TokenType = TokenBadCharacters<'db>;
32006 fn new_green(
32007 db: &'db dyn Database,
32008 leading_trivia: TriviaGreen<'db>,
32009 token: <<TerminalBadCharacters<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32010 trailing_trivia: TriviaGreen<'db>,
32011 ) -> Self::Green {
32012 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32013 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32014 TerminalBadCharactersGreen(
32015 GreenNode {
32016 kind: SyntaxKind::TerminalBadCharacters,
32017 details: GreenNodeDetails::Node { children: children.into(), width },
32018 }
32019 .intern(db),
32020 )
32021 }
32022 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32023 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32024 else {
32025 unreachable!("Expected a node, not a token");
32026 };
32027 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32028 }
32029}
32030impl<'db> TerminalBadCharacters<'db> {
32031 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32032 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32033 }
32034 pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
32035 TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
32036 }
32037 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32038 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32039 }
32040}
32041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32042pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
32043impl<'db> TerminalBadCharactersPtr<'db> {}
32044impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
32045 type SyntaxNode = TerminalBadCharacters<'db>;
32046 fn untyped(self) -> SyntaxStablePtrId<'db> {
32047 self.0
32048 }
32049 fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
32050 TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
32051 }
32052}
32053impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
32054 fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
32055 ptr.untyped()
32056 }
32057}
32058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32059pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
32060impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
32061 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
32062 type StablePtr = TerminalBadCharactersPtr<'db>;
32063 type Green = TerminalBadCharactersGreen<'db>;
32064 fn missing(db: &'db dyn Database) -> Self::Green {
32065 TerminalBadCharactersGreen(
32066 GreenNode {
32067 kind: SyntaxKind::TerminalBadCharacters,
32068 details: GreenNodeDetails::Node {
32069 children: [
32070 Trivia::missing(db).0,
32071 TokenBadCharacters::missing(db).0,
32072 Trivia::missing(db).0,
32073 ]
32074 .into(),
32075 width: TextWidth::default(),
32076 },
32077 }
32078 .intern(db),
32079 )
32080 }
32081 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32082 let kind = node.kind(db);
32083 assert_eq!(
32084 kind,
32085 SyntaxKind::TerminalBadCharacters,
32086 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32087 kind,
32088 SyntaxKind::TerminalBadCharacters
32089 );
32090 Self { node }
32091 }
32092 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32093 let kind = node.kind(db);
32094 if kind == SyntaxKind::TerminalBadCharacters {
32095 Some(Self::from_syntax_node(db, node))
32096 } else {
32097 None
32098 }
32099 }
32100 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32101 self.node
32102 }
32103 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32104 TerminalBadCharactersPtr(self.node.stable_ptr(db))
32105 }
32106}
32107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32108pub struct TokenColon<'db> {
32109 node: SyntaxNode<'db>,
32110}
32111impl<'db> Token<'db> for TokenColon<'db> {
32112 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32113 TokenColonGreen(
32114 GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
32115 .intern(db),
32116 )
32117 }
32118 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32119 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32120 }
32121}
32122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32123pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32124impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
32125 type SyntaxNode = TokenColon<'db>;
32126 fn untyped(self) -> SyntaxStablePtrId<'db> {
32127 self.0
32128 }
32129 fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
32130 TokenColon::from_syntax_node(db, self.0.lookup(db))
32131 }
32132}
32133impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
32134 fn from(ptr: TokenColonPtr<'db>) -> Self {
32135 ptr.untyped()
32136 }
32137}
32138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32139pub struct TokenColonGreen<'db>(pub GreenId<'db>);
32140impl<'db> TokenColonGreen<'db> {
32141 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32142 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32143 }
32144}
32145impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
32146 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
32147 type StablePtr = TokenColonPtr<'db>;
32148 type Green = TokenColonGreen<'db>;
32149 fn missing(db: &'db dyn Database) -> Self::Green {
32150 TokenColonGreen(
32151 GreenNode {
32152 kind: SyntaxKind::TokenMissing,
32153 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32154 }
32155 .intern(db),
32156 )
32157 }
32158 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32159 match node.long(db).green.long(db).details {
32160 GreenNodeDetails::Token(_) => Self { node },
32161 GreenNodeDetails::Node { .. } => {
32162 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
32163 }
32164 }
32165 }
32166 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32167 match node.long(db).green.long(db).details {
32168 GreenNodeDetails::Token(_) => Some(Self { node }),
32169 GreenNodeDetails::Node { .. } => None,
32170 }
32171 }
32172 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32173 self.node
32174 }
32175 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32176 TokenColonPtr(self.node.stable_ptr(db))
32177 }
32178}
32179#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32180pub struct TerminalColon<'db> {
32181 node: SyntaxNode<'db>,
32182}
32183impl<'db> Terminal<'db> for TerminalColon<'db> {
32184 const KIND: SyntaxKind = SyntaxKind::TerminalColon;
32185 type TokenType = TokenColon<'db>;
32186 fn new_green(
32187 db: &'db dyn Database,
32188 leading_trivia: TriviaGreen<'db>,
32189 token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32190 trailing_trivia: TriviaGreen<'db>,
32191 ) -> Self::Green {
32192 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32193 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32194 TerminalColonGreen(
32195 GreenNode {
32196 kind: SyntaxKind::TerminalColon,
32197 details: GreenNodeDetails::Node { children: children.into(), width },
32198 }
32199 .intern(db),
32200 )
32201 }
32202 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32203 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32204 else {
32205 unreachable!("Expected a node, not a token");
32206 };
32207 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32208 }
32209}
32210impl<'db> TerminalColon<'db> {
32211 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32212 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32213 }
32214 pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
32215 TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
32216 }
32217 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32218 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32219 }
32220}
32221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32222pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32223impl<'db> TerminalColonPtr<'db> {}
32224impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
32225 type SyntaxNode = TerminalColon<'db>;
32226 fn untyped(self) -> SyntaxStablePtrId<'db> {
32227 self.0
32228 }
32229 fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
32230 TerminalColon::from_syntax_node(db, self.0.lookup(db))
32231 }
32232}
32233impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
32234 fn from(ptr: TerminalColonPtr<'db>) -> Self {
32235 ptr.untyped()
32236 }
32237}
32238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32239pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
32240impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
32241 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
32242 type StablePtr = TerminalColonPtr<'db>;
32243 type Green = TerminalColonGreen<'db>;
32244 fn missing(db: &'db dyn Database) -> Self::Green {
32245 TerminalColonGreen(
32246 GreenNode {
32247 kind: SyntaxKind::TerminalColon,
32248 details: GreenNodeDetails::Node {
32249 children: [
32250 Trivia::missing(db).0,
32251 TokenColon::missing(db).0,
32252 Trivia::missing(db).0,
32253 ]
32254 .into(),
32255 width: TextWidth::default(),
32256 },
32257 }
32258 .intern(db),
32259 )
32260 }
32261 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32262 let kind = node.kind(db);
32263 assert_eq!(
32264 kind,
32265 SyntaxKind::TerminalColon,
32266 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32267 kind,
32268 SyntaxKind::TerminalColon
32269 );
32270 Self { node }
32271 }
32272 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32273 let kind = node.kind(db);
32274 if kind == SyntaxKind::TerminalColon {
32275 Some(Self::from_syntax_node(db, node))
32276 } else {
32277 None
32278 }
32279 }
32280 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32281 self.node
32282 }
32283 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32284 TerminalColonPtr(self.node.stable_ptr(db))
32285 }
32286}
32287#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32288pub struct TokenColonColon<'db> {
32289 node: SyntaxNode<'db>,
32290}
32291impl<'db> Token<'db> for TokenColonColon<'db> {
32292 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32293 TokenColonColonGreen(
32294 GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
32295 .intern(db),
32296 )
32297 }
32298 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32299 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32300 }
32301}
32302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32303pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32304impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
32305 type SyntaxNode = TokenColonColon<'db>;
32306 fn untyped(self) -> SyntaxStablePtrId<'db> {
32307 self.0
32308 }
32309 fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32310 TokenColonColon::from_syntax_node(db, self.0.lookup(db))
32311 }
32312}
32313impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32314 fn from(ptr: TokenColonColonPtr<'db>) -> Self {
32315 ptr.untyped()
32316 }
32317}
32318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32319pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
32320impl<'db> TokenColonColonGreen<'db> {
32321 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32322 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32323 }
32324}
32325impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
32326 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
32327 type StablePtr = TokenColonColonPtr<'db>;
32328 type Green = TokenColonColonGreen<'db>;
32329 fn missing(db: &'db dyn Database) -> Self::Green {
32330 TokenColonColonGreen(
32331 GreenNode {
32332 kind: SyntaxKind::TokenMissing,
32333 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32334 }
32335 .intern(db),
32336 )
32337 }
32338 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32339 match node.long(db).green.long(db).details {
32340 GreenNodeDetails::Token(_) => Self { node },
32341 GreenNodeDetails::Node { .. } => {
32342 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
32343 }
32344 }
32345 }
32346 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32347 match node.long(db).green.long(db).details {
32348 GreenNodeDetails::Token(_) => Some(Self { node }),
32349 GreenNodeDetails::Node { .. } => None,
32350 }
32351 }
32352 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32353 self.node
32354 }
32355 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32356 TokenColonColonPtr(self.node.stable_ptr(db))
32357 }
32358}
32359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32360pub struct TerminalColonColon<'db> {
32361 node: SyntaxNode<'db>,
32362}
32363impl<'db> Terminal<'db> for TerminalColonColon<'db> {
32364 const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
32365 type TokenType = TokenColonColon<'db>;
32366 fn new_green(
32367 db: &'db dyn Database,
32368 leading_trivia: TriviaGreen<'db>,
32369 token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32370 trailing_trivia: TriviaGreen<'db>,
32371 ) -> Self::Green {
32372 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32373 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32374 TerminalColonColonGreen(
32375 GreenNode {
32376 kind: SyntaxKind::TerminalColonColon,
32377 details: GreenNodeDetails::Node { children: children.into(), width },
32378 }
32379 .intern(db),
32380 )
32381 }
32382 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32383 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32384 else {
32385 unreachable!("Expected a node, not a token");
32386 };
32387 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32388 }
32389}
32390impl<'db> TerminalColonColon<'db> {
32391 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32392 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32393 }
32394 pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32395 TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
32396 }
32397 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32398 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32399 }
32400}
32401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32402pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32403impl<'db> TerminalColonColonPtr<'db> {}
32404impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
32405 type SyntaxNode = TerminalColonColon<'db>;
32406 fn untyped(self) -> SyntaxStablePtrId<'db> {
32407 self.0
32408 }
32409 fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
32410 TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
32411 }
32412}
32413impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32414 fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
32415 ptr.untyped()
32416 }
32417}
32418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32419pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
32420impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
32421 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
32422 type StablePtr = TerminalColonColonPtr<'db>;
32423 type Green = TerminalColonColonGreen<'db>;
32424 fn missing(db: &'db dyn Database) -> Self::Green {
32425 TerminalColonColonGreen(
32426 GreenNode {
32427 kind: SyntaxKind::TerminalColonColon,
32428 details: GreenNodeDetails::Node {
32429 children: [
32430 Trivia::missing(db).0,
32431 TokenColonColon::missing(db).0,
32432 Trivia::missing(db).0,
32433 ]
32434 .into(),
32435 width: TextWidth::default(),
32436 },
32437 }
32438 .intern(db),
32439 )
32440 }
32441 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32442 let kind = node.kind(db);
32443 assert_eq!(
32444 kind,
32445 SyntaxKind::TerminalColonColon,
32446 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32447 kind,
32448 SyntaxKind::TerminalColonColon
32449 );
32450 Self { node }
32451 }
32452 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32453 let kind = node.kind(db);
32454 if kind == SyntaxKind::TerminalColonColon {
32455 Some(Self::from_syntax_node(db, node))
32456 } else {
32457 None
32458 }
32459 }
32460 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32461 self.node
32462 }
32463 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32464 TerminalColonColonPtr(self.node.stable_ptr(db))
32465 }
32466}
32467#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32468pub struct TokenComma<'db> {
32469 node: SyntaxNode<'db>,
32470}
32471impl<'db> Token<'db> for TokenComma<'db> {
32472 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32473 TokenCommaGreen(
32474 GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32475 .intern(db),
32476 )
32477 }
32478 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32479 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32480 }
32481}
32482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32483pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32484impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32485 type SyntaxNode = TokenComma<'db>;
32486 fn untyped(self) -> SyntaxStablePtrId<'db> {
32487 self.0
32488 }
32489 fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32490 TokenComma::from_syntax_node(db, self.0.lookup(db))
32491 }
32492}
32493impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32494 fn from(ptr: TokenCommaPtr<'db>) -> Self {
32495 ptr.untyped()
32496 }
32497}
32498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32499pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32500impl<'db> TokenCommaGreen<'db> {
32501 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32502 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32503 }
32504}
32505impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32506 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32507 type StablePtr = TokenCommaPtr<'db>;
32508 type Green = TokenCommaGreen<'db>;
32509 fn missing(db: &'db dyn Database) -> Self::Green {
32510 TokenCommaGreen(
32511 GreenNode {
32512 kind: SyntaxKind::TokenMissing,
32513 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32514 }
32515 .intern(db),
32516 )
32517 }
32518 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32519 match node.long(db).green.long(db).details {
32520 GreenNodeDetails::Token(_) => Self { node },
32521 GreenNodeDetails::Node { .. } => {
32522 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32523 }
32524 }
32525 }
32526 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32527 match node.long(db).green.long(db).details {
32528 GreenNodeDetails::Token(_) => Some(Self { node }),
32529 GreenNodeDetails::Node { .. } => None,
32530 }
32531 }
32532 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32533 self.node
32534 }
32535 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32536 TokenCommaPtr(self.node.stable_ptr(db))
32537 }
32538}
32539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32540pub struct TerminalComma<'db> {
32541 node: SyntaxNode<'db>,
32542}
32543impl<'db> Terminal<'db> for TerminalComma<'db> {
32544 const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32545 type TokenType = TokenComma<'db>;
32546 fn new_green(
32547 db: &'db dyn Database,
32548 leading_trivia: TriviaGreen<'db>,
32549 token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32550 trailing_trivia: TriviaGreen<'db>,
32551 ) -> Self::Green {
32552 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32553 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32554 TerminalCommaGreen(
32555 GreenNode {
32556 kind: SyntaxKind::TerminalComma,
32557 details: GreenNodeDetails::Node { children: children.into(), width },
32558 }
32559 .intern(db),
32560 )
32561 }
32562 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32563 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32564 else {
32565 unreachable!("Expected a node, not a token");
32566 };
32567 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32568 }
32569}
32570impl<'db> TerminalComma<'db> {
32571 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32572 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32573 }
32574 pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32575 TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32576 }
32577 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32578 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32579 }
32580}
32581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32582pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32583impl<'db> TerminalCommaPtr<'db> {}
32584impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32585 type SyntaxNode = TerminalComma<'db>;
32586 fn untyped(self) -> SyntaxStablePtrId<'db> {
32587 self.0
32588 }
32589 fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32590 TerminalComma::from_syntax_node(db, self.0.lookup(db))
32591 }
32592}
32593impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32594 fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32595 ptr.untyped()
32596 }
32597}
32598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32599pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32600impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32601 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32602 type StablePtr = TerminalCommaPtr<'db>;
32603 type Green = TerminalCommaGreen<'db>;
32604 fn missing(db: &'db dyn Database) -> Self::Green {
32605 TerminalCommaGreen(
32606 GreenNode {
32607 kind: SyntaxKind::TerminalComma,
32608 details: GreenNodeDetails::Node {
32609 children: [
32610 Trivia::missing(db).0,
32611 TokenComma::missing(db).0,
32612 Trivia::missing(db).0,
32613 ]
32614 .into(),
32615 width: TextWidth::default(),
32616 },
32617 }
32618 .intern(db),
32619 )
32620 }
32621 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32622 let kind = node.kind(db);
32623 assert_eq!(
32624 kind,
32625 SyntaxKind::TerminalComma,
32626 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32627 kind,
32628 SyntaxKind::TerminalComma
32629 );
32630 Self { node }
32631 }
32632 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32633 let kind = node.kind(db);
32634 if kind == SyntaxKind::TerminalComma {
32635 Some(Self::from_syntax_node(db, node))
32636 } else {
32637 None
32638 }
32639 }
32640 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32641 self.node
32642 }
32643 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32644 TerminalCommaPtr(self.node.stable_ptr(db))
32645 }
32646}
32647#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32648pub struct TokenDiv<'db> {
32649 node: SyntaxNode<'db>,
32650}
32651impl<'db> Token<'db> for TokenDiv<'db> {
32652 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32653 TokenDivGreen(
32654 GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32655 .intern(db),
32656 )
32657 }
32658 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32659 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32660 }
32661}
32662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32663pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32664impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32665 type SyntaxNode = TokenDiv<'db>;
32666 fn untyped(self) -> SyntaxStablePtrId<'db> {
32667 self.0
32668 }
32669 fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32670 TokenDiv::from_syntax_node(db, self.0.lookup(db))
32671 }
32672}
32673impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32674 fn from(ptr: TokenDivPtr<'db>) -> Self {
32675 ptr.untyped()
32676 }
32677}
32678#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32679pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32680impl<'db> TokenDivGreen<'db> {
32681 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32682 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32683 }
32684}
32685impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32686 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32687 type StablePtr = TokenDivPtr<'db>;
32688 type Green = TokenDivGreen<'db>;
32689 fn missing(db: &'db dyn Database) -> Self::Green {
32690 TokenDivGreen(
32691 GreenNode {
32692 kind: SyntaxKind::TokenMissing,
32693 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32694 }
32695 .intern(db),
32696 )
32697 }
32698 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32699 match node.long(db).green.long(db).details {
32700 GreenNodeDetails::Token(_) => Self { node },
32701 GreenNodeDetails::Node { .. } => {
32702 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32703 }
32704 }
32705 }
32706 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32707 match node.long(db).green.long(db).details {
32708 GreenNodeDetails::Token(_) => Some(Self { node }),
32709 GreenNodeDetails::Node { .. } => None,
32710 }
32711 }
32712 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32713 self.node
32714 }
32715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32716 TokenDivPtr(self.node.stable_ptr(db))
32717 }
32718}
32719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32720pub struct TerminalDiv<'db> {
32721 node: SyntaxNode<'db>,
32722}
32723impl<'db> Terminal<'db> for TerminalDiv<'db> {
32724 const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32725 type TokenType = TokenDiv<'db>;
32726 fn new_green(
32727 db: &'db dyn Database,
32728 leading_trivia: TriviaGreen<'db>,
32729 token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32730 trailing_trivia: TriviaGreen<'db>,
32731 ) -> Self::Green {
32732 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32733 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32734 TerminalDivGreen(
32735 GreenNode {
32736 kind: SyntaxKind::TerminalDiv,
32737 details: GreenNodeDetails::Node { children: children.into(), width },
32738 }
32739 .intern(db),
32740 )
32741 }
32742 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32743 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32744 else {
32745 unreachable!("Expected a node, not a token");
32746 };
32747 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32748 }
32749}
32750impl<'db> TerminalDiv<'db> {
32751 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32752 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32753 }
32754 pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32755 TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32756 }
32757 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32758 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32759 }
32760}
32761#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32762pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32763impl<'db> TerminalDivPtr<'db> {}
32764impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32765 type SyntaxNode = TerminalDiv<'db>;
32766 fn untyped(self) -> SyntaxStablePtrId<'db> {
32767 self.0
32768 }
32769 fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32770 TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32771 }
32772}
32773impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32774 fn from(ptr: TerminalDivPtr<'db>) -> Self {
32775 ptr.untyped()
32776 }
32777}
32778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32779pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32780impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32781 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32782 type StablePtr = TerminalDivPtr<'db>;
32783 type Green = TerminalDivGreen<'db>;
32784 fn missing(db: &'db dyn Database) -> Self::Green {
32785 TerminalDivGreen(
32786 GreenNode {
32787 kind: SyntaxKind::TerminalDiv,
32788 details: GreenNodeDetails::Node {
32789 children: [
32790 Trivia::missing(db).0,
32791 TokenDiv::missing(db).0,
32792 Trivia::missing(db).0,
32793 ]
32794 .into(),
32795 width: TextWidth::default(),
32796 },
32797 }
32798 .intern(db),
32799 )
32800 }
32801 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32802 let kind = node.kind(db);
32803 assert_eq!(
32804 kind,
32805 SyntaxKind::TerminalDiv,
32806 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32807 kind,
32808 SyntaxKind::TerminalDiv
32809 );
32810 Self { node }
32811 }
32812 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32813 let kind = node.kind(db);
32814 if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32815 }
32816 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32817 self.node
32818 }
32819 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32820 TerminalDivPtr(self.node.stable_ptr(db))
32821 }
32822}
32823#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32824pub struct TokenDivEq<'db> {
32825 node: SyntaxNode<'db>,
32826}
32827impl<'db> Token<'db> for TokenDivEq<'db> {
32828 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32829 TokenDivEqGreen(
32830 GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32831 .intern(db),
32832 )
32833 }
32834 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32835 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32836 }
32837}
32838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32839pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32840impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32841 type SyntaxNode = TokenDivEq<'db>;
32842 fn untyped(self) -> SyntaxStablePtrId<'db> {
32843 self.0
32844 }
32845 fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32846 TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32847 }
32848}
32849impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32850 fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32851 ptr.untyped()
32852 }
32853}
32854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32855pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32856impl<'db> TokenDivEqGreen<'db> {
32857 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32858 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32859 }
32860}
32861impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32862 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32863 type StablePtr = TokenDivEqPtr<'db>;
32864 type Green = TokenDivEqGreen<'db>;
32865 fn missing(db: &'db dyn Database) -> Self::Green {
32866 TokenDivEqGreen(
32867 GreenNode {
32868 kind: SyntaxKind::TokenMissing,
32869 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32870 }
32871 .intern(db),
32872 )
32873 }
32874 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32875 match node.long(db).green.long(db).details {
32876 GreenNodeDetails::Token(_) => Self { node },
32877 GreenNodeDetails::Node { .. } => {
32878 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32879 }
32880 }
32881 }
32882 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32883 match node.long(db).green.long(db).details {
32884 GreenNodeDetails::Token(_) => Some(Self { node }),
32885 GreenNodeDetails::Node { .. } => None,
32886 }
32887 }
32888 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32889 self.node
32890 }
32891 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32892 TokenDivEqPtr(self.node.stable_ptr(db))
32893 }
32894}
32895#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32896pub struct TerminalDivEq<'db> {
32897 node: SyntaxNode<'db>,
32898}
32899impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32900 const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32901 type TokenType = TokenDivEq<'db>;
32902 fn new_green(
32903 db: &'db dyn Database,
32904 leading_trivia: TriviaGreen<'db>,
32905 token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32906 trailing_trivia: TriviaGreen<'db>,
32907 ) -> Self::Green {
32908 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32909 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32910 TerminalDivEqGreen(
32911 GreenNode {
32912 kind: SyntaxKind::TerminalDivEq,
32913 details: GreenNodeDetails::Node { children: children.into(), width },
32914 }
32915 .intern(db),
32916 )
32917 }
32918 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32919 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32920 else {
32921 unreachable!("Expected a node, not a token");
32922 };
32923 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32924 }
32925}
32926impl<'db> TerminalDivEq<'db> {
32927 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32928 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32929 }
32930 pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32931 TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32932 }
32933 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32934 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32935 }
32936}
32937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32938pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32939impl<'db> TerminalDivEqPtr<'db> {}
32940impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32941 type SyntaxNode = TerminalDivEq<'db>;
32942 fn untyped(self) -> SyntaxStablePtrId<'db> {
32943 self.0
32944 }
32945 fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32946 TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32947 }
32948}
32949impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32950 fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32951 ptr.untyped()
32952 }
32953}
32954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32955pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32956impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32957 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32958 type StablePtr = TerminalDivEqPtr<'db>;
32959 type Green = TerminalDivEqGreen<'db>;
32960 fn missing(db: &'db dyn Database) -> Self::Green {
32961 TerminalDivEqGreen(
32962 GreenNode {
32963 kind: SyntaxKind::TerminalDivEq,
32964 details: GreenNodeDetails::Node {
32965 children: [
32966 Trivia::missing(db).0,
32967 TokenDivEq::missing(db).0,
32968 Trivia::missing(db).0,
32969 ]
32970 .into(),
32971 width: TextWidth::default(),
32972 },
32973 }
32974 .intern(db),
32975 )
32976 }
32977 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32978 let kind = node.kind(db);
32979 assert_eq!(
32980 kind,
32981 SyntaxKind::TerminalDivEq,
32982 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32983 kind,
32984 SyntaxKind::TerminalDivEq
32985 );
32986 Self { node }
32987 }
32988 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32989 let kind = node.kind(db);
32990 if kind == SyntaxKind::TerminalDivEq {
32991 Some(Self::from_syntax_node(db, node))
32992 } else {
32993 None
32994 }
32995 }
32996 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32997 self.node
32998 }
32999 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33000 TerminalDivEqPtr(self.node.stable_ptr(db))
33001 }
33002}
33003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33004pub struct TokenDollar<'db> {
33005 node: SyntaxNode<'db>,
33006}
33007impl<'db> Token<'db> for TokenDollar<'db> {
33008 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33009 TokenDollarGreen(
33010 GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
33011 .intern(db),
33012 )
33013 }
33014 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33015 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33016 }
33017}
33018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33019pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
33020impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
33021 type SyntaxNode = TokenDollar<'db>;
33022 fn untyped(self) -> SyntaxStablePtrId<'db> {
33023 self.0
33024 }
33025 fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
33026 TokenDollar::from_syntax_node(db, self.0.lookup(db))
33027 }
33028}
33029impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
33030 fn from(ptr: TokenDollarPtr<'db>) -> Self {
33031 ptr.untyped()
33032 }
33033}
33034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33035pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
33036impl<'db> TokenDollarGreen<'db> {
33037 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33038 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33039 }
33040}
33041impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
33042 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
33043 type StablePtr = TokenDollarPtr<'db>;
33044 type Green = TokenDollarGreen<'db>;
33045 fn missing(db: &'db dyn Database) -> Self::Green {
33046 TokenDollarGreen(
33047 GreenNode {
33048 kind: SyntaxKind::TokenMissing,
33049 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33050 }
33051 .intern(db),
33052 )
33053 }
33054 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33055 match node.long(db).green.long(db).details {
33056 GreenNodeDetails::Token(_) => Self { node },
33057 GreenNodeDetails::Node { .. } => {
33058 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
33059 }
33060 }
33061 }
33062 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33063 match node.long(db).green.long(db).details {
33064 GreenNodeDetails::Token(_) => Some(Self { node }),
33065 GreenNodeDetails::Node { .. } => None,
33066 }
33067 }
33068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33069 self.node
33070 }
33071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33072 TokenDollarPtr(self.node.stable_ptr(db))
33073 }
33074}
33075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33076pub struct TerminalDollar<'db> {
33077 node: SyntaxNode<'db>,
33078}
33079impl<'db> Terminal<'db> for TerminalDollar<'db> {
33080 const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
33081 type TokenType = TokenDollar<'db>;
33082 fn new_green(
33083 db: &'db dyn Database,
33084 leading_trivia: TriviaGreen<'db>,
33085 token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33086 trailing_trivia: TriviaGreen<'db>,
33087 ) -> Self::Green {
33088 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33089 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33090 TerminalDollarGreen(
33091 GreenNode {
33092 kind: SyntaxKind::TerminalDollar,
33093 details: GreenNodeDetails::Node { children: children.into(), width },
33094 }
33095 .intern(db),
33096 )
33097 }
33098 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33099 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33100 else {
33101 unreachable!("Expected a node, not a token");
33102 };
33103 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33104 }
33105}
33106impl<'db> TerminalDollar<'db> {
33107 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33108 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33109 }
33110 pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
33111 TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
33112 }
33113 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33114 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33115 }
33116}
33117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33118pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
33119impl<'db> TerminalDollarPtr<'db> {}
33120impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
33121 type SyntaxNode = TerminalDollar<'db>;
33122 fn untyped(self) -> SyntaxStablePtrId<'db> {
33123 self.0
33124 }
33125 fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
33126 TerminalDollar::from_syntax_node(db, self.0.lookup(db))
33127 }
33128}
33129impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
33130 fn from(ptr: TerminalDollarPtr<'db>) -> Self {
33131 ptr.untyped()
33132 }
33133}
33134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33135pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
33136impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
33137 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
33138 type StablePtr = TerminalDollarPtr<'db>;
33139 type Green = TerminalDollarGreen<'db>;
33140 fn missing(db: &'db dyn Database) -> Self::Green {
33141 TerminalDollarGreen(
33142 GreenNode {
33143 kind: SyntaxKind::TerminalDollar,
33144 details: GreenNodeDetails::Node {
33145 children: [
33146 Trivia::missing(db).0,
33147 TokenDollar::missing(db).0,
33148 Trivia::missing(db).0,
33149 ]
33150 .into(),
33151 width: TextWidth::default(),
33152 },
33153 }
33154 .intern(db),
33155 )
33156 }
33157 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33158 let kind = node.kind(db);
33159 assert_eq!(
33160 kind,
33161 SyntaxKind::TerminalDollar,
33162 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33163 kind,
33164 SyntaxKind::TerminalDollar
33165 );
33166 Self { node }
33167 }
33168 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33169 let kind = node.kind(db);
33170 if kind == SyntaxKind::TerminalDollar {
33171 Some(Self::from_syntax_node(db, node))
33172 } else {
33173 None
33174 }
33175 }
33176 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33177 self.node
33178 }
33179 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33180 TerminalDollarPtr(self.node.stable_ptr(db))
33181 }
33182}
33183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33184pub struct TokenDot<'db> {
33185 node: SyntaxNode<'db>,
33186}
33187impl<'db> Token<'db> for TokenDot<'db> {
33188 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33189 TokenDotGreen(
33190 GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
33191 .intern(db),
33192 )
33193 }
33194 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33195 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33196 }
33197}
33198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33199pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33200impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
33201 type SyntaxNode = TokenDot<'db>;
33202 fn untyped(self) -> SyntaxStablePtrId<'db> {
33203 self.0
33204 }
33205 fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
33206 TokenDot::from_syntax_node(db, self.0.lookup(db))
33207 }
33208}
33209impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
33210 fn from(ptr: TokenDotPtr<'db>) -> Self {
33211 ptr.untyped()
33212 }
33213}
33214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33215pub struct TokenDotGreen<'db>(pub GreenId<'db>);
33216impl<'db> TokenDotGreen<'db> {
33217 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33218 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33219 }
33220}
33221impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
33222 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
33223 type StablePtr = TokenDotPtr<'db>;
33224 type Green = TokenDotGreen<'db>;
33225 fn missing(db: &'db dyn Database) -> Self::Green {
33226 TokenDotGreen(
33227 GreenNode {
33228 kind: SyntaxKind::TokenMissing,
33229 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33230 }
33231 .intern(db),
33232 )
33233 }
33234 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33235 match node.long(db).green.long(db).details {
33236 GreenNodeDetails::Token(_) => Self { node },
33237 GreenNodeDetails::Node { .. } => {
33238 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
33239 }
33240 }
33241 }
33242 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33243 match node.long(db).green.long(db).details {
33244 GreenNodeDetails::Token(_) => Some(Self { node }),
33245 GreenNodeDetails::Node { .. } => None,
33246 }
33247 }
33248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33249 self.node
33250 }
33251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33252 TokenDotPtr(self.node.stable_ptr(db))
33253 }
33254}
33255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33256pub struct TerminalDot<'db> {
33257 node: SyntaxNode<'db>,
33258}
33259impl<'db> Terminal<'db> for TerminalDot<'db> {
33260 const KIND: SyntaxKind = SyntaxKind::TerminalDot;
33261 type TokenType = TokenDot<'db>;
33262 fn new_green(
33263 db: &'db dyn Database,
33264 leading_trivia: TriviaGreen<'db>,
33265 token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33266 trailing_trivia: TriviaGreen<'db>,
33267 ) -> Self::Green {
33268 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33269 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33270 TerminalDotGreen(
33271 GreenNode {
33272 kind: SyntaxKind::TerminalDot,
33273 details: GreenNodeDetails::Node { children: children.into(), width },
33274 }
33275 .intern(db),
33276 )
33277 }
33278 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33279 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33280 else {
33281 unreachable!("Expected a node, not a token");
33282 };
33283 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33284 }
33285}
33286impl<'db> TerminalDot<'db> {
33287 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33288 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33289 }
33290 pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
33291 TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
33292 }
33293 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33294 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33295 }
33296}
33297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33298pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33299impl<'db> TerminalDotPtr<'db> {}
33300impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
33301 type SyntaxNode = TerminalDot<'db>;
33302 fn untyped(self) -> SyntaxStablePtrId<'db> {
33303 self.0
33304 }
33305 fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
33306 TerminalDot::from_syntax_node(db, self.0.lookup(db))
33307 }
33308}
33309impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
33310 fn from(ptr: TerminalDotPtr<'db>) -> Self {
33311 ptr.untyped()
33312 }
33313}
33314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33315pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
33316impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
33317 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
33318 type StablePtr = TerminalDotPtr<'db>;
33319 type Green = TerminalDotGreen<'db>;
33320 fn missing(db: &'db dyn Database) -> Self::Green {
33321 TerminalDotGreen(
33322 GreenNode {
33323 kind: SyntaxKind::TerminalDot,
33324 details: GreenNodeDetails::Node {
33325 children: [
33326 Trivia::missing(db).0,
33327 TokenDot::missing(db).0,
33328 Trivia::missing(db).0,
33329 ]
33330 .into(),
33331 width: TextWidth::default(),
33332 },
33333 }
33334 .intern(db),
33335 )
33336 }
33337 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33338 let kind = node.kind(db);
33339 assert_eq!(
33340 kind,
33341 SyntaxKind::TerminalDot,
33342 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33343 kind,
33344 SyntaxKind::TerminalDot
33345 );
33346 Self { node }
33347 }
33348 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33349 let kind = node.kind(db);
33350 if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
33351 }
33352 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33353 self.node
33354 }
33355 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33356 TerminalDotPtr(self.node.stable_ptr(db))
33357 }
33358}
33359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33360pub struct TokenDotDot<'db> {
33361 node: SyntaxNode<'db>,
33362}
33363impl<'db> Token<'db> for TokenDotDot<'db> {
33364 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33365 TokenDotDotGreen(
33366 GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
33367 .intern(db),
33368 )
33369 }
33370 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33371 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33372 }
33373}
33374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33375pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33376impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
33377 type SyntaxNode = TokenDotDot<'db>;
33378 fn untyped(self) -> SyntaxStablePtrId<'db> {
33379 self.0
33380 }
33381 fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33382 TokenDotDot::from_syntax_node(db, self.0.lookup(db))
33383 }
33384}
33385impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33386 fn from(ptr: TokenDotDotPtr<'db>) -> Self {
33387 ptr.untyped()
33388 }
33389}
33390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33391pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
33392impl<'db> TokenDotDotGreen<'db> {
33393 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33394 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33395 }
33396}
33397impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
33398 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
33399 type StablePtr = TokenDotDotPtr<'db>;
33400 type Green = TokenDotDotGreen<'db>;
33401 fn missing(db: &'db dyn Database) -> Self::Green {
33402 TokenDotDotGreen(
33403 GreenNode {
33404 kind: SyntaxKind::TokenMissing,
33405 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33406 }
33407 .intern(db),
33408 )
33409 }
33410 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33411 match node.long(db).green.long(db).details {
33412 GreenNodeDetails::Token(_) => Self { node },
33413 GreenNodeDetails::Node { .. } => {
33414 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
33415 }
33416 }
33417 }
33418 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33419 match node.long(db).green.long(db).details {
33420 GreenNodeDetails::Token(_) => Some(Self { node }),
33421 GreenNodeDetails::Node { .. } => None,
33422 }
33423 }
33424 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33425 self.node
33426 }
33427 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33428 TokenDotDotPtr(self.node.stable_ptr(db))
33429 }
33430}
33431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33432pub struct TerminalDotDot<'db> {
33433 node: SyntaxNode<'db>,
33434}
33435impl<'db> Terminal<'db> for TerminalDotDot<'db> {
33436 const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
33437 type TokenType = TokenDotDot<'db>;
33438 fn new_green(
33439 db: &'db dyn Database,
33440 leading_trivia: TriviaGreen<'db>,
33441 token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33442 trailing_trivia: TriviaGreen<'db>,
33443 ) -> Self::Green {
33444 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33445 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33446 TerminalDotDotGreen(
33447 GreenNode {
33448 kind: SyntaxKind::TerminalDotDot,
33449 details: GreenNodeDetails::Node { children: children.into(), width },
33450 }
33451 .intern(db),
33452 )
33453 }
33454 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33455 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33456 else {
33457 unreachable!("Expected a node, not a token");
33458 };
33459 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33460 }
33461}
33462impl<'db> TerminalDotDot<'db> {
33463 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33464 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33465 }
33466 pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33467 TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33468 }
33469 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33470 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33471 }
33472}
33473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33474pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33475impl<'db> TerminalDotDotPtr<'db> {}
33476impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33477 type SyntaxNode = TerminalDotDot<'db>;
33478 fn untyped(self) -> SyntaxStablePtrId<'db> {
33479 self.0
33480 }
33481 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33482 TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33483 }
33484}
33485impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33486 fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33487 ptr.untyped()
33488 }
33489}
33490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33491pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33492impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33493 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33494 type StablePtr = TerminalDotDotPtr<'db>;
33495 type Green = TerminalDotDotGreen<'db>;
33496 fn missing(db: &'db dyn Database) -> Self::Green {
33497 TerminalDotDotGreen(
33498 GreenNode {
33499 kind: SyntaxKind::TerminalDotDot,
33500 details: GreenNodeDetails::Node {
33501 children: [
33502 Trivia::missing(db).0,
33503 TokenDotDot::missing(db).0,
33504 Trivia::missing(db).0,
33505 ]
33506 .into(),
33507 width: TextWidth::default(),
33508 },
33509 }
33510 .intern(db),
33511 )
33512 }
33513 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33514 let kind = node.kind(db);
33515 assert_eq!(
33516 kind,
33517 SyntaxKind::TerminalDotDot,
33518 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33519 kind,
33520 SyntaxKind::TerminalDotDot
33521 );
33522 Self { node }
33523 }
33524 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33525 let kind = node.kind(db);
33526 if kind == SyntaxKind::TerminalDotDot {
33527 Some(Self::from_syntax_node(db, node))
33528 } else {
33529 None
33530 }
33531 }
33532 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33533 self.node
33534 }
33535 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33536 TerminalDotDotPtr(self.node.stable_ptr(db))
33537 }
33538}
33539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33540pub struct TokenDotDotEq<'db> {
33541 node: SyntaxNode<'db>,
33542}
33543impl<'db> Token<'db> for TokenDotDotEq<'db> {
33544 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33545 TokenDotDotEqGreen(
33546 GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33547 .intern(db),
33548 )
33549 }
33550 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33551 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33552 }
33553}
33554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33555pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33556impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33557 type SyntaxNode = TokenDotDotEq<'db>;
33558 fn untyped(self) -> SyntaxStablePtrId<'db> {
33559 self.0
33560 }
33561 fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33562 TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33563 }
33564}
33565impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33566 fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33567 ptr.untyped()
33568 }
33569}
33570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33571pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33572impl<'db> TokenDotDotEqGreen<'db> {
33573 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33574 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33575 }
33576}
33577impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33578 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33579 type StablePtr = TokenDotDotEqPtr<'db>;
33580 type Green = TokenDotDotEqGreen<'db>;
33581 fn missing(db: &'db dyn Database) -> Self::Green {
33582 TokenDotDotEqGreen(
33583 GreenNode {
33584 kind: SyntaxKind::TokenMissing,
33585 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33586 }
33587 .intern(db),
33588 )
33589 }
33590 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33591 match node.long(db).green.long(db).details {
33592 GreenNodeDetails::Token(_) => Self { node },
33593 GreenNodeDetails::Node { .. } => {
33594 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33595 }
33596 }
33597 }
33598 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33599 match node.long(db).green.long(db).details {
33600 GreenNodeDetails::Token(_) => Some(Self { node }),
33601 GreenNodeDetails::Node { .. } => None,
33602 }
33603 }
33604 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33605 self.node
33606 }
33607 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33608 TokenDotDotEqPtr(self.node.stable_ptr(db))
33609 }
33610}
33611#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33612pub struct TerminalDotDotEq<'db> {
33613 node: SyntaxNode<'db>,
33614}
33615impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33616 const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33617 type TokenType = TokenDotDotEq<'db>;
33618 fn new_green(
33619 db: &'db dyn Database,
33620 leading_trivia: TriviaGreen<'db>,
33621 token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33622 trailing_trivia: TriviaGreen<'db>,
33623 ) -> Self::Green {
33624 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33625 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33626 TerminalDotDotEqGreen(
33627 GreenNode {
33628 kind: SyntaxKind::TerminalDotDotEq,
33629 details: GreenNodeDetails::Node { children: children.into(), width },
33630 }
33631 .intern(db),
33632 )
33633 }
33634 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33635 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33636 else {
33637 unreachable!("Expected a node, not a token");
33638 };
33639 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33640 }
33641}
33642impl<'db> TerminalDotDotEq<'db> {
33643 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33644 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33645 }
33646 pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33647 TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33648 }
33649 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33650 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33651 }
33652}
33653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33654pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33655impl<'db> TerminalDotDotEqPtr<'db> {}
33656impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33657 type SyntaxNode = TerminalDotDotEq<'db>;
33658 fn untyped(self) -> SyntaxStablePtrId<'db> {
33659 self.0
33660 }
33661 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33662 TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33663 }
33664}
33665impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33666 fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33667 ptr.untyped()
33668 }
33669}
33670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33671pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33672impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33673 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33674 type StablePtr = TerminalDotDotEqPtr<'db>;
33675 type Green = TerminalDotDotEqGreen<'db>;
33676 fn missing(db: &'db dyn Database) -> Self::Green {
33677 TerminalDotDotEqGreen(
33678 GreenNode {
33679 kind: SyntaxKind::TerminalDotDotEq,
33680 details: GreenNodeDetails::Node {
33681 children: [
33682 Trivia::missing(db).0,
33683 TokenDotDotEq::missing(db).0,
33684 Trivia::missing(db).0,
33685 ]
33686 .into(),
33687 width: TextWidth::default(),
33688 },
33689 }
33690 .intern(db),
33691 )
33692 }
33693 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33694 let kind = node.kind(db);
33695 assert_eq!(
33696 kind,
33697 SyntaxKind::TerminalDotDotEq,
33698 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33699 kind,
33700 SyntaxKind::TerminalDotDotEq
33701 );
33702 Self { node }
33703 }
33704 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33705 let kind = node.kind(db);
33706 if kind == SyntaxKind::TerminalDotDotEq {
33707 Some(Self::from_syntax_node(db, node))
33708 } else {
33709 None
33710 }
33711 }
33712 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33713 self.node
33714 }
33715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33716 TerminalDotDotEqPtr(self.node.stable_ptr(db))
33717 }
33718}
33719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33720pub struct TokenEndOfFile<'db> {
33721 node: SyntaxNode<'db>,
33722}
33723impl<'db> Token<'db> for TokenEndOfFile<'db> {
33724 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33725 TokenEndOfFileGreen(
33726 GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33727 .intern(db),
33728 )
33729 }
33730 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33731 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33732 }
33733}
33734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33735pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33736impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33737 type SyntaxNode = TokenEndOfFile<'db>;
33738 fn untyped(self) -> SyntaxStablePtrId<'db> {
33739 self.0
33740 }
33741 fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33742 TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33743 }
33744}
33745impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33746 fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33747 ptr.untyped()
33748 }
33749}
33750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33751pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33752impl<'db> TokenEndOfFileGreen<'db> {
33753 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33754 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33755 }
33756}
33757impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33758 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33759 type StablePtr = TokenEndOfFilePtr<'db>;
33760 type Green = TokenEndOfFileGreen<'db>;
33761 fn missing(db: &'db dyn Database) -> Self::Green {
33762 TokenEndOfFileGreen(
33763 GreenNode {
33764 kind: SyntaxKind::TokenMissing,
33765 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33766 }
33767 .intern(db),
33768 )
33769 }
33770 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33771 match node.long(db).green.long(db).details {
33772 GreenNodeDetails::Token(_) => Self { node },
33773 GreenNodeDetails::Node { .. } => {
33774 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33775 }
33776 }
33777 }
33778 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33779 match node.long(db).green.long(db).details {
33780 GreenNodeDetails::Token(_) => Some(Self { node }),
33781 GreenNodeDetails::Node { .. } => None,
33782 }
33783 }
33784 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33785 self.node
33786 }
33787 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33788 TokenEndOfFilePtr(self.node.stable_ptr(db))
33789 }
33790}
33791#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33792pub struct TerminalEndOfFile<'db> {
33793 node: SyntaxNode<'db>,
33794}
33795impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33796 const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33797 type TokenType = TokenEndOfFile<'db>;
33798 fn new_green(
33799 db: &'db dyn Database,
33800 leading_trivia: TriviaGreen<'db>,
33801 token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33802 trailing_trivia: TriviaGreen<'db>,
33803 ) -> Self::Green {
33804 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33805 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33806 TerminalEndOfFileGreen(
33807 GreenNode {
33808 kind: SyntaxKind::TerminalEndOfFile,
33809 details: GreenNodeDetails::Node { children: children.into(), width },
33810 }
33811 .intern(db),
33812 )
33813 }
33814 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33815 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33816 else {
33817 unreachable!("Expected a node, not a token");
33818 };
33819 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33820 }
33821}
33822impl<'db> TerminalEndOfFile<'db> {
33823 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33824 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33825 }
33826 pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33827 TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33828 }
33829 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33830 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33831 }
33832}
33833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33834pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33835impl<'db> TerminalEndOfFilePtr<'db> {}
33836impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33837 type SyntaxNode = TerminalEndOfFile<'db>;
33838 fn untyped(self) -> SyntaxStablePtrId<'db> {
33839 self.0
33840 }
33841 fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33842 TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33843 }
33844}
33845impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33846 fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33847 ptr.untyped()
33848 }
33849}
33850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33851pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33852impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33853 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33854 type StablePtr = TerminalEndOfFilePtr<'db>;
33855 type Green = TerminalEndOfFileGreen<'db>;
33856 fn missing(db: &'db dyn Database) -> Self::Green {
33857 TerminalEndOfFileGreen(
33858 GreenNode {
33859 kind: SyntaxKind::TerminalEndOfFile,
33860 details: GreenNodeDetails::Node {
33861 children: [
33862 Trivia::missing(db).0,
33863 TokenEndOfFile::missing(db).0,
33864 Trivia::missing(db).0,
33865 ]
33866 .into(),
33867 width: TextWidth::default(),
33868 },
33869 }
33870 .intern(db),
33871 )
33872 }
33873 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33874 let kind = node.kind(db);
33875 assert_eq!(
33876 kind,
33877 SyntaxKind::TerminalEndOfFile,
33878 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33879 kind,
33880 SyntaxKind::TerminalEndOfFile
33881 );
33882 Self { node }
33883 }
33884 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33885 let kind = node.kind(db);
33886 if kind == SyntaxKind::TerminalEndOfFile {
33887 Some(Self::from_syntax_node(db, node))
33888 } else {
33889 None
33890 }
33891 }
33892 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33893 self.node
33894 }
33895 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33896 TerminalEndOfFilePtr(self.node.stable_ptr(db))
33897 }
33898}
33899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33900pub struct TokenEq<'db> {
33901 node: SyntaxNode<'db>,
33902}
33903impl<'db> Token<'db> for TokenEq<'db> {
33904 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33905 TokenEqGreen(
33906 GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33907 .intern(db),
33908 )
33909 }
33910 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33911 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33912 }
33913}
33914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33915pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33916impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33917 type SyntaxNode = TokenEq<'db>;
33918 fn untyped(self) -> SyntaxStablePtrId<'db> {
33919 self.0
33920 }
33921 fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33922 TokenEq::from_syntax_node(db, self.0.lookup(db))
33923 }
33924}
33925impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33926 fn from(ptr: TokenEqPtr<'db>) -> Self {
33927 ptr.untyped()
33928 }
33929}
33930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33931pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33932impl<'db> TokenEqGreen<'db> {
33933 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33934 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33935 }
33936}
33937impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33938 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33939 type StablePtr = TokenEqPtr<'db>;
33940 type Green = TokenEqGreen<'db>;
33941 fn missing(db: &'db dyn Database) -> Self::Green {
33942 TokenEqGreen(
33943 GreenNode {
33944 kind: SyntaxKind::TokenMissing,
33945 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33946 }
33947 .intern(db),
33948 )
33949 }
33950 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33951 match node.long(db).green.long(db).details {
33952 GreenNodeDetails::Token(_) => Self { node },
33953 GreenNodeDetails::Node { .. } => {
33954 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33955 }
33956 }
33957 }
33958 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33959 match node.long(db).green.long(db).details {
33960 GreenNodeDetails::Token(_) => Some(Self { node }),
33961 GreenNodeDetails::Node { .. } => None,
33962 }
33963 }
33964 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33965 self.node
33966 }
33967 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33968 TokenEqPtr(self.node.stable_ptr(db))
33969 }
33970}
33971#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33972pub struct TerminalEq<'db> {
33973 node: SyntaxNode<'db>,
33974}
33975impl<'db> Terminal<'db> for TerminalEq<'db> {
33976 const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33977 type TokenType = TokenEq<'db>;
33978 fn new_green(
33979 db: &'db dyn Database,
33980 leading_trivia: TriviaGreen<'db>,
33981 token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33982 trailing_trivia: TriviaGreen<'db>,
33983 ) -> Self::Green {
33984 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33985 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33986 TerminalEqGreen(
33987 GreenNode {
33988 kind: SyntaxKind::TerminalEq,
33989 details: GreenNodeDetails::Node { children: children.into(), width },
33990 }
33991 .intern(db),
33992 )
33993 }
33994 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33995 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33996 else {
33997 unreachable!("Expected a node, not a token");
33998 };
33999 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34000 }
34001}
34002impl<'db> TerminalEq<'db> {
34003 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34004 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34005 }
34006 pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
34007 TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
34008 }
34009 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34010 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34011 }
34012}
34013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34014pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34015impl<'db> TerminalEqPtr<'db> {}
34016impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
34017 type SyntaxNode = TerminalEq<'db>;
34018 fn untyped(self) -> SyntaxStablePtrId<'db> {
34019 self.0
34020 }
34021 fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
34022 TerminalEq::from_syntax_node(db, self.0.lookup(db))
34023 }
34024}
34025impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
34026 fn from(ptr: TerminalEqPtr<'db>) -> Self {
34027 ptr.untyped()
34028 }
34029}
34030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34031pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
34032impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
34033 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
34034 type StablePtr = TerminalEqPtr<'db>;
34035 type Green = TerminalEqGreen<'db>;
34036 fn missing(db: &'db dyn Database) -> Self::Green {
34037 TerminalEqGreen(
34038 GreenNode {
34039 kind: SyntaxKind::TerminalEq,
34040 details: GreenNodeDetails::Node {
34041 children: [
34042 Trivia::missing(db).0,
34043 TokenEq::missing(db).0,
34044 Trivia::missing(db).0,
34045 ]
34046 .into(),
34047 width: TextWidth::default(),
34048 },
34049 }
34050 .intern(db),
34051 )
34052 }
34053 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34054 let kind = node.kind(db);
34055 assert_eq!(
34056 kind,
34057 SyntaxKind::TerminalEq,
34058 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34059 kind,
34060 SyntaxKind::TerminalEq
34061 );
34062 Self { node }
34063 }
34064 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34065 let kind = node.kind(db);
34066 if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
34067 }
34068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34069 self.node
34070 }
34071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34072 TerminalEqPtr(self.node.stable_ptr(db))
34073 }
34074}
34075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34076pub struct TokenEqEq<'db> {
34077 node: SyntaxNode<'db>,
34078}
34079impl<'db> Token<'db> for TokenEqEq<'db> {
34080 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34081 TokenEqEqGreen(
34082 GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
34083 .intern(db),
34084 )
34085 }
34086 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34087 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34088 }
34089}
34090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34091pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34092impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
34093 type SyntaxNode = TokenEqEq<'db>;
34094 fn untyped(self) -> SyntaxStablePtrId<'db> {
34095 self.0
34096 }
34097 fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
34098 TokenEqEq::from_syntax_node(db, self.0.lookup(db))
34099 }
34100}
34101impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34102 fn from(ptr: TokenEqEqPtr<'db>) -> Self {
34103 ptr.untyped()
34104 }
34105}
34106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34107pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
34108impl<'db> TokenEqEqGreen<'db> {
34109 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34110 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34111 }
34112}
34113impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
34114 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
34115 type StablePtr = TokenEqEqPtr<'db>;
34116 type Green = TokenEqEqGreen<'db>;
34117 fn missing(db: &'db dyn Database) -> Self::Green {
34118 TokenEqEqGreen(
34119 GreenNode {
34120 kind: SyntaxKind::TokenMissing,
34121 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34122 }
34123 .intern(db),
34124 )
34125 }
34126 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34127 match node.long(db).green.long(db).details {
34128 GreenNodeDetails::Token(_) => Self { node },
34129 GreenNodeDetails::Node { .. } => {
34130 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
34131 }
34132 }
34133 }
34134 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34135 match node.long(db).green.long(db).details {
34136 GreenNodeDetails::Token(_) => Some(Self { node }),
34137 GreenNodeDetails::Node { .. } => None,
34138 }
34139 }
34140 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34141 self.node
34142 }
34143 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34144 TokenEqEqPtr(self.node.stable_ptr(db))
34145 }
34146}
34147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34148pub struct TerminalEqEq<'db> {
34149 node: SyntaxNode<'db>,
34150}
34151impl<'db> Terminal<'db> for TerminalEqEq<'db> {
34152 const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
34153 type TokenType = TokenEqEq<'db>;
34154 fn new_green(
34155 db: &'db dyn Database,
34156 leading_trivia: TriviaGreen<'db>,
34157 token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34158 trailing_trivia: TriviaGreen<'db>,
34159 ) -> Self::Green {
34160 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34161 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34162 TerminalEqEqGreen(
34163 GreenNode {
34164 kind: SyntaxKind::TerminalEqEq,
34165 details: GreenNodeDetails::Node { children: children.into(), width },
34166 }
34167 .intern(db),
34168 )
34169 }
34170 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34171 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34172 else {
34173 unreachable!("Expected a node, not a token");
34174 };
34175 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34176 }
34177}
34178impl<'db> TerminalEqEq<'db> {
34179 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34180 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34181 }
34182 pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
34183 TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
34184 }
34185 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34186 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34187 }
34188}
34189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34190pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34191impl<'db> TerminalEqEqPtr<'db> {}
34192impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
34193 type SyntaxNode = TerminalEqEq<'db>;
34194 fn untyped(self) -> SyntaxStablePtrId<'db> {
34195 self.0
34196 }
34197 fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
34198 TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
34199 }
34200}
34201impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34202 fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
34203 ptr.untyped()
34204 }
34205}
34206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34207pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
34208impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
34209 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
34210 type StablePtr = TerminalEqEqPtr<'db>;
34211 type Green = TerminalEqEqGreen<'db>;
34212 fn missing(db: &'db dyn Database) -> Self::Green {
34213 TerminalEqEqGreen(
34214 GreenNode {
34215 kind: SyntaxKind::TerminalEqEq,
34216 details: GreenNodeDetails::Node {
34217 children: [
34218 Trivia::missing(db).0,
34219 TokenEqEq::missing(db).0,
34220 Trivia::missing(db).0,
34221 ]
34222 .into(),
34223 width: TextWidth::default(),
34224 },
34225 }
34226 .intern(db),
34227 )
34228 }
34229 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34230 let kind = node.kind(db);
34231 assert_eq!(
34232 kind,
34233 SyntaxKind::TerminalEqEq,
34234 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34235 kind,
34236 SyntaxKind::TerminalEqEq
34237 );
34238 Self { node }
34239 }
34240 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34241 let kind = node.kind(db);
34242 if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
34243 }
34244 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34245 self.node
34246 }
34247 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34248 TerminalEqEqPtr(self.node.stable_ptr(db))
34249 }
34250}
34251#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34252pub struct TokenGE<'db> {
34253 node: SyntaxNode<'db>,
34254}
34255impl<'db> Token<'db> for TokenGE<'db> {
34256 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34257 TokenGEGreen(
34258 GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
34259 .intern(db),
34260 )
34261 }
34262 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34263 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34264 }
34265}
34266#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34267pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34268impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
34269 type SyntaxNode = TokenGE<'db>;
34270 fn untyped(self) -> SyntaxStablePtrId<'db> {
34271 self.0
34272 }
34273 fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
34274 TokenGE::from_syntax_node(db, self.0.lookup(db))
34275 }
34276}
34277impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
34278 fn from(ptr: TokenGEPtr<'db>) -> Self {
34279 ptr.untyped()
34280 }
34281}
34282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34283pub struct TokenGEGreen<'db>(pub GreenId<'db>);
34284impl<'db> TokenGEGreen<'db> {
34285 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34286 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34287 }
34288}
34289impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
34290 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
34291 type StablePtr = TokenGEPtr<'db>;
34292 type Green = TokenGEGreen<'db>;
34293 fn missing(db: &'db dyn Database) -> Self::Green {
34294 TokenGEGreen(
34295 GreenNode {
34296 kind: SyntaxKind::TokenMissing,
34297 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34298 }
34299 .intern(db),
34300 )
34301 }
34302 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34303 match node.long(db).green.long(db).details {
34304 GreenNodeDetails::Token(_) => Self { node },
34305 GreenNodeDetails::Node { .. } => {
34306 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
34307 }
34308 }
34309 }
34310 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34311 match node.long(db).green.long(db).details {
34312 GreenNodeDetails::Token(_) => Some(Self { node }),
34313 GreenNodeDetails::Node { .. } => None,
34314 }
34315 }
34316 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34317 self.node
34318 }
34319 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34320 TokenGEPtr(self.node.stable_ptr(db))
34321 }
34322}
34323#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34324pub struct TerminalGE<'db> {
34325 node: SyntaxNode<'db>,
34326}
34327impl<'db> Terminal<'db> for TerminalGE<'db> {
34328 const KIND: SyntaxKind = SyntaxKind::TerminalGE;
34329 type TokenType = TokenGE<'db>;
34330 fn new_green(
34331 db: &'db dyn Database,
34332 leading_trivia: TriviaGreen<'db>,
34333 token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34334 trailing_trivia: TriviaGreen<'db>,
34335 ) -> Self::Green {
34336 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34337 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34338 TerminalGEGreen(
34339 GreenNode {
34340 kind: SyntaxKind::TerminalGE,
34341 details: GreenNodeDetails::Node { children: children.into(), width },
34342 }
34343 .intern(db),
34344 )
34345 }
34346 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34347 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34348 else {
34349 unreachable!("Expected a node, not a token");
34350 };
34351 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34352 }
34353}
34354impl<'db> TerminalGE<'db> {
34355 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34356 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34357 }
34358 pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
34359 TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
34360 }
34361 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34362 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34363 }
34364}
34365#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34366pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34367impl<'db> TerminalGEPtr<'db> {}
34368impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
34369 type SyntaxNode = TerminalGE<'db>;
34370 fn untyped(self) -> SyntaxStablePtrId<'db> {
34371 self.0
34372 }
34373 fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
34374 TerminalGE::from_syntax_node(db, self.0.lookup(db))
34375 }
34376}
34377impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
34378 fn from(ptr: TerminalGEPtr<'db>) -> Self {
34379 ptr.untyped()
34380 }
34381}
34382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34383pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
34384impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
34385 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
34386 type StablePtr = TerminalGEPtr<'db>;
34387 type Green = TerminalGEGreen<'db>;
34388 fn missing(db: &'db dyn Database) -> Self::Green {
34389 TerminalGEGreen(
34390 GreenNode {
34391 kind: SyntaxKind::TerminalGE,
34392 details: GreenNodeDetails::Node {
34393 children: [
34394 Trivia::missing(db).0,
34395 TokenGE::missing(db).0,
34396 Trivia::missing(db).0,
34397 ]
34398 .into(),
34399 width: TextWidth::default(),
34400 },
34401 }
34402 .intern(db),
34403 )
34404 }
34405 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34406 let kind = node.kind(db);
34407 assert_eq!(
34408 kind,
34409 SyntaxKind::TerminalGE,
34410 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34411 kind,
34412 SyntaxKind::TerminalGE
34413 );
34414 Self { node }
34415 }
34416 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34417 let kind = node.kind(db);
34418 if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
34419 }
34420 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34421 self.node
34422 }
34423 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34424 TerminalGEPtr(self.node.stable_ptr(db))
34425 }
34426}
34427#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34428pub struct TokenGT<'db> {
34429 node: SyntaxNode<'db>,
34430}
34431impl<'db> Token<'db> for TokenGT<'db> {
34432 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34433 TokenGTGreen(
34434 GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
34435 .intern(db),
34436 )
34437 }
34438 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34439 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34440 }
34441}
34442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34443pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34444impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34445 type SyntaxNode = TokenGT<'db>;
34446 fn untyped(self) -> SyntaxStablePtrId<'db> {
34447 self.0
34448 }
34449 fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34450 TokenGT::from_syntax_node(db, self.0.lookup(db))
34451 }
34452}
34453impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34454 fn from(ptr: TokenGTPtr<'db>) -> Self {
34455 ptr.untyped()
34456 }
34457}
34458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34459pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34460impl<'db> TokenGTGreen<'db> {
34461 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34462 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34463 }
34464}
34465impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34466 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34467 type StablePtr = TokenGTPtr<'db>;
34468 type Green = TokenGTGreen<'db>;
34469 fn missing(db: &'db dyn Database) -> Self::Green {
34470 TokenGTGreen(
34471 GreenNode {
34472 kind: SyntaxKind::TokenMissing,
34473 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34474 }
34475 .intern(db),
34476 )
34477 }
34478 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34479 match node.long(db).green.long(db).details {
34480 GreenNodeDetails::Token(_) => Self { node },
34481 GreenNodeDetails::Node { .. } => {
34482 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34483 }
34484 }
34485 }
34486 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34487 match node.long(db).green.long(db).details {
34488 GreenNodeDetails::Token(_) => Some(Self { node }),
34489 GreenNodeDetails::Node { .. } => None,
34490 }
34491 }
34492 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34493 self.node
34494 }
34495 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34496 TokenGTPtr(self.node.stable_ptr(db))
34497 }
34498}
34499#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34500pub struct TerminalGT<'db> {
34501 node: SyntaxNode<'db>,
34502}
34503impl<'db> Terminal<'db> for TerminalGT<'db> {
34504 const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34505 type TokenType = TokenGT<'db>;
34506 fn new_green(
34507 db: &'db dyn Database,
34508 leading_trivia: TriviaGreen<'db>,
34509 token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34510 trailing_trivia: TriviaGreen<'db>,
34511 ) -> Self::Green {
34512 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34513 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34514 TerminalGTGreen(
34515 GreenNode {
34516 kind: SyntaxKind::TerminalGT,
34517 details: GreenNodeDetails::Node { children: children.into(), width },
34518 }
34519 .intern(db),
34520 )
34521 }
34522 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34523 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34524 else {
34525 unreachable!("Expected a node, not a token");
34526 };
34527 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34528 }
34529}
34530impl<'db> TerminalGT<'db> {
34531 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34532 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34533 }
34534 pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34535 TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34536 }
34537 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34538 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34539 }
34540}
34541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34542pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34543impl<'db> TerminalGTPtr<'db> {}
34544impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34545 type SyntaxNode = TerminalGT<'db>;
34546 fn untyped(self) -> SyntaxStablePtrId<'db> {
34547 self.0
34548 }
34549 fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34550 TerminalGT::from_syntax_node(db, self.0.lookup(db))
34551 }
34552}
34553impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34554 fn from(ptr: TerminalGTPtr<'db>) -> Self {
34555 ptr.untyped()
34556 }
34557}
34558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34559pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34560impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34561 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34562 type StablePtr = TerminalGTPtr<'db>;
34563 type Green = TerminalGTGreen<'db>;
34564 fn missing(db: &'db dyn Database) -> Self::Green {
34565 TerminalGTGreen(
34566 GreenNode {
34567 kind: SyntaxKind::TerminalGT,
34568 details: GreenNodeDetails::Node {
34569 children: [
34570 Trivia::missing(db).0,
34571 TokenGT::missing(db).0,
34572 Trivia::missing(db).0,
34573 ]
34574 .into(),
34575 width: TextWidth::default(),
34576 },
34577 }
34578 .intern(db),
34579 )
34580 }
34581 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34582 let kind = node.kind(db);
34583 assert_eq!(
34584 kind,
34585 SyntaxKind::TerminalGT,
34586 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34587 kind,
34588 SyntaxKind::TerminalGT
34589 );
34590 Self { node }
34591 }
34592 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34593 let kind = node.kind(db);
34594 if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34595 }
34596 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34597 self.node
34598 }
34599 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34600 TerminalGTPtr(self.node.stable_ptr(db))
34601 }
34602}
34603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34604pub struct TokenHash<'db> {
34605 node: SyntaxNode<'db>,
34606}
34607impl<'db> Token<'db> for TokenHash<'db> {
34608 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34609 TokenHashGreen(
34610 GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34611 .intern(db),
34612 )
34613 }
34614 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34615 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34616 }
34617}
34618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34619pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34620impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34621 type SyntaxNode = TokenHash<'db>;
34622 fn untyped(self) -> SyntaxStablePtrId<'db> {
34623 self.0
34624 }
34625 fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34626 TokenHash::from_syntax_node(db, self.0.lookup(db))
34627 }
34628}
34629impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34630 fn from(ptr: TokenHashPtr<'db>) -> Self {
34631 ptr.untyped()
34632 }
34633}
34634#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34635pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34636impl<'db> TokenHashGreen<'db> {
34637 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34638 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34639 }
34640}
34641impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34642 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34643 type StablePtr = TokenHashPtr<'db>;
34644 type Green = TokenHashGreen<'db>;
34645 fn missing(db: &'db dyn Database) -> Self::Green {
34646 TokenHashGreen(
34647 GreenNode {
34648 kind: SyntaxKind::TokenMissing,
34649 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34650 }
34651 .intern(db),
34652 )
34653 }
34654 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34655 match node.long(db).green.long(db).details {
34656 GreenNodeDetails::Token(_) => Self { node },
34657 GreenNodeDetails::Node { .. } => {
34658 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34659 }
34660 }
34661 }
34662 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34663 match node.long(db).green.long(db).details {
34664 GreenNodeDetails::Token(_) => Some(Self { node }),
34665 GreenNodeDetails::Node { .. } => None,
34666 }
34667 }
34668 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34669 self.node
34670 }
34671 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34672 TokenHashPtr(self.node.stable_ptr(db))
34673 }
34674}
34675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34676pub struct TerminalHash<'db> {
34677 node: SyntaxNode<'db>,
34678}
34679impl<'db> Terminal<'db> for TerminalHash<'db> {
34680 const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34681 type TokenType = TokenHash<'db>;
34682 fn new_green(
34683 db: &'db dyn Database,
34684 leading_trivia: TriviaGreen<'db>,
34685 token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34686 trailing_trivia: TriviaGreen<'db>,
34687 ) -> Self::Green {
34688 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34689 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34690 TerminalHashGreen(
34691 GreenNode {
34692 kind: SyntaxKind::TerminalHash,
34693 details: GreenNodeDetails::Node { children: children.into(), width },
34694 }
34695 .intern(db),
34696 )
34697 }
34698 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34699 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34700 else {
34701 unreachable!("Expected a node, not a token");
34702 };
34703 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34704 }
34705}
34706impl<'db> TerminalHash<'db> {
34707 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34708 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34709 }
34710 pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34711 TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34712 }
34713 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34714 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34715 }
34716}
34717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34718pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34719impl<'db> TerminalHashPtr<'db> {}
34720impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34721 type SyntaxNode = TerminalHash<'db>;
34722 fn untyped(self) -> SyntaxStablePtrId<'db> {
34723 self.0
34724 }
34725 fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34726 TerminalHash::from_syntax_node(db, self.0.lookup(db))
34727 }
34728}
34729impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34730 fn from(ptr: TerminalHashPtr<'db>) -> Self {
34731 ptr.untyped()
34732 }
34733}
34734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34735pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34736impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34737 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34738 type StablePtr = TerminalHashPtr<'db>;
34739 type Green = TerminalHashGreen<'db>;
34740 fn missing(db: &'db dyn Database) -> Self::Green {
34741 TerminalHashGreen(
34742 GreenNode {
34743 kind: SyntaxKind::TerminalHash,
34744 details: GreenNodeDetails::Node {
34745 children: [
34746 Trivia::missing(db).0,
34747 TokenHash::missing(db).0,
34748 Trivia::missing(db).0,
34749 ]
34750 .into(),
34751 width: TextWidth::default(),
34752 },
34753 }
34754 .intern(db),
34755 )
34756 }
34757 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34758 let kind = node.kind(db);
34759 assert_eq!(
34760 kind,
34761 SyntaxKind::TerminalHash,
34762 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34763 kind,
34764 SyntaxKind::TerminalHash
34765 );
34766 Self { node }
34767 }
34768 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34769 let kind = node.kind(db);
34770 if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34771 }
34772 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34773 self.node
34774 }
34775 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34776 TerminalHashPtr(self.node.stable_ptr(db))
34777 }
34778}
34779#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34780pub struct TokenLBrace<'db> {
34781 node: SyntaxNode<'db>,
34782}
34783impl<'db> Token<'db> for TokenLBrace<'db> {
34784 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34785 TokenLBraceGreen(
34786 GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34787 .intern(db),
34788 )
34789 }
34790 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34791 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34792 }
34793}
34794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34795pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34796impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34797 type SyntaxNode = TokenLBrace<'db>;
34798 fn untyped(self) -> SyntaxStablePtrId<'db> {
34799 self.0
34800 }
34801 fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34802 TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34803 }
34804}
34805impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34806 fn from(ptr: TokenLBracePtr<'db>) -> Self {
34807 ptr.untyped()
34808 }
34809}
34810#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34811pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34812impl<'db> TokenLBraceGreen<'db> {
34813 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34814 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34815 }
34816}
34817impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34818 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34819 type StablePtr = TokenLBracePtr<'db>;
34820 type Green = TokenLBraceGreen<'db>;
34821 fn missing(db: &'db dyn Database) -> Self::Green {
34822 TokenLBraceGreen(
34823 GreenNode {
34824 kind: SyntaxKind::TokenMissing,
34825 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34826 }
34827 .intern(db),
34828 )
34829 }
34830 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34831 match node.long(db).green.long(db).details {
34832 GreenNodeDetails::Token(_) => Self { node },
34833 GreenNodeDetails::Node { .. } => {
34834 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34835 }
34836 }
34837 }
34838 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34839 match node.long(db).green.long(db).details {
34840 GreenNodeDetails::Token(_) => Some(Self { node }),
34841 GreenNodeDetails::Node { .. } => None,
34842 }
34843 }
34844 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34845 self.node
34846 }
34847 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34848 TokenLBracePtr(self.node.stable_ptr(db))
34849 }
34850}
34851#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34852pub struct TerminalLBrace<'db> {
34853 node: SyntaxNode<'db>,
34854}
34855impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34856 const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34857 type TokenType = TokenLBrace<'db>;
34858 fn new_green(
34859 db: &'db dyn Database,
34860 leading_trivia: TriviaGreen<'db>,
34861 token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34862 trailing_trivia: TriviaGreen<'db>,
34863 ) -> Self::Green {
34864 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34865 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34866 TerminalLBraceGreen(
34867 GreenNode {
34868 kind: SyntaxKind::TerminalLBrace,
34869 details: GreenNodeDetails::Node { children: children.into(), width },
34870 }
34871 .intern(db),
34872 )
34873 }
34874 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34875 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34876 else {
34877 unreachable!("Expected a node, not a token");
34878 };
34879 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34880 }
34881}
34882impl<'db> TerminalLBrace<'db> {
34883 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34884 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34885 }
34886 pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34887 TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34888 }
34889 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34890 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34891 }
34892}
34893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34894pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34895impl<'db> TerminalLBracePtr<'db> {}
34896impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34897 type SyntaxNode = TerminalLBrace<'db>;
34898 fn untyped(self) -> SyntaxStablePtrId<'db> {
34899 self.0
34900 }
34901 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34902 TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34903 }
34904}
34905impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34906 fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34907 ptr.untyped()
34908 }
34909}
34910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34911pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34912impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34913 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34914 type StablePtr = TerminalLBracePtr<'db>;
34915 type Green = TerminalLBraceGreen<'db>;
34916 fn missing(db: &'db dyn Database) -> Self::Green {
34917 TerminalLBraceGreen(
34918 GreenNode {
34919 kind: SyntaxKind::TerminalLBrace,
34920 details: GreenNodeDetails::Node {
34921 children: [
34922 Trivia::missing(db).0,
34923 TokenLBrace::missing(db).0,
34924 Trivia::missing(db).0,
34925 ]
34926 .into(),
34927 width: TextWidth::default(),
34928 },
34929 }
34930 .intern(db),
34931 )
34932 }
34933 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34934 let kind = node.kind(db);
34935 assert_eq!(
34936 kind,
34937 SyntaxKind::TerminalLBrace,
34938 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34939 kind,
34940 SyntaxKind::TerminalLBrace
34941 );
34942 Self { node }
34943 }
34944 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34945 let kind = node.kind(db);
34946 if kind == SyntaxKind::TerminalLBrace {
34947 Some(Self::from_syntax_node(db, node))
34948 } else {
34949 None
34950 }
34951 }
34952 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34953 self.node
34954 }
34955 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34956 TerminalLBracePtr(self.node.stable_ptr(db))
34957 }
34958}
34959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34960pub struct TokenLBrack<'db> {
34961 node: SyntaxNode<'db>,
34962}
34963impl<'db> Token<'db> for TokenLBrack<'db> {
34964 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34965 TokenLBrackGreen(
34966 GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34967 .intern(db),
34968 )
34969 }
34970 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34971 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34972 }
34973}
34974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34975pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34976impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34977 type SyntaxNode = TokenLBrack<'db>;
34978 fn untyped(self) -> SyntaxStablePtrId<'db> {
34979 self.0
34980 }
34981 fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34982 TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34983 }
34984}
34985impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34986 fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34987 ptr.untyped()
34988 }
34989}
34990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34991pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34992impl<'db> TokenLBrackGreen<'db> {
34993 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34994 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34995 }
34996}
34997impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34998 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34999 type StablePtr = TokenLBrackPtr<'db>;
35000 type Green = TokenLBrackGreen<'db>;
35001 fn missing(db: &'db dyn Database) -> Self::Green {
35002 TokenLBrackGreen(
35003 GreenNode {
35004 kind: SyntaxKind::TokenMissing,
35005 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35006 }
35007 .intern(db),
35008 )
35009 }
35010 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35011 match node.long(db).green.long(db).details {
35012 GreenNodeDetails::Token(_) => Self { node },
35013 GreenNodeDetails::Node { .. } => {
35014 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
35015 }
35016 }
35017 }
35018 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35019 match node.long(db).green.long(db).details {
35020 GreenNodeDetails::Token(_) => Some(Self { node }),
35021 GreenNodeDetails::Node { .. } => None,
35022 }
35023 }
35024 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35025 self.node
35026 }
35027 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35028 TokenLBrackPtr(self.node.stable_ptr(db))
35029 }
35030}
35031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35032pub struct TerminalLBrack<'db> {
35033 node: SyntaxNode<'db>,
35034}
35035impl<'db> Terminal<'db> for TerminalLBrack<'db> {
35036 const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
35037 type TokenType = TokenLBrack<'db>;
35038 fn new_green(
35039 db: &'db dyn Database,
35040 leading_trivia: TriviaGreen<'db>,
35041 token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35042 trailing_trivia: TriviaGreen<'db>,
35043 ) -> Self::Green {
35044 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35045 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35046 TerminalLBrackGreen(
35047 GreenNode {
35048 kind: SyntaxKind::TerminalLBrack,
35049 details: GreenNodeDetails::Node { children: children.into(), width },
35050 }
35051 .intern(db),
35052 )
35053 }
35054 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35055 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35056 else {
35057 unreachable!("Expected a node, not a token");
35058 };
35059 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35060 }
35061}
35062impl<'db> TerminalLBrack<'db> {
35063 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35064 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35065 }
35066 pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
35067 TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
35068 }
35069 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35070 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35071 }
35072}
35073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35074pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
35075impl<'db> TerminalLBrackPtr<'db> {}
35076impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
35077 type SyntaxNode = TerminalLBrack<'db>;
35078 fn untyped(self) -> SyntaxStablePtrId<'db> {
35079 self.0
35080 }
35081 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
35082 TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
35083 }
35084}
35085impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
35086 fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
35087 ptr.untyped()
35088 }
35089}
35090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35091pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
35092impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
35093 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
35094 type StablePtr = TerminalLBrackPtr<'db>;
35095 type Green = TerminalLBrackGreen<'db>;
35096 fn missing(db: &'db dyn Database) -> Self::Green {
35097 TerminalLBrackGreen(
35098 GreenNode {
35099 kind: SyntaxKind::TerminalLBrack,
35100 details: GreenNodeDetails::Node {
35101 children: [
35102 Trivia::missing(db).0,
35103 TokenLBrack::missing(db).0,
35104 Trivia::missing(db).0,
35105 ]
35106 .into(),
35107 width: TextWidth::default(),
35108 },
35109 }
35110 .intern(db),
35111 )
35112 }
35113 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35114 let kind = node.kind(db);
35115 assert_eq!(
35116 kind,
35117 SyntaxKind::TerminalLBrack,
35118 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35119 kind,
35120 SyntaxKind::TerminalLBrack
35121 );
35122 Self { node }
35123 }
35124 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35125 let kind = node.kind(db);
35126 if kind == SyntaxKind::TerminalLBrack {
35127 Some(Self::from_syntax_node(db, node))
35128 } else {
35129 None
35130 }
35131 }
35132 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35133 self.node
35134 }
35135 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35136 TerminalLBrackPtr(self.node.stable_ptr(db))
35137 }
35138}
35139#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35140pub struct TokenLE<'db> {
35141 node: SyntaxNode<'db>,
35142}
35143impl<'db> Token<'db> for TokenLE<'db> {
35144 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35145 TokenLEGreen(
35146 GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
35147 .intern(db),
35148 )
35149 }
35150 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35151 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35152 }
35153}
35154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35155pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35156impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
35157 type SyntaxNode = TokenLE<'db>;
35158 fn untyped(self) -> SyntaxStablePtrId<'db> {
35159 self.0
35160 }
35161 fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
35162 TokenLE::from_syntax_node(db, self.0.lookup(db))
35163 }
35164}
35165impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
35166 fn from(ptr: TokenLEPtr<'db>) -> Self {
35167 ptr.untyped()
35168 }
35169}
35170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35171pub struct TokenLEGreen<'db>(pub GreenId<'db>);
35172impl<'db> TokenLEGreen<'db> {
35173 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35174 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35175 }
35176}
35177impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
35178 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
35179 type StablePtr = TokenLEPtr<'db>;
35180 type Green = TokenLEGreen<'db>;
35181 fn missing(db: &'db dyn Database) -> Self::Green {
35182 TokenLEGreen(
35183 GreenNode {
35184 kind: SyntaxKind::TokenMissing,
35185 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35186 }
35187 .intern(db),
35188 )
35189 }
35190 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35191 match node.long(db).green.long(db).details {
35192 GreenNodeDetails::Token(_) => Self { node },
35193 GreenNodeDetails::Node { .. } => {
35194 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
35195 }
35196 }
35197 }
35198 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35199 match node.long(db).green.long(db).details {
35200 GreenNodeDetails::Token(_) => Some(Self { node }),
35201 GreenNodeDetails::Node { .. } => None,
35202 }
35203 }
35204 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35205 self.node
35206 }
35207 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35208 TokenLEPtr(self.node.stable_ptr(db))
35209 }
35210}
35211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35212pub struct TerminalLE<'db> {
35213 node: SyntaxNode<'db>,
35214}
35215impl<'db> Terminal<'db> for TerminalLE<'db> {
35216 const KIND: SyntaxKind = SyntaxKind::TerminalLE;
35217 type TokenType = TokenLE<'db>;
35218 fn new_green(
35219 db: &'db dyn Database,
35220 leading_trivia: TriviaGreen<'db>,
35221 token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35222 trailing_trivia: TriviaGreen<'db>,
35223 ) -> Self::Green {
35224 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35225 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35226 TerminalLEGreen(
35227 GreenNode {
35228 kind: SyntaxKind::TerminalLE,
35229 details: GreenNodeDetails::Node { children: children.into(), width },
35230 }
35231 .intern(db),
35232 )
35233 }
35234 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35235 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35236 else {
35237 unreachable!("Expected a node, not a token");
35238 };
35239 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35240 }
35241}
35242impl<'db> TerminalLE<'db> {
35243 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35244 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35245 }
35246 pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
35247 TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
35248 }
35249 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35250 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35251 }
35252}
35253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35254pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35255impl<'db> TerminalLEPtr<'db> {}
35256impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
35257 type SyntaxNode = TerminalLE<'db>;
35258 fn untyped(self) -> SyntaxStablePtrId<'db> {
35259 self.0
35260 }
35261 fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
35262 TerminalLE::from_syntax_node(db, self.0.lookup(db))
35263 }
35264}
35265impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
35266 fn from(ptr: TerminalLEPtr<'db>) -> Self {
35267 ptr.untyped()
35268 }
35269}
35270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35271pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
35272impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
35273 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
35274 type StablePtr = TerminalLEPtr<'db>;
35275 type Green = TerminalLEGreen<'db>;
35276 fn missing(db: &'db dyn Database) -> Self::Green {
35277 TerminalLEGreen(
35278 GreenNode {
35279 kind: SyntaxKind::TerminalLE,
35280 details: GreenNodeDetails::Node {
35281 children: [
35282 Trivia::missing(db).0,
35283 TokenLE::missing(db).0,
35284 Trivia::missing(db).0,
35285 ]
35286 .into(),
35287 width: TextWidth::default(),
35288 },
35289 }
35290 .intern(db),
35291 )
35292 }
35293 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35294 let kind = node.kind(db);
35295 assert_eq!(
35296 kind,
35297 SyntaxKind::TerminalLE,
35298 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35299 kind,
35300 SyntaxKind::TerminalLE
35301 );
35302 Self { node }
35303 }
35304 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35305 let kind = node.kind(db);
35306 if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
35307 }
35308 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35309 self.node
35310 }
35311 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35312 TerminalLEPtr(self.node.stable_ptr(db))
35313 }
35314}
35315#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35316pub struct TokenLParen<'db> {
35317 node: SyntaxNode<'db>,
35318}
35319impl<'db> Token<'db> for TokenLParen<'db> {
35320 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35321 TokenLParenGreen(
35322 GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
35323 .intern(db),
35324 )
35325 }
35326 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35327 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35328 }
35329}
35330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35331pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35332impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
35333 type SyntaxNode = TokenLParen<'db>;
35334 fn untyped(self) -> SyntaxStablePtrId<'db> {
35335 self.0
35336 }
35337 fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35338 TokenLParen::from_syntax_node(db, self.0.lookup(db))
35339 }
35340}
35341impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35342 fn from(ptr: TokenLParenPtr<'db>) -> Self {
35343 ptr.untyped()
35344 }
35345}
35346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35347pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
35348impl<'db> TokenLParenGreen<'db> {
35349 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35350 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35351 }
35352}
35353impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
35354 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
35355 type StablePtr = TokenLParenPtr<'db>;
35356 type Green = TokenLParenGreen<'db>;
35357 fn missing(db: &'db dyn Database) -> Self::Green {
35358 TokenLParenGreen(
35359 GreenNode {
35360 kind: SyntaxKind::TokenMissing,
35361 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35362 }
35363 .intern(db),
35364 )
35365 }
35366 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35367 match node.long(db).green.long(db).details {
35368 GreenNodeDetails::Token(_) => Self { node },
35369 GreenNodeDetails::Node { .. } => {
35370 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
35371 }
35372 }
35373 }
35374 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35375 match node.long(db).green.long(db).details {
35376 GreenNodeDetails::Token(_) => Some(Self { node }),
35377 GreenNodeDetails::Node { .. } => None,
35378 }
35379 }
35380 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35381 self.node
35382 }
35383 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35384 TokenLParenPtr(self.node.stable_ptr(db))
35385 }
35386}
35387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35388pub struct TerminalLParen<'db> {
35389 node: SyntaxNode<'db>,
35390}
35391impl<'db> Terminal<'db> for TerminalLParen<'db> {
35392 const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
35393 type TokenType = TokenLParen<'db>;
35394 fn new_green(
35395 db: &'db dyn Database,
35396 leading_trivia: TriviaGreen<'db>,
35397 token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35398 trailing_trivia: TriviaGreen<'db>,
35399 ) -> Self::Green {
35400 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35401 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35402 TerminalLParenGreen(
35403 GreenNode {
35404 kind: SyntaxKind::TerminalLParen,
35405 details: GreenNodeDetails::Node { children: children.into(), width },
35406 }
35407 .intern(db),
35408 )
35409 }
35410 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35411 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35412 else {
35413 unreachable!("Expected a node, not a token");
35414 };
35415 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35416 }
35417}
35418impl<'db> TerminalLParen<'db> {
35419 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35420 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35421 }
35422 pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35423 TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
35424 }
35425 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35426 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35427 }
35428}
35429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35430pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35431impl<'db> TerminalLParenPtr<'db> {}
35432impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
35433 type SyntaxNode = TerminalLParen<'db>;
35434 fn untyped(self) -> SyntaxStablePtrId<'db> {
35435 self.0
35436 }
35437 fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
35438 TerminalLParen::from_syntax_node(db, self.0.lookup(db))
35439 }
35440}
35441impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35442 fn from(ptr: TerminalLParenPtr<'db>) -> Self {
35443 ptr.untyped()
35444 }
35445}
35446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35447pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
35448impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
35449 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
35450 type StablePtr = TerminalLParenPtr<'db>;
35451 type Green = TerminalLParenGreen<'db>;
35452 fn missing(db: &'db dyn Database) -> Self::Green {
35453 TerminalLParenGreen(
35454 GreenNode {
35455 kind: SyntaxKind::TerminalLParen,
35456 details: GreenNodeDetails::Node {
35457 children: [
35458 Trivia::missing(db).0,
35459 TokenLParen::missing(db).0,
35460 Trivia::missing(db).0,
35461 ]
35462 .into(),
35463 width: TextWidth::default(),
35464 },
35465 }
35466 .intern(db),
35467 )
35468 }
35469 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35470 let kind = node.kind(db);
35471 assert_eq!(
35472 kind,
35473 SyntaxKind::TerminalLParen,
35474 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35475 kind,
35476 SyntaxKind::TerminalLParen
35477 );
35478 Self { node }
35479 }
35480 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35481 let kind = node.kind(db);
35482 if kind == SyntaxKind::TerminalLParen {
35483 Some(Self::from_syntax_node(db, node))
35484 } else {
35485 None
35486 }
35487 }
35488 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35489 self.node
35490 }
35491 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35492 TerminalLParenPtr(self.node.stable_ptr(db))
35493 }
35494}
35495#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35496pub struct TokenLT<'db> {
35497 node: SyntaxNode<'db>,
35498}
35499impl<'db> Token<'db> for TokenLT<'db> {
35500 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35501 TokenLTGreen(
35502 GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35503 .intern(db),
35504 )
35505 }
35506 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35507 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35508 }
35509}
35510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35511pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35512impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35513 type SyntaxNode = TokenLT<'db>;
35514 fn untyped(self) -> SyntaxStablePtrId<'db> {
35515 self.0
35516 }
35517 fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35518 TokenLT::from_syntax_node(db, self.0.lookup(db))
35519 }
35520}
35521impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35522 fn from(ptr: TokenLTPtr<'db>) -> Self {
35523 ptr.untyped()
35524 }
35525}
35526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35527pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35528impl<'db> TokenLTGreen<'db> {
35529 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35530 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35531 }
35532}
35533impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35534 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35535 type StablePtr = TokenLTPtr<'db>;
35536 type Green = TokenLTGreen<'db>;
35537 fn missing(db: &'db dyn Database) -> Self::Green {
35538 TokenLTGreen(
35539 GreenNode {
35540 kind: SyntaxKind::TokenMissing,
35541 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35542 }
35543 .intern(db),
35544 )
35545 }
35546 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35547 match node.long(db).green.long(db).details {
35548 GreenNodeDetails::Token(_) => Self { node },
35549 GreenNodeDetails::Node { .. } => {
35550 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35551 }
35552 }
35553 }
35554 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35555 match node.long(db).green.long(db).details {
35556 GreenNodeDetails::Token(_) => Some(Self { node }),
35557 GreenNodeDetails::Node { .. } => None,
35558 }
35559 }
35560 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35561 self.node
35562 }
35563 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35564 TokenLTPtr(self.node.stable_ptr(db))
35565 }
35566}
35567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35568pub struct TerminalLT<'db> {
35569 node: SyntaxNode<'db>,
35570}
35571impl<'db> Terminal<'db> for TerminalLT<'db> {
35572 const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35573 type TokenType = TokenLT<'db>;
35574 fn new_green(
35575 db: &'db dyn Database,
35576 leading_trivia: TriviaGreen<'db>,
35577 token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35578 trailing_trivia: TriviaGreen<'db>,
35579 ) -> Self::Green {
35580 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35581 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35582 TerminalLTGreen(
35583 GreenNode {
35584 kind: SyntaxKind::TerminalLT,
35585 details: GreenNodeDetails::Node { children: children.into(), width },
35586 }
35587 .intern(db),
35588 )
35589 }
35590 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35591 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35592 else {
35593 unreachable!("Expected a node, not a token");
35594 };
35595 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35596 }
35597}
35598impl<'db> TerminalLT<'db> {
35599 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35600 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35601 }
35602 pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35603 TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35604 }
35605 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35606 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35607 }
35608}
35609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35610pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35611impl<'db> TerminalLTPtr<'db> {}
35612impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35613 type SyntaxNode = TerminalLT<'db>;
35614 fn untyped(self) -> SyntaxStablePtrId<'db> {
35615 self.0
35616 }
35617 fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35618 TerminalLT::from_syntax_node(db, self.0.lookup(db))
35619 }
35620}
35621impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35622 fn from(ptr: TerminalLTPtr<'db>) -> Self {
35623 ptr.untyped()
35624 }
35625}
35626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35627pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35628impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35629 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35630 type StablePtr = TerminalLTPtr<'db>;
35631 type Green = TerminalLTGreen<'db>;
35632 fn missing(db: &'db dyn Database) -> Self::Green {
35633 TerminalLTGreen(
35634 GreenNode {
35635 kind: SyntaxKind::TerminalLT,
35636 details: GreenNodeDetails::Node {
35637 children: [
35638 Trivia::missing(db).0,
35639 TokenLT::missing(db).0,
35640 Trivia::missing(db).0,
35641 ]
35642 .into(),
35643 width: TextWidth::default(),
35644 },
35645 }
35646 .intern(db),
35647 )
35648 }
35649 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35650 let kind = node.kind(db);
35651 assert_eq!(
35652 kind,
35653 SyntaxKind::TerminalLT,
35654 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35655 kind,
35656 SyntaxKind::TerminalLT
35657 );
35658 Self { node }
35659 }
35660 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35661 let kind = node.kind(db);
35662 if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35663 }
35664 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35665 self.node
35666 }
35667 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35668 TerminalLTPtr(self.node.stable_ptr(db))
35669 }
35670}
35671#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35672pub struct TokenMatchArrow<'db> {
35673 node: SyntaxNode<'db>,
35674}
35675impl<'db> Token<'db> for TokenMatchArrow<'db> {
35676 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35677 TokenMatchArrowGreen(
35678 GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35679 .intern(db),
35680 )
35681 }
35682 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35683 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35684 }
35685}
35686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35687pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35688impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35689 type SyntaxNode = TokenMatchArrow<'db>;
35690 fn untyped(self) -> SyntaxStablePtrId<'db> {
35691 self.0
35692 }
35693 fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35694 TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35695 }
35696}
35697impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35698 fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35699 ptr.untyped()
35700 }
35701}
35702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35703pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35704impl<'db> TokenMatchArrowGreen<'db> {
35705 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35706 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35707 }
35708}
35709impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35710 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35711 type StablePtr = TokenMatchArrowPtr<'db>;
35712 type Green = TokenMatchArrowGreen<'db>;
35713 fn missing(db: &'db dyn Database) -> Self::Green {
35714 TokenMatchArrowGreen(
35715 GreenNode {
35716 kind: SyntaxKind::TokenMissing,
35717 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35718 }
35719 .intern(db),
35720 )
35721 }
35722 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35723 match node.long(db).green.long(db).details {
35724 GreenNodeDetails::Token(_) => Self { node },
35725 GreenNodeDetails::Node { .. } => {
35726 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35727 }
35728 }
35729 }
35730 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35731 match node.long(db).green.long(db).details {
35732 GreenNodeDetails::Token(_) => Some(Self { node }),
35733 GreenNodeDetails::Node { .. } => None,
35734 }
35735 }
35736 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35737 self.node
35738 }
35739 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35740 TokenMatchArrowPtr(self.node.stable_ptr(db))
35741 }
35742}
35743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35744pub struct TerminalMatchArrow<'db> {
35745 node: SyntaxNode<'db>,
35746}
35747impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35748 const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35749 type TokenType = TokenMatchArrow<'db>;
35750 fn new_green(
35751 db: &'db dyn Database,
35752 leading_trivia: TriviaGreen<'db>,
35753 token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35754 trailing_trivia: TriviaGreen<'db>,
35755 ) -> Self::Green {
35756 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35757 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35758 TerminalMatchArrowGreen(
35759 GreenNode {
35760 kind: SyntaxKind::TerminalMatchArrow,
35761 details: GreenNodeDetails::Node { children: children.into(), width },
35762 }
35763 .intern(db),
35764 )
35765 }
35766 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35767 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35768 else {
35769 unreachable!("Expected a node, not a token");
35770 };
35771 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35772 }
35773}
35774impl<'db> TerminalMatchArrow<'db> {
35775 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35776 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35777 }
35778 pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35779 TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35780 }
35781 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35782 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35783 }
35784}
35785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35786pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35787impl<'db> TerminalMatchArrowPtr<'db> {}
35788impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35789 type SyntaxNode = TerminalMatchArrow<'db>;
35790 fn untyped(self) -> SyntaxStablePtrId<'db> {
35791 self.0
35792 }
35793 fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35794 TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35795 }
35796}
35797impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35798 fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35799 ptr.untyped()
35800 }
35801}
35802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35803pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35804impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35805 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35806 type StablePtr = TerminalMatchArrowPtr<'db>;
35807 type Green = TerminalMatchArrowGreen<'db>;
35808 fn missing(db: &'db dyn Database) -> Self::Green {
35809 TerminalMatchArrowGreen(
35810 GreenNode {
35811 kind: SyntaxKind::TerminalMatchArrow,
35812 details: GreenNodeDetails::Node {
35813 children: [
35814 Trivia::missing(db).0,
35815 TokenMatchArrow::missing(db).0,
35816 Trivia::missing(db).0,
35817 ]
35818 .into(),
35819 width: TextWidth::default(),
35820 },
35821 }
35822 .intern(db),
35823 )
35824 }
35825 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35826 let kind = node.kind(db);
35827 assert_eq!(
35828 kind,
35829 SyntaxKind::TerminalMatchArrow,
35830 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35831 kind,
35832 SyntaxKind::TerminalMatchArrow
35833 );
35834 Self { node }
35835 }
35836 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35837 let kind = node.kind(db);
35838 if kind == SyntaxKind::TerminalMatchArrow {
35839 Some(Self::from_syntax_node(db, node))
35840 } else {
35841 None
35842 }
35843 }
35844 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35845 self.node
35846 }
35847 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35848 TerminalMatchArrowPtr(self.node.stable_ptr(db))
35849 }
35850}
35851#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35852pub struct TokenMinus<'db> {
35853 node: SyntaxNode<'db>,
35854}
35855impl<'db> Token<'db> for TokenMinus<'db> {
35856 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35857 TokenMinusGreen(
35858 GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35859 .intern(db),
35860 )
35861 }
35862 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35863 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35864 }
35865}
35866#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35867pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35868impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35869 type SyntaxNode = TokenMinus<'db>;
35870 fn untyped(self) -> SyntaxStablePtrId<'db> {
35871 self.0
35872 }
35873 fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35874 TokenMinus::from_syntax_node(db, self.0.lookup(db))
35875 }
35876}
35877impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35878 fn from(ptr: TokenMinusPtr<'db>) -> Self {
35879 ptr.untyped()
35880 }
35881}
35882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35883pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35884impl<'db> TokenMinusGreen<'db> {
35885 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35886 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35887 }
35888}
35889impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35890 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35891 type StablePtr = TokenMinusPtr<'db>;
35892 type Green = TokenMinusGreen<'db>;
35893 fn missing(db: &'db dyn Database) -> Self::Green {
35894 TokenMinusGreen(
35895 GreenNode {
35896 kind: SyntaxKind::TokenMissing,
35897 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35898 }
35899 .intern(db),
35900 )
35901 }
35902 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35903 match node.long(db).green.long(db).details {
35904 GreenNodeDetails::Token(_) => Self { node },
35905 GreenNodeDetails::Node { .. } => {
35906 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35907 }
35908 }
35909 }
35910 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35911 match node.long(db).green.long(db).details {
35912 GreenNodeDetails::Token(_) => Some(Self { node }),
35913 GreenNodeDetails::Node { .. } => None,
35914 }
35915 }
35916 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35917 self.node
35918 }
35919 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35920 TokenMinusPtr(self.node.stable_ptr(db))
35921 }
35922}
35923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35924pub struct TerminalMinus<'db> {
35925 node: SyntaxNode<'db>,
35926}
35927impl<'db> Terminal<'db> for TerminalMinus<'db> {
35928 const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35929 type TokenType = TokenMinus<'db>;
35930 fn new_green(
35931 db: &'db dyn Database,
35932 leading_trivia: TriviaGreen<'db>,
35933 token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35934 trailing_trivia: TriviaGreen<'db>,
35935 ) -> Self::Green {
35936 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35937 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35938 TerminalMinusGreen(
35939 GreenNode {
35940 kind: SyntaxKind::TerminalMinus,
35941 details: GreenNodeDetails::Node { children: children.into(), width },
35942 }
35943 .intern(db),
35944 )
35945 }
35946 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35947 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35948 else {
35949 unreachable!("Expected a node, not a token");
35950 };
35951 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35952 }
35953}
35954impl<'db> TerminalMinus<'db> {
35955 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35956 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35957 }
35958 pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35959 TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35960 }
35961 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35962 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35963 }
35964}
35965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35966pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35967impl<'db> TerminalMinusPtr<'db> {}
35968impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35969 type SyntaxNode = TerminalMinus<'db>;
35970 fn untyped(self) -> SyntaxStablePtrId<'db> {
35971 self.0
35972 }
35973 fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35974 TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35975 }
35976}
35977impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35978 fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35979 ptr.untyped()
35980 }
35981}
35982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35983pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35984impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35985 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35986 type StablePtr = TerminalMinusPtr<'db>;
35987 type Green = TerminalMinusGreen<'db>;
35988 fn missing(db: &'db dyn Database) -> Self::Green {
35989 TerminalMinusGreen(
35990 GreenNode {
35991 kind: SyntaxKind::TerminalMinus,
35992 details: GreenNodeDetails::Node {
35993 children: [
35994 Trivia::missing(db).0,
35995 TokenMinus::missing(db).0,
35996 Trivia::missing(db).0,
35997 ]
35998 .into(),
35999 width: TextWidth::default(),
36000 },
36001 }
36002 .intern(db),
36003 )
36004 }
36005 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36006 let kind = node.kind(db);
36007 assert_eq!(
36008 kind,
36009 SyntaxKind::TerminalMinus,
36010 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36011 kind,
36012 SyntaxKind::TerminalMinus
36013 );
36014 Self { node }
36015 }
36016 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36017 let kind = node.kind(db);
36018 if kind == SyntaxKind::TerminalMinus {
36019 Some(Self::from_syntax_node(db, node))
36020 } else {
36021 None
36022 }
36023 }
36024 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36025 self.node
36026 }
36027 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36028 TerminalMinusPtr(self.node.stable_ptr(db))
36029 }
36030}
36031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36032pub struct TokenMinusEq<'db> {
36033 node: SyntaxNode<'db>,
36034}
36035impl<'db> Token<'db> for TokenMinusEq<'db> {
36036 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36037 TokenMinusEqGreen(
36038 GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
36039 .intern(db),
36040 )
36041 }
36042 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36043 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36044 }
36045}
36046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36047pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36048impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
36049 type SyntaxNode = TokenMinusEq<'db>;
36050 fn untyped(self) -> SyntaxStablePtrId<'db> {
36051 self.0
36052 }
36053 fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
36054 TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
36055 }
36056}
36057impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
36058 fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
36059 ptr.untyped()
36060 }
36061}
36062#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36063pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
36064impl<'db> TokenMinusEqGreen<'db> {
36065 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36066 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36067 }
36068}
36069impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
36070 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
36071 type StablePtr = TokenMinusEqPtr<'db>;
36072 type Green = TokenMinusEqGreen<'db>;
36073 fn missing(db: &'db dyn Database) -> Self::Green {
36074 TokenMinusEqGreen(
36075 GreenNode {
36076 kind: SyntaxKind::TokenMissing,
36077 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36078 }
36079 .intern(db),
36080 )
36081 }
36082 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36083 match node.long(db).green.long(db).details {
36084 GreenNodeDetails::Token(_) => Self { node },
36085 GreenNodeDetails::Node { .. } => {
36086 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
36087 }
36088 }
36089 }
36090 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36091 match node.long(db).green.long(db).details {
36092 GreenNodeDetails::Token(_) => Some(Self { node }),
36093 GreenNodeDetails::Node { .. } => None,
36094 }
36095 }
36096 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36097 self.node
36098 }
36099 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36100 TokenMinusEqPtr(self.node.stable_ptr(db))
36101 }
36102}
36103#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36104pub struct TerminalMinusEq<'db> {
36105 node: SyntaxNode<'db>,
36106}
36107impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
36108 const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
36109 type TokenType = TokenMinusEq<'db>;
36110 fn new_green(
36111 db: &'db dyn Database,
36112 leading_trivia: TriviaGreen<'db>,
36113 token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36114 trailing_trivia: TriviaGreen<'db>,
36115 ) -> Self::Green {
36116 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36117 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36118 TerminalMinusEqGreen(
36119 GreenNode {
36120 kind: SyntaxKind::TerminalMinusEq,
36121 details: GreenNodeDetails::Node { children: children.into(), width },
36122 }
36123 .intern(db),
36124 )
36125 }
36126 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36127 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36128 else {
36129 unreachable!("Expected a node, not a token");
36130 };
36131 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36132 }
36133}
36134impl<'db> TerminalMinusEq<'db> {
36135 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36136 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36137 }
36138 pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
36139 TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
36140 }
36141 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36142 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36143 }
36144}
36145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36146pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36147impl<'db> TerminalMinusEqPtr<'db> {}
36148impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
36149 type SyntaxNode = TerminalMinusEq<'db>;
36150 fn untyped(self) -> SyntaxStablePtrId<'db> {
36151 self.0
36152 }
36153 fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
36154 TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
36155 }
36156}
36157impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
36158 fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
36159 ptr.untyped()
36160 }
36161}
36162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36163pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
36164impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
36165 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
36166 type StablePtr = TerminalMinusEqPtr<'db>;
36167 type Green = TerminalMinusEqGreen<'db>;
36168 fn missing(db: &'db dyn Database) -> Self::Green {
36169 TerminalMinusEqGreen(
36170 GreenNode {
36171 kind: SyntaxKind::TerminalMinusEq,
36172 details: GreenNodeDetails::Node {
36173 children: [
36174 Trivia::missing(db).0,
36175 TokenMinusEq::missing(db).0,
36176 Trivia::missing(db).0,
36177 ]
36178 .into(),
36179 width: TextWidth::default(),
36180 },
36181 }
36182 .intern(db),
36183 )
36184 }
36185 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36186 let kind = node.kind(db);
36187 assert_eq!(
36188 kind,
36189 SyntaxKind::TerminalMinusEq,
36190 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36191 kind,
36192 SyntaxKind::TerminalMinusEq
36193 );
36194 Self { node }
36195 }
36196 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36197 let kind = node.kind(db);
36198 if kind == SyntaxKind::TerminalMinusEq {
36199 Some(Self::from_syntax_node(db, node))
36200 } else {
36201 None
36202 }
36203 }
36204 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36205 self.node
36206 }
36207 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36208 TerminalMinusEqPtr(self.node.stable_ptr(db))
36209 }
36210}
36211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36212pub struct TokenMod<'db> {
36213 node: SyntaxNode<'db>,
36214}
36215impl<'db> Token<'db> for TokenMod<'db> {
36216 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36217 TokenModGreen(
36218 GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
36219 .intern(db),
36220 )
36221 }
36222 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36223 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36224 }
36225}
36226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36227pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
36228impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
36229 type SyntaxNode = TokenMod<'db>;
36230 fn untyped(self) -> SyntaxStablePtrId<'db> {
36231 self.0
36232 }
36233 fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
36234 TokenMod::from_syntax_node(db, self.0.lookup(db))
36235 }
36236}
36237impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
36238 fn from(ptr: TokenModPtr<'db>) -> Self {
36239 ptr.untyped()
36240 }
36241}
36242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36243pub struct TokenModGreen<'db>(pub GreenId<'db>);
36244impl<'db> TokenModGreen<'db> {
36245 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36246 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36247 }
36248}
36249impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
36250 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
36251 type StablePtr = TokenModPtr<'db>;
36252 type Green = TokenModGreen<'db>;
36253 fn missing(db: &'db dyn Database) -> Self::Green {
36254 TokenModGreen(
36255 GreenNode {
36256 kind: SyntaxKind::TokenMissing,
36257 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36258 }
36259 .intern(db),
36260 )
36261 }
36262 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36263 match node.long(db).green.long(db).details {
36264 GreenNodeDetails::Token(_) => Self { node },
36265 GreenNodeDetails::Node { .. } => {
36266 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
36267 }
36268 }
36269 }
36270 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36271 match node.long(db).green.long(db).details {
36272 GreenNodeDetails::Token(_) => Some(Self { node }),
36273 GreenNodeDetails::Node { .. } => None,
36274 }
36275 }
36276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36277 self.node
36278 }
36279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36280 TokenModPtr(self.node.stable_ptr(db))
36281 }
36282}
36283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36284pub struct TerminalMod<'db> {
36285 node: SyntaxNode<'db>,
36286}
36287impl<'db> Terminal<'db> for TerminalMod<'db> {
36288 const KIND: SyntaxKind = SyntaxKind::TerminalMod;
36289 type TokenType = TokenMod<'db>;
36290 fn new_green(
36291 db: &'db dyn Database,
36292 leading_trivia: TriviaGreen<'db>,
36293 token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36294 trailing_trivia: TriviaGreen<'db>,
36295 ) -> Self::Green {
36296 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36297 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36298 TerminalModGreen(
36299 GreenNode {
36300 kind: SyntaxKind::TerminalMod,
36301 details: GreenNodeDetails::Node { children: children.into(), width },
36302 }
36303 .intern(db),
36304 )
36305 }
36306 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36307 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36308 else {
36309 unreachable!("Expected a node, not a token");
36310 };
36311 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36312 }
36313}
36314impl<'db> TerminalMod<'db> {
36315 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36316 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36317 }
36318 pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
36319 TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
36320 }
36321 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36322 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36323 }
36324}
36325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36326pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
36327impl<'db> TerminalModPtr<'db> {}
36328impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
36329 type SyntaxNode = TerminalMod<'db>;
36330 fn untyped(self) -> SyntaxStablePtrId<'db> {
36331 self.0
36332 }
36333 fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
36334 TerminalMod::from_syntax_node(db, self.0.lookup(db))
36335 }
36336}
36337impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
36338 fn from(ptr: TerminalModPtr<'db>) -> Self {
36339 ptr.untyped()
36340 }
36341}
36342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36343pub struct TerminalModGreen<'db>(pub GreenId<'db>);
36344impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
36345 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
36346 type StablePtr = TerminalModPtr<'db>;
36347 type Green = TerminalModGreen<'db>;
36348 fn missing(db: &'db dyn Database) -> Self::Green {
36349 TerminalModGreen(
36350 GreenNode {
36351 kind: SyntaxKind::TerminalMod,
36352 details: GreenNodeDetails::Node {
36353 children: [
36354 Trivia::missing(db).0,
36355 TokenMod::missing(db).0,
36356 Trivia::missing(db).0,
36357 ]
36358 .into(),
36359 width: TextWidth::default(),
36360 },
36361 }
36362 .intern(db),
36363 )
36364 }
36365 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36366 let kind = node.kind(db);
36367 assert_eq!(
36368 kind,
36369 SyntaxKind::TerminalMod,
36370 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36371 kind,
36372 SyntaxKind::TerminalMod
36373 );
36374 Self { node }
36375 }
36376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36377 let kind = node.kind(db);
36378 if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
36379 }
36380 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36381 self.node
36382 }
36383 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36384 TerminalModPtr(self.node.stable_ptr(db))
36385 }
36386}
36387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36388pub struct TokenModEq<'db> {
36389 node: SyntaxNode<'db>,
36390}
36391impl<'db> Token<'db> for TokenModEq<'db> {
36392 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36393 TokenModEqGreen(
36394 GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
36395 .intern(db),
36396 )
36397 }
36398 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36399 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36400 }
36401}
36402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36403pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36404impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
36405 type SyntaxNode = TokenModEq<'db>;
36406 fn untyped(self) -> SyntaxStablePtrId<'db> {
36407 self.0
36408 }
36409 fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36410 TokenModEq::from_syntax_node(db, self.0.lookup(db))
36411 }
36412}
36413impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36414 fn from(ptr: TokenModEqPtr<'db>) -> Self {
36415 ptr.untyped()
36416 }
36417}
36418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36419pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
36420impl<'db> TokenModEqGreen<'db> {
36421 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36422 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36423 }
36424}
36425impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
36426 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
36427 type StablePtr = TokenModEqPtr<'db>;
36428 type Green = TokenModEqGreen<'db>;
36429 fn missing(db: &'db dyn Database) -> Self::Green {
36430 TokenModEqGreen(
36431 GreenNode {
36432 kind: SyntaxKind::TokenMissing,
36433 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36434 }
36435 .intern(db),
36436 )
36437 }
36438 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36439 match node.long(db).green.long(db).details {
36440 GreenNodeDetails::Token(_) => Self { node },
36441 GreenNodeDetails::Node { .. } => {
36442 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
36443 }
36444 }
36445 }
36446 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36447 match node.long(db).green.long(db).details {
36448 GreenNodeDetails::Token(_) => Some(Self { node }),
36449 GreenNodeDetails::Node { .. } => None,
36450 }
36451 }
36452 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36453 self.node
36454 }
36455 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36456 TokenModEqPtr(self.node.stable_ptr(db))
36457 }
36458}
36459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36460pub struct TerminalModEq<'db> {
36461 node: SyntaxNode<'db>,
36462}
36463impl<'db> Terminal<'db> for TerminalModEq<'db> {
36464 const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36465 type TokenType = TokenModEq<'db>;
36466 fn new_green(
36467 db: &'db dyn Database,
36468 leading_trivia: TriviaGreen<'db>,
36469 token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36470 trailing_trivia: TriviaGreen<'db>,
36471 ) -> Self::Green {
36472 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36473 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36474 TerminalModEqGreen(
36475 GreenNode {
36476 kind: SyntaxKind::TerminalModEq,
36477 details: GreenNodeDetails::Node { children: children.into(), width },
36478 }
36479 .intern(db),
36480 )
36481 }
36482 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36483 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36484 else {
36485 unreachable!("Expected a node, not a token");
36486 };
36487 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36488 }
36489}
36490impl<'db> TerminalModEq<'db> {
36491 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36492 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36493 }
36494 pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36495 TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36496 }
36497 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36498 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36499 }
36500}
36501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36502pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36503impl<'db> TerminalModEqPtr<'db> {}
36504impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36505 type SyntaxNode = TerminalModEq<'db>;
36506 fn untyped(self) -> SyntaxStablePtrId<'db> {
36507 self.0
36508 }
36509 fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36510 TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36511 }
36512}
36513impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36514 fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36515 ptr.untyped()
36516 }
36517}
36518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36519pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36520impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36521 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36522 type StablePtr = TerminalModEqPtr<'db>;
36523 type Green = TerminalModEqGreen<'db>;
36524 fn missing(db: &'db dyn Database) -> Self::Green {
36525 TerminalModEqGreen(
36526 GreenNode {
36527 kind: SyntaxKind::TerminalModEq,
36528 details: GreenNodeDetails::Node {
36529 children: [
36530 Trivia::missing(db).0,
36531 TokenModEq::missing(db).0,
36532 Trivia::missing(db).0,
36533 ]
36534 .into(),
36535 width: TextWidth::default(),
36536 },
36537 }
36538 .intern(db),
36539 )
36540 }
36541 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36542 let kind = node.kind(db);
36543 assert_eq!(
36544 kind,
36545 SyntaxKind::TerminalModEq,
36546 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36547 kind,
36548 SyntaxKind::TerminalModEq
36549 );
36550 Self { node }
36551 }
36552 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36553 let kind = node.kind(db);
36554 if kind == SyntaxKind::TerminalModEq {
36555 Some(Self::from_syntax_node(db, node))
36556 } else {
36557 None
36558 }
36559 }
36560 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36561 self.node
36562 }
36563 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36564 TerminalModEqPtr(self.node.stable_ptr(db))
36565 }
36566}
36567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36568pub struct TokenMul<'db> {
36569 node: SyntaxNode<'db>,
36570}
36571impl<'db> Token<'db> for TokenMul<'db> {
36572 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36573 TokenMulGreen(
36574 GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36575 .intern(db),
36576 )
36577 }
36578 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36579 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36580 }
36581}
36582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36583pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36584impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36585 type SyntaxNode = TokenMul<'db>;
36586 fn untyped(self) -> SyntaxStablePtrId<'db> {
36587 self.0
36588 }
36589 fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36590 TokenMul::from_syntax_node(db, self.0.lookup(db))
36591 }
36592}
36593impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36594 fn from(ptr: TokenMulPtr<'db>) -> Self {
36595 ptr.untyped()
36596 }
36597}
36598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36599pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36600impl<'db> TokenMulGreen<'db> {
36601 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36602 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36603 }
36604}
36605impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36606 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36607 type StablePtr = TokenMulPtr<'db>;
36608 type Green = TokenMulGreen<'db>;
36609 fn missing(db: &'db dyn Database) -> Self::Green {
36610 TokenMulGreen(
36611 GreenNode {
36612 kind: SyntaxKind::TokenMissing,
36613 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36614 }
36615 .intern(db),
36616 )
36617 }
36618 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36619 match node.long(db).green.long(db).details {
36620 GreenNodeDetails::Token(_) => Self { node },
36621 GreenNodeDetails::Node { .. } => {
36622 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36623 }
36624 }
36625 }
36626 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36627 match node.long(db).green.long(db).details {
36628 GreenNodeDetails::Token(_) => Some(Self { node }),
36629 GreenNodeDetails::Node { .. } => None,
36630 }
36631 }
36632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36633 self.node
36634 }
36635 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36636 TokenMulPtr(self.node.stable_ptr(db))
36637 }
36638}
36639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36640pub struct TerminalMul<'db> {
36641 node: SyntaxNode<'db>,
36642}
36643impl<'db> Terminal<'db> for TerminalMul<'db> {
36644 const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36645 type TokenType = TokenMul<'db>;
36646 fn new_green(
36647 db: &'db dyn Database,
36648 leading_trivia: TriviaGreen<'db>,
36649 token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36650 trailing_trivia: TriviaGreen<'db>,
36651 ) -> Self::Green {
36652 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36653 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36654 TerminalMulGreen(
36655 GreenNode {
36656 kind: SyntaxKind::TerminalMul,
36657 details: GreenNodeDetails::Node { children: children.into(), width },
36658 }
36659 .intern(db),
36660 )
36661 }
36662 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36663 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36664 else {
36665 unreachable!("Expected a node, not a token");
36666 };
36667 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36668 }
36669}
36670impl<'db> TerminalMul<'db> {
36671 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36672 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36673 }
36674 pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36675 TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36676 }
36677 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36678 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36679 }
36680}
36681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36682pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36683impl<'db> TerminalMulPtr<'db> {}
36684impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36685 type SyntaxNode = TerminalMul<'db>;
36686 fn untyped(self) -> SyntaxStablePtrId<'db> {
36687 self.0
36688 }
36689 fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36690 TerminalMul::from_syntax_node(db, self.0.lookup(db))
36691 }
36692}
36693impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36694 fn from(ptr: TerminalMulPtr<'db>) -> Self {
36695 ptr.untyped()
36696 }
36697}
36698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36699pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36700impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36701 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36702 type StablePtr = TerminalMulPtr<'db>;
36703 type Green = TerminalMulGreen<'db>;
36704 fn missing(db: &'db dyn Database) -> Self::Green {
36705 TerminalMulGreen(
36706 GreenNode {
36707 kind: SyntaxKind::TerminalMul,
36708 details: GreenNodeDetails::Node {
36709 children: [
36710 Trivia::missing(db).0,
36711 TokenMul::missing(db).0,
36712 Trivia::missing(db).0,
36713 ]
36714 .into(),
36715 width: TextWidth::default(),
36716 },
36717 }
36718 .intern(db),
36719 )
36720 }
36721 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36722 let kind = node.kind(db);
36723 assert_eq!(
36724 kind,
36725 SyntaxKind::TerminalMul,
36726 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36727 kind,
36728 SyntaxKind::TerminalMul
36729 );
36730 Self { node }
36731 }
36732 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36733 let kind = node.kind(db);
36734 if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36735 }
36736 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36737 self.node
36738 }
36739 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36740 TerminalMulPtr(self.node.stable_ptr(db))
36741 }
36742}
36743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36744pub struct TokenMulEq<'db> {
36745 node: SyntaxNode<'db>,
36746}
36747impl<'db> Token<'db> for TokenMulEq<'db> {
36748 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36749 TokenMulEqGreen(
36750 GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36751 .intern(db),
36752 )
36753 }
36754 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36755 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36756 }
36757}
36758#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36759pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36760impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36761 type SyntaxNode = TokenMulEq<'db>;
36762 fn untyped(self) -> SyntaxStablePtrId<'db> {
36763 self.0
36764 }
36765 fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36766 TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36767 }
36768}
36769impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36770 fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36771 ptr.untyped()
36772 }
36773}
36774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36775pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36776impl<'db> TokenMulEqGreen<'db> {
36777 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36778 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36779 }
36780}
36781impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36782 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36783 type StablePtr = TokenMulEqPtr<'db>;
36784 type Green = TokenMulEqGreen<'db>;
36785 fn missing(db: &'db dyn Database) -> Self::Green {
36786 TokenMulEqGreen(
36787 GreenNode {
36788 kind: SyntaxKind::TokenMissing,
36789 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36790 }
36791 .intern(db),
36792 )
36793 }
36794 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36795 match node.long(db).green.long(db).details {
36796 GreenNodeDetails::Token(_) => Self { node },
36797 GreenNodeDetails::Node { .. } => {
36798 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36799 }
36800 }
36801 }
36802 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36803 match node.long(db).green.long(db).details {
36804 GreenNodeDetails::Token(_) => Some(Self { node }),
36805 GreenNodeDetails::Node { .. } => None,
36806 }
36807 }
36808 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36809 self.node
36810 }
36811 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36812 TokenMulEqPtr(self.node.stable_ptr(db))
36813 }
36814}
36815#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36816pub struct TerminalMulEq<'db> {
36817 node: SyntaxNode<'db>,
36818}
36819impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36820 const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36821 type TokenType = TokenMulEq<'db>;
36822 fn new_green(
36823 db: &'db dyn Database,
36824 leading_trivia: TriviaGreen<'db>,
36825 token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36826 trailing_trivia: TriviaGreen<'db>,
36827 ) -> Self::Green {
36828 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36829 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36830 TerminalMulEqGreen(
36831 GreenNode {
36832 kind: SyntaxKind::TerminalMulEq,
36833 details: GreenNodeDetails::Node { children: children.into(), width },
36834 }
36835 .intern(db),
36836 )
36837 }
36838 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36839 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36840 else {
36841 unreachable!("Expected a node, not a token");
36842 };
36843 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36844 }
36845}
36846impl<'db> TerminalMulEq<'db> {
36847 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36848 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36849 }
36850 pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36851 TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36852 }
36853 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36854 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36855 }
36856}
36857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36858pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36859impl<'db> TerminalMulEqPtr<'db> {}
36860impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36861 type SyntaxNode = TerminalMulEq<'db>;
36862 fn untyped(self) -> SyntaxStablePtrId<'db> {
36863 self.0
36864 }
36865 fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36866 TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36867 }
36868}
36869impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36870 fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36871 ptr.untyped()
36872 }
36873}
36874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36875pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36876impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36877 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36878 type StablePtr = TerminalMulEqPtr<'db>;
36879 type Green = TerminalMulEqGreen<'db>;
36880 fn missing(db: &'db dyn Database) -> Self::Green {
36881 TerminalMulEqGreen(
36882 GreenNode {
36883 kind: SyntaxKind::TerminalMulEq,
36884 details: GreenNodeDetails::Node {
36885 children: [
36886 Trivia::missing(db).0,
36887 TokenMulEq::missing(db).0,
36888 Trivia::missing(db).0,
36889 ]
36890 .into(),
36891 width: TextWidth::default(),
36892 },
36893 }
36894 .intern(db),
36895 )
36896 }
36897 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36898 let kind = node.kind(db);
36899 assert_eq!(
36900 kind,
36901 SyntaxKind::TerminalMulEq,
36902 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36903 kind,
36904 SyntaxKind::TerminalMulEq
36905 );
36906 Self { node }
36907 }
36908 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36909 let kind = node.kind(db);
36910 if kind == SyntaxKind::TerminalMulEq {
36911 Some(Self::from_syntax_node(db, node))
36912 } else {
36913 None
36914 }
36915 }
36916 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36917 self.node
36918 }
36919 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36920 TerminalMulEqPtr(self.node.stable_ptr(db))
36921 }
36922}
36923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36924pub struct TokenNeq<'db> {
36925 node: SyntaxNode<'db>,
36926}
36927impl<'db> Token<'db> for TokenNeq<'db> {
36928 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36929 TokenNeqGreen(
36930 GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36931 .intern(db),
36932 )
36933 }
36934 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36935 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36936 }
36937}
36938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36939pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36940impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36941 type SyntaxNode = TokenNeq<'db>;
36942 fn untyped(self) -> SyntaxStablePtrId<'db> {
36943 self.0
36944 }
36945 fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36946 TokenNeq::from_syntax_node(db, self.0.lookup(db))
36947 }
36948}
36949impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36950 fn from(ptr: TokenNeqPtr<'db>) -> Self {
36951 ptr.untyped()
36952 }
36953}
36954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36955pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36956impl<'db> TokenNeqGreen<'db> {
36957 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36958 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36959 }
36960}
36961impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36962 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36963 type StablePtr = TokenNeqPtr<'db>;
36964 type Green = TokenNeqGreen<'db>;
36965 fn missing(db: &'db dyn Database) -> Self::Green {
36966 TokenNeqGreen(
36967 GreenNode {
36968 kind: SyntaxKind::TokenMissing,
36969 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36970 }
36971 .intern(db),
36972 )
36973 }
36974 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36975 match node.long(db).green.long(db).details {
36976 GreenNodeDetails::Token(_) => Self { node },
36977 GreenNodeDetails::Node { .. } => {
36978 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36979 }
36980 }
36981 }
36982 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36983 match node.long(db).green.long(db).details {
36984 GreenNodeDetails::Token(_) => Some(Self { node }),
36985 GreenNodeDetails::Node { .. } => None,
36986 }
36987 }
36988 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36989 self.node
36990 }
36991 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36992 TokenNeqPtr(self.node.stable_ptr(db))
36993 }
36994}
36995#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36996pub struct TerminalNeq<'db> {
36997 node: SyntaxNode<'db>,
36998}
36999impl<'db> Terminal<'db> for TerminalNeq<'db> {
37000 const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
37001 type TokenType = TokenNeq<'db>;
37002 fn new_green(
37003 db: &'db dyn Database,
37004 leading_trivia: TriviaGreen<'db>,
37005 token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37006 trailing_trivia: TriviaGreen<'db>,
37007 ) -> Self::Green {
37008 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37009 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37010 TerminalNeqGreen(
37011 GreenNode {
37012 kind: SyntaxKind::TerminalNeq,
37013 details: GreenNodeDetails::Node { children: children.into(), width },
37014 }
37015 .intern(db),
37016 )
37017 }
37018 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37019 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37020 else {
37021 unreachable!("Expected a node, not a token");
37022 };
37023 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37024 }
37025}
37026impl<'db> TerminalNeq<'db> {
37027 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37028 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37029 }
37030 pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
37031 TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
37032 }
37033 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37034 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37035 }
37036}
37037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37038pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
37039impl<'db> TerminalNeqPtr<'db> {}
37040impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
37041 type SyntaxNode = TerminalNeq<'db>;
37042 fn untyped(self) -> SyntaxStablePtrId<'db> {
37043 self.0
37044 }
37045 fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
37046 TerminalNeq::from_syntax_node(db, self.0.lookup(db))
37047 }
37048}
37049impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
37050 fn from(ptr: TerminalNeqPtr<'db>) -> Self {
37051 ptr.untyped()
37052 }
37053}
37054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37055pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
37056impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
37057 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
37058 type StablePtr = TerminalNeqPtr<'db>;
37059 type Green = TerminalNeqGreen<'db>;
37060 fn missing(db: &'db dyn Database) -> Self::Green {
37061 TerminalNeqGreen(
37062 GreenNode {
37063 kind: SyntaxKind::TerminalNeq,
37064 details: GreenNodeDetails::Node {
37065 children: [
37066 Trivia::missing(db).0,
37067 TokenNeq::missing(db).0,
37068 Trivia::missing(db).0,
37069 ]
37070 .into(),
37071 width: TextWidth::default(),
37072 },
37073 }
37074 .intern(db),
37075 )
37076 }
37077 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37078 let kind = node.kind(db);
37079 assert_eq!(
37080 kind,
37081 SyntaxKind::TerminalNeq,
37082 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37083 kind,
37084 SyntaxKind::TerminalNeq
37085 );
37086 Self { node }
37087 }
37088 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37089 let kind = node.kind(db);
37090 if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
37091 }
37092 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37093 self.node
37094 }
37095 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37096 TerminalNeqPtr(self.node.stable_ptr(db))
37097 }
37098}
37099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37100pub struct TokenNot<'db> {
37101 node: SyntaxNode<'db>,
37102}
37103impl<'db> Token<'db> for TokenNot<'db> {
37104 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37105 TokenNotGreen(
37106 GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
37107 .intern(db),
37108 )
37109 }
37110 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37111 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37112 }
37113}
37114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37115pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37116impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
37117 type SyntaxNode = TokenNot<'db>;
37118 fn untyped(self) -> SyntaxStablePtrId<'db> {
37119 self.0
37120 }
37121 fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
37122 TokenNot::from_syntax_node(db, self.0.lookup(db))
37123 }
37124}
37125impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
37126 fn from(ptr: TokenNotPtr<'db>) -> Self {
37127 ptr.untyped()
37128 }
37129}
37130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37131pub struct TokenNotGreen<'db>(pub GreenId<'db>);
37132impl<'db> TokenNotGreen<'db> {
37133 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37134 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37135 }
37136}
37137impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
37138 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
37139 type StablePtr = TokenNotPtr<'db>;
37140 type Green = TokenNotGreen<'db>;
37141 fn missing(db: &'db dyn Database) -> Self::Green {
37142 TokenNotGreen(
37143 GreenNode {
37144 kind: SyntaxKind::TokenMissing,
37145 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37146 }
37147 .intern(db),
37148 )
37149 }
37150 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37151 match node.long(db).green.long(db).details {
37152 GreenNodeDetails::Token(_) => Self { node },
37153 GreenNodeDetails::Node { .. } => {
37154 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
37155 }
37156 }
37157 }
37158 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37159 match node.long(db).green.long(db).details {
37160 GreenNodeDetails::Token(_) => Some(Self { node }),
37161 GreenNodeDetails::Node { .. } => None,
37162 }
37163 }
37164 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37165 self.node
37166 }
37167 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37168 TokenNotPtr(self.node.stable_ptr(db))
37169 }
37170}
37171#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37172pub struct TerminalNot<'db> {
37173 node: SyntaxNode<'db>,
37174}
37175impl<'db> Terminal<'db> for TerminalNot<'db> {
37176 const KIND: SyntaxKind = SyntaxKind::TerminalNot;
37177 type TokenType = TokenNot<'db>;
37178 fn new_green(
37179 db: &'db dyn Database,
37180 leading_trivia: TriviaGreen<'db>,
37181 token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37182 trailing_trivia: TriviaGreen<'db>,
37183 ) -> Self::Green {
37184 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37185 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37186 TerminalNotGreen(
37187 GreenNode {
37188 kind: SyntaxKind::TerminalNot,
37189 details: GreenNodeDetails::Node { children: children.into(), width },
37190 }
37191 .intern(db),
37192 )
37193 }
37194 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37195 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37196 else {
37197 unreachable!("Expected a node, not a token");
37198 };
37199 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37200 }
37201}
37202impl<'db> TerminalNot<'db> {
37203 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37204 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37205 }
37206 pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
37207 TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
37208 }
37209 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37210 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37211 }
37212}
37213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37214pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37215impl<'db> TerminalNotPtr<'db> {}
37216impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
37217 type SyntaxNode = TerminalNot<'db>;
37218 fn untyped(self) -> SyntaxStablePtrId<'db> {
37219 self.0
37220 }
37221 fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
37222 TerminalNot::from_syntax_node(db, self.0.lookup(db))
37223 }
37224}
37225impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
37226 fn from(ptr: TerminalNotPtr<'db>) -> Self {
37227 ptr.untyped()
37228 }
37229}
37230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37231pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
37232impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
37233 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
37234 type StablePtr = TerminalNotPtr<'db>;
37235 type Green = TerminalNotGreen<'db>;
37236 fn missing(db: &'db dyn Database) -> Self::Green {
37237 TerminalNotGreen(
37238 GreenNode {
37239 kind: SyntaxKind::TerminalNot,
37240 details: GreenNodeDetails::Node {
37241 children: [
37242 Trivia::missing(db).0,
37243 TokenNot::missing(db).0,
37244 Trivia::missing(db).0,
37245 ]
37246 .into(),
37247 width: TextWidth::default(),
37248 },
37249 }
37250 .intern(db),
37251 )
37252 }
37253 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37254 let kind = node.kind(db);
37255 assert_eq!(
37256 kind,
37257 SyntaxKind::TerminalNot,
37258 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37259 kind,
37260 SyntaxKind::TerminalNot
37261 );
37262 Self { node }
37263 }
37264 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37265 let kind = node.kind(db);
37266 if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
37267 }
37268 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37269 self.node
37270 }
37271 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37272 TerminalNotPtr(self.node.stable_ptr(db))
37273 }
37274}
37275#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37276pub struct TokenBitNot<'db> {
37277 node: SyntaxNode<'db>,
37278}
37279impl<'db> Token<'db> for TokenBitNot<'db> {
37280 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37281 TokenBitNotGreen(
37282 GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
37283 .intern(db),
37284 )
37285 }
37286 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37287 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37288 }
37289}
37290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37291pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37292impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
37293 type SyntaxNode = TokenBitNot<'db>;
37294 fn untyped(self) -> SyntaxStablePtrId<'db> {
37295 self.0
37296 }
37297 fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37298 TokenBitNot::from_syntax_node(db, self.0.lookup(db))
37299 }
37300}
37301impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37302 fn from(ptr: TokenBitNotPtr<'db>) -> Self {
37303 ptr.untyped()
37304 }
37305}
37306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37307pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
37308impl<'db> TokenBitNotGreen<'db> {
37309 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37310 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37311 }
37312}
37313impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
37314 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
37315 type StablePtr = TokenBitNotPtr<'db>;
37316 type Green = TokenBitNotGreen<'db>;
37317 fn missing(db: &'db dyn Database) -> Self::Green {
37318 TokenBitNotGreen(
37319 GreenNode {
37320 kind: SyntaxKind::TokenMissing,
37321 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37322 }
37323 .intern(db),
37324 )
37325 }
37326 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37327 match node.long(db).green.long(db).details {
37328 GreenNodeDetails::Token(_) => Self { node },
37329 GreenNodeDetails::Node { .. } => {
37330 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
37331 }
37332 }
37333 }
37334 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37335 match node.long(db).green.long(db).details {
37336 GreenNodeDetails::Token(_) => Some(Self { node }),
37337 GreenNodeDetails::Node { .. } => None,
37338 }
37339 }
37340 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37341 self.node
37342 }
37343 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37344 TokenBitNotPtr(self.node.stable_ptr(db))
37345 }
37346}
37347#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37348pub struct TerminalBitNot<'db> {
37349 node: SyntaxNode<'db>,
37350}
37351impl<'db> Terminal<'db> for TerminalBitNot<'db> {
37352 const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
37353 type TokenType = TokenBitNot<'db>;
37354 fn new_green(
37355 db: &'db dyn Database,
37356 leading_trivia: TriviaGreen<'db>,
37357 token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37358 trailing_trivia: TriviaGreen<'db>,
37359 ) -> Self::Green {
37360 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37361 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37362 TerminalBitNotGreen(
37363 GreenNode {
37364 kind: SyntaxKind::TerminalBitNot,
37365 details: GreenNodeDetails::Node { children: children.into(), width },
37366 }
37367 .intern(db),
37368 )
37369 }
37370 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37371 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37372 else {
37373 unreachable!("Expected a node, not a token");
37374 };
37375 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37376 }
37377}
37378impl<'db> TerminalBitNot<'db> {
37379 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37380 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37381 }
37382 pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37383 TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
37384 }
37385 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37386 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37387 }
37388}
37389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37390pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37391impl<'db> TerminalBitNotPtr<'db> {}
37392impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
37393 type SyntaxNode = TerminalBitNot<'db>;
37394 fn untyped(self) -> SyntaxStablePtrId<'db> {
37395 self.0
37396 }
37397 fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
37398 TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
37399 }
37400}
37401impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37402 fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
37403 ptr.untyped()
37404 }
37405}
37406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37407pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
37408impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
37409 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
37410 type StablePtr = TerminalBitNotPtr<'db>;
37411 type Green = TerminalBitNotGreen<'db>;
37412 fn missing(db: &'db dyn Database) -> Self::Green {
37413 TerminalBitNotGreen(
37414 GreenNode {
37415 kind: SyntaxKind::TerminalBitNot,
37416 details: GreenNodeDetails::Node {
37417 children: [
37418 Trivia::missing(db).0,
37419 TokenBitNot::missing(db).0,
37420 Trivia::missing(db).0,
37421 ]
37422 .into(),
37423 width: TextWidth::default(),
37424 },
37425 }
37426 .intern(db),
37427 )
37428 }
37429 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37430 let kind = node.kind(db);
37431 assert_eq!(
37432 kind,
37433 SyntaxKind::TerminalBitNot,
37434 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37435 kind,
37436 SyntaxKind::TerminalBitNot
37437 );
37438 Self { node }
37439 }
37440 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37441 let kind = node.kind(db);
37442 if kind == SyntaxKind::TerminalBitNot {
37443 Some(Self::from_syntax_node(db, node))
37444 } else {
37445 None
37446 }
37447 }
37448 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37449 self.node
37450 }
37451 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37452 TerminalBitNotPtr(self.node.stable_ptr(db))
37453 }
37454}
37455#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37456pub struct TokenOr<'db> {
37457 node: SyntaxNode<'db>,
37458}
37459impl<'db> Token<'db> for TokenOr<'db> {
37460 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37461 TokenOrGreen(
37462 GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37463 .intern(db),
37464 )
37465 }
37466 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37467 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37468 }
37469}
37470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37471pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37472impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37473 type SyntaxNode = TokenOr<'db>;
37474 fn untyped(self) -> SyntaxStablePtrId<'db> {
37475 self.0
37476 }
37477 fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37478 TokenOr::from_syntax_node(db, self.0.lookup(db))
37479 }
37480}
37481impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37482 fn from(ptr: TokenOrPtr<'db>) -> Self {
37483 ptr.untyped()
37484 }
37485}
37486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37487pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37488impl<'db> TokenOrGreen<'db> {
37489 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37490 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37491 }
37492}
37493impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37494 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37495 type StablePtr = TokenOrPtr<'db>;
37496 type Green = TokenOrGreen<'db>;
37497 fn missing(db: &'db dyn Database) -> Self::Green {
37498 TokenOrGreen(
37499 GreenNode {
37500 kind: SyntaxKind::TokenMissing,
37501 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37502 }
37503 .intern(db),
37504 )
37505 }
37506 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37507 match node.long(db).green.long(db).details {
37508 GreenNodeDetails::Token(_) => Self { node },
37509 GreenNodeDetails::Node { .. } => {
37510 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37511 }
37512 }
37513 }
37514 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37515 match node.long(db).green.long(db).details {
37516 GreenNodeDetails::Token(_) => Some(Self { node }),
37517 GreenNodeDetails::Node { .. } => None,
37518 }
37519 }
37520 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37521 self.node
37522 }
37523 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37524 TokenOrPtr(self.node.stable_ptr(db))
37525 }
37526}
37527#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37528pub struct TerminalOr<'db> {
37529 node: SyntaxNode<'db>,
37530}
37531impl<'db> Terminal<'db> for TerminalOr<'db> {
37532 const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37533 type TokenType = TokenOr<'db>;
37534 fn new_green(
37535 db: &'db dyn Database,
37536 leading_trivia: TriviaGreen<'db>,
37537 token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37538 trailing_trivia: TriviaGreen<'db>,
37539 ) -> Self::Green {
37540 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37541 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37542 TerminalOrGreen(
37543 GreenNode {
37544 kind: SyntaxKind::TerminalOr,
37545 details: GreenNodeDetails::Node { children: children.into(), width },
37546 }
37547 .intern(db),
37548 )
37549 }
37550 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37551 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37552 else {
37553 unreachable!("Expected a node, not a token");
37554 };
37555 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37556 }
37557}
37558impl<'db> TerminalOr<'db> {
37559 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37560 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37561 }
37562 pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37563 TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37564 }
37565 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37566 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37567 }
37568}
37569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37570pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37571impl<'db> TerminalOrPtr<'db> {}
37572impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37573 type SyntaxNode = TerminalOr<'db>;
37574 fn untyped(self) -> SyntaxStablePtrId<'db> {
37575 self.0
37576 }
37577 fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37578 TerminalOr::from_syntax_node(db, self.0.lookup(db))
37579 }
37580}
37581impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37582 fn from(ptr: TerminalOrPtr<'db>) -> Self {
37583 ptr.untyped()
37584 }
37585}
37586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37587pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37588impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37589 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37590 type StablePtr = TerminalOrPtr<'db>;
37591 type Green = TerminalOrGreen<'db>;
37592 fn missing(db: &'db dyn Database) -> Self::Green {
37593 TerminalOrGreen(
37594 GreenNode {
37595 kind: SyntaxKind::TerminalOr,
37596 details: GreenNodeDetails::Node {
37597 children: [
37598 Trivia::missing(db).0,
37599 TokenOr::missing(db).0,
37600 Trivia::missing(db).0,
37601 ]
37602 .into(),
37603 width: TextWidth::default(),
37604 },
37605 }
37606 .intern(db),
37607 )
37608 }
37609 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37610 let kind = node.kind(db);
37611 assert_eq!(
37612 kind,
37613 SyntaxKind::TerminalOr,
37614 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37615 kind,
37616 SyntaxKind::TerminalOr
37617 );
37618 Self { node }
37619 }
37620 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37621 let kind = node.kind(db);
37622 if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37623 }
37624 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37625 self.node
37626 }
37627 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37628 TerminalOrPtr(self.node.stable_ptr(db))
37629 }
37630}
37631#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37632pub struct TokenOrOr<'db> {
37633 node: SyntaxNode<'db>,
37634}
37635impl<'db> Token<'db> for TokenOrOr<'db> {
37636 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37637 TokenOrOrGreen(
37638 GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37639 .intern(db),
37640 )
37641 }
37642 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37643 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37644 }
37645}
37646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37647pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37648impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37649 type SyntaxNode = TokenOrOr<'db>;
37650 fn untyped(self) -> SyntaxStablePtrId<'db> {
37651 self.0
37652 }
37653 fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37654 TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37655 }
37656}
37657impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37658 fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37659 ptr.untyped()
37660 }
37661}
37662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37663pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37664impl<'db> TokenOrOrGreen<'db> {
37665 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37666 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37667 }
37668}
37669impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37670 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37671 type StablePtr = TokenOrOrPtr<'db>;
37672 type Green = TokenOrOrGreen<'db>;
37673 fn missing(db: &'db dyn Database) -> Self::Green {
37674 TokenOrOrGreen(
37675 GreenNode {
37676 kind: SyntaxKind::TokenMissing,
37677 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37678 }
37679 .intern(db),
37680 )
37681 }
37682 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37683 match node.long(db).green.long(db).details {
37684 GreenNodeDetails::Token(_) => Self { node },
37685 GreenNodeDetails::Node { .. } => {
37686 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37687 }
37688 }
37689 }
37690 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37691 match node.long(db).green.long(db).details {
37692 GreenNodeDetails::Token(_) => Some(Self { node }),
37693 GreenNodeDetails::Node { .. } => None,
37694 }
37695 }
37696 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37697 self.node
37698 }
37699 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37700 TokenOrOrPtr(self.node.stable_ptr(db))
37701 }
37702}
37703#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37704pub struct TerminalOrOr<'db> {
37705 node: SyntaxNode<'db>,
37706}
37707impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37708 const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37709 type TokenType = TokenOrOr<'db>;
37710 fn new_green(
37711 db: &'db dyn Database,
37712 leading_trivia: TriviaGreen<'db>,
37713 token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37714 trailing_trivia: TriviaGreen<'db>,
37715 ) -> Self::Green {
37716 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37717 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37718 TerminalOrOrGreen(
37719 GreenNode {
37720 kind: SyntaxKind::TerminalOrOr,
37721 details: GreenNodeDetails::Node { children: children.into(), width },
37722 }
37723 .intern(db),
37724 )
37725 }
37726 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37727 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37728 else {
37729 unreachable!("Expected a node, not a token");
37730 };
37731 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37732 }
37733}
37734impl<'db> TerminalOrOr<'db> {
37735 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37736 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37737 }
37738 pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37739 TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37740 }
37741 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37742 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37743 }
37744}
37745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37746pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37747impl<'db> TerminalOrOrPtr<'db> {}
37748impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37749 type SyntaxNode = TerminalOrOr<'db>;
37750 fn untyped(self) -> SyntaxStablePtrId<'db> {
37751 self.0
37752 }
37753 fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37754 TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37755 }
37756}
37757impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37758 fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37759 ptr.untyped()
37760 }
37761}
37762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37763pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37764impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37765 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37766 type StablePtr = TerminalOrOrPtr<'db>;
37767 type Green = TerminalOrOrGreen<'db>;
37768 fn missing(db: &'db dyn Database) -> Self::Green {
37769 TerminalOrOrGreen(
37770 GreenNode {
37771 kind: SyntaxKind::TerminalOrOr,
37772 details: GreenNodeDetails::Node {
37773 children: [
37774 Trivia::missing(db).0,
37775 TokenOrOr::missing(db).0,
37776 Trivia::missing(db).0,
37777 ]
37778 .into(),
37779 width: TextWidth::default(),
37780 },
37781 }
37782 .intern(db),
37783 )
37784 }
37785 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37786 let kind = node.kind(db);
37787 assert_eq!(
37788 kind,
37789 SyntaxKind::TerminalOrOr,
37790 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37791 kind,
37792 SyntaxKind::TerminalOrOr
37793 );
37794 Self { node }
37795 }
37796 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37797 let kind = node.kind(db);
37798 if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37799 }
37800 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37801 self.node
37802 }
37803 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37804 TerminalOrOrPtr(self.node.stable_ptr(db))
37805 }
37806}
37807#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37808pub struct TokenPlus<'db> {
37809 node: SyntaxNode<'db>,
37810}
37811impl<'db> Token<'db> for TokenPlus<'db> {
37812 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37813 TokenPlusGreen(
37814 GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37815 .intern(db),
37816 )
37817 }
37818 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37819 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37820 }
37821}
37822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37823pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37824impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37825 type SyntaxNode = TokenPlus<'db>;
37826 fn untyped(self) -> SyntaxStablePtrId<'db> {
37827 self.0
37828 }
37829 fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37830 TokenPlus::from_syntax_node(db, self.0.lookup(db))
37831 }
37832}
37833impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37834 fn from(ptr: TokenPlusPtr<'db>) -> Self {
37835 ptr.untyped()
37836 }
37837}
37838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37839pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37840impl<'db> TokenPlusGreen<'db> {
37841 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37842 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37843 }
37844}
37845impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37846 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37847 type StablePtr = TokenPlusPtr<'db>;
37848 type Green = TokenPlusGreen<'db>;
37849 fn missing(db: &'db dyn Database) -> Self::Green {
37850 TokenPlusGreen(
37851 GreenNode {
37852 kind: SyntaxKind::TokenMissing,
37853 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37854 }
37855 .intern(db),
37856 )
37857 }
37858 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37859 match node.long(db).green.long(db).details {
37860 GreenNodeDetails::Token(_) => Self { node },
37861 GreenNodeDetails::Node { .. } => {
37862 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37863 }
37864 }
37865 }
37866 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37867 match node.long(db).green.long(db).details {
37868 GreenNodeDetails::Token(_) => Some(Self { node }),
37869 GreenNodeDetails::Node { .. } => None,
37870 }
37871 }
37872 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37873 self.node
37874 }
37875 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37876 TokenPlusPtr(self.node.stable_ptr(db))
37877 }
37878}
37879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37880pub struct TerminalPlus<'db> {
37881 node: SyntaxNode<'db>,
37882}
37883impl<'db> Terminal<'db> for TerminalPlus<'db> {
37884 const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37885 type TokenType = TokenPlus<'db>;
37886 fn new_green(
37887 db: &'db dyn Database,
37888 leading_trivia: TriviaGreen<'db>,
37889 token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37890 trailing_trivia: TriviaGreen<'db>,
37891 ) -> Self::Green {
37892 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37893 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37894 TerminalPlusGreen(
37895 GreenNode {
37896 kind: SyntaxKind::TerminalPlus,
37897 details: GreenNodeDetails::Node { children: children.into(), width },
37898 }
37899 .intern(db),
37900 )
37901 }
37902 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37903 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37904 else {
37905 unreachable!("Expected a node, not a token");
37906 };
37907 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37908 }
37909}
37910impl<'db> TerminalPlus<'db> {
37911 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37912 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37913 }
37914 pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37915 TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37916 }
37917 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37918 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37919 }
37920}
37921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37922pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37923impl<'db> TerminalPlusPtr<'db> {}
37924impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37925 type SyntaxNode = TerminalPlus<'db>;
37926 fn untyped(self) -> SyntaxStablePtrId<'db> {
37927 self.0
37928 }
37929 fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37930 TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37931 }
37932}
37933impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37934 fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37935 ptr.untyped()
37936 }
37937}
37938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37939pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37940impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37941 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37942 type StablePtr = TerminalPlusPtr<'db>;
37943 type Green = TerminalPlusGreen<'db>;
37944 fn missing(db: &'db dyn Database) -> Self::Green {
37945 TerminalPlusGreen(
37946 GreenNode {
37947 kind: SyntaxKind::TerminalPlus,
37948 details: GreenNodeDetails::Node {
37949 children: [
37950 Trivia::missing(db).0,
37951 TokenPlus::missing(db).0,
37952 Trivia::missing(db).0,
37953 ]
37954 .into(),
37955 width: TextWidth::default(),
37956 },
37957 }
37958 .intern(db),
37959 )
37960 }
37961 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37962 let kind = node.kind(db);
37963 assert_eq!(
37964 kind,
37965 SyntaxKind::TerminalPlus,
37966 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37967 kind,
37968 SyntaxKind::TerminalPlus
37969 );
37970 Self { node }
37971 }
37972 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37973 let kind = node.kind(db);
37974 if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37975 }
37976 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37977 self.node
37978 }
37979 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37980 TerminalPlusPtr(self.node.stable_ptr(db))
37981 }
37982}
37983#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37984pub struct TokenPlusEq<'db> {
37985 node: SyntaxNode<'db>,
37986}
37987impl<'db> Token<'db> for TokenPlusEq<'db> {
37988 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37989 TokenPlusEqGreen(
37990 GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37991 .intern(db),
37992 )
37993 }
37994 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37995 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37996 }
37997}
37998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37999pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
38000impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
38001 type SyntaxNode = TokenPlusEq<'db>;
38002 fn untyped(self) -> SyntaxStablePtrId<'db> {
38003 self.0
38004 }
38005 fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
38006 TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
38007 }
38008}
38009impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
38010 fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
38011 ptr.untyped()
38012 }
38013}
38014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38015pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
38016impl<'db> TokenPlusEqGreen<'db> {
38017 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38018 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38019 }
38020}
38021impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
38022 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
38023 type StablePtr = TokenPlusEqPtr<'db>;
38024 type Green = TokenPlusEqGreen<'db>;
38025 fn missing(db: &'db dyn Database) -> Self::Green {
38026 TokenPlusEqGreen(
38027 GreenNode {
38028 kind: SyntaxKind::TokenMissing,
38029 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38030 }
38031 .intern(db),
38032 )
38033 }
38034 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38035 match node.long(db).green.long(db).details {
38036 GreenNodeDetails::Token(_) => Self { node },
38037 GreenNodeDetails::Node { .. } => {
38038 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
38039 }
38040 }
38041 }
38042 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38043 match node.long(db).green.long(db).details {
38044 GreenNodeDetails::Token(_) => Some(Self { node }),
38045 GreenNodeDetails::Node { .. } => None,
38046 }
38047 }
38048 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38049 self.node
38050 }
38051 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38052 TokenPlusEqPtr(self.node.stable_ptr(db))
38053 }
38054}
38055#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38056pub struct TerminalPlusEq<'db> {
38057 node: SyntaxNode<'db>,
38058}
38059impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
38060 const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
38061 type TokenType = TokenPlusEq<'db>;
38062 fn new_green(
38063 db: &'db dyn Database,
38064 leading_trivia: TriviaGreen<'db>,
38065 token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38066 trailing_trivia: TriviaGreen<'db>,
38067 ) -> Self::Green {
38068 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38069 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38070 TerminalPlusEqGreen(
38071 GreenNode {
38072 kind: SyntaxKind::TerminalPlusEq,
38073 details: GreenNodeDetails::Node { children: children.into(), width },
38074 }
38075 .intern(db),
38076 )
38077 }
38078 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38079 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38080 else {
38081 unreachable!("Expected a node, not a token");
38082 };
38083 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38084 }
38085}
38086impl<'db> TerminalPlusEq<'db> {
38087 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38088 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38089 }
38090 pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
38091 TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
38092 }
38093 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38094 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38095 }
38096}
38097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38098pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
38099impl<'db> TerminalPlusEqPtr<'db> {}
38100impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
38101 type SyntaxNode = TerminalPlusEq<'db>;
38102 fn untyped(self) -> SyntaxStablePtrId<'db> {
38103 self.0
38104 }
38105 fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
38106 TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
38107 }
38108}
38109impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
38110 fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
38111 ptr.untyped()
38112 }
38113}
38114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38115pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
38116impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
38117 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
38118 type StablePtr = TerminalPlusEqPtr<'db>;
38119 type Green = TerminalPlusEqGreen<'db>;
38120 fn missing(db: &'db dyn Database) -> Self::Green {
38121 TerminalPlusEqGreen(
38122 GreenNode {
38123 kind: SyntaxKind::TerminalPlusEq,
38124 details: GreenNodeDetails::Node {
38125 children: [
38126 Trivia::missing(db).0,
38127 TokenPlusEq::missing(db).0,
38128 Trivia::missing(db).0,
38129 ]
38130 .into(),
38131 width: TextWidth::default(),
38132 },
38133 }
38134 .intern(db),
38135 )
38136 }
38137 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38138 let kind = node.kind(db);
38139 assert_eq!(
38140 kind,
38141 SyntaxKind::TerminalPlusEq,
38142 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38143 kind,
38144 SyntaxKind::TerminalPlusEq
38145 );
38146 Self { node }
38147 }
38148 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38149 let kind = node.kind(db);
38150 if kind == SyntaxKind::TerminalPlusEq {
38151 Some(Self::from_syntax_node(db, node))
38152 } else {
38153 None
38154 }
38155 }
38156 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38157 self.node
38158 }
38159 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38160 TerminalPlusEqPtr(self.node.stable_ptr(db))
38161 }
38162}
38163#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38164pub struct TokenQuestionMark<'db> {
38165 node: SyntaxNode<'db>,
38166}
38167impl<'db> Token<'db> for TokenQuestionMark<'db> {
38168 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38169 TokenQuestionMarkGreen(
38170 GreenNode {
38171 kind: SyntaxKind::TokenQuestionMark,
38172 details: GreenNodeDetails::Token(text),
38173 }
38174 .intern(db),
38175 )
38176 }
38177 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38178 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38179 }
38180}
38181#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38182pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38183impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
38184 type SyntaxNode = TokenQuestionMark<'db>;
38185 fn untyped(self) -> SyntaxStablePtrId<'db> {
38186 self.0
38187 }
38188 fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38189 TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
38190 }
38191}
38192impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38193 fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
38194 ptr.untyped()
38195 }
38196}
38197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38198pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
38199impl<'db> TokenQuestionMarkGreen<'db> {
38200 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38201 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38202 }
38203}
38204impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
38205 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
38206 type StablePtr = TokenQuestionMarkPtr<'db>;
38207 type Green = TokenQuestionMarkGreen<'db>;
38208 fn missing(db: &'db dyn Database) -> Self::Green {
38209 TokenQuestionMarkGreen(
38210 GreenNode {
38211 kind: SyntaxKind::TokenMissing,
38212 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38213 }
38214 .intern(db),
38215 )
38216 }
38217 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38218 match node.long(db).green.long(db).details {
38219 GreenNodeDetails::Token(_) => Self { node },
38220 GreenNodeDetails::Node { .. } => {
38221 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
38222 }
38223 }
38224 }
38225 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38226 match node.long(db).green.long(db).details {
38227 GreenNodeDetails::Token(_) => Some(Self { node }),
38228 GreenNodeDetails::Node { .. } => None,
38229 }
38230 }
38231 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38232 self.node
38233 }
38234 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38235 TokenQuestionMarkPtr(self.node.stable_ptr(db))
38236 }
38237}
38238#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38239pub struct TerminalQuestionMark<'db> {
38240 node: SyntaxNode<'db>,
38241}
38242impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
38243 const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
38244 type TokenType = TokenQuestionMark<'db>;
38245 fn new_green(
38246 db: &'db dyn Database,
38247 leading_trivia: TriviaGreen<'db>,
38248 token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38249 trailing_trivia: TriviaGreen<'db>,
38250 ) -> Self::Green {
38251 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38252 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38253 TerminalQuestionMarkGreen(
38254 GreenNode {
38255 kind: SyntaxKind::TerminalQuestionMark,
38256 details: GreenNodeDetails::Node { children: children.into(), width },
38257 }
38258 .intern(db),
38259 )
38260 }
38261 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38262 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38263 else {
38264 unreachable!("Expected a node, not a token");
38265 };
38266 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38267 }
38268}
38269impl<'db> TerminalQuestionMark<'db> {
38270 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38271 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38272 }
38273 pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38274 TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
38275 }
38276 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38277 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38278 }
38279}
38280#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38281pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38282impl<'db> TerminalQuestionMarkPtr<'db> {}
38283impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
38284 type SyntaxNode = TerminalQuestionMark<'db>;
38285 fn untyped(self) -> SyntaxStablePtrId<'db> {
38286 self.0
38287 }
38288 fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
38289 TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
38290 }
38291}
38292impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38293 fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
38294 ptr.untyped()
38295 }
38296}
38297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38298pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
38299impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
38300 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
38301 type StablePtr = TerminalQuestionMarkPtr<'db>;
38302 type Green = TerminalQuestionMarkGreen<'db>;
38303 fn missing(db: &'db dyn Database) -> Self::Green {
38304 TerminalQuestionMarkGreen(
38305 GreenNode {
38306 kind: SyntaxKind::TerminalQuestionMark,
38307 details: GreenNodeDetails::Node {
38308 children: [
38309 Trivia::missing(db).0,
38310 TokenQuestionMark::missing(db).0,
38311 Trivia::missing(db).0,
38312 ]
38313 .into(),
38314 width: TextWidth::default(),
38315 },
38316 }
38317 .intern(db),
38318 )
38319 }
38320 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38321 let kind = node.kind(db);
38322 assert_eq!(
38323 kind,
38324 SyntaxKind::TerminalQuestionMark,
38325 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38326 kind,
38327 SyntaxKind::TerminalQuestionMark
38328 );
38329 Self { node }
38330 }
38331 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38332 let kind = node.kind(db);
38333 if kind == SyntaxKind::TerminalQuestionMark {
38334 Some(Self::from_syntax_node(db, node))
38335 } else {
38336 None
38337 }
38338 }
38339 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38340 self.node
38341 }
38342 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38343 TerminalQuestionMarkPtr(self.node.stable_ptr(db))
38344 }
38345}
38346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38347pub struct TokenRBrace<'db> {
38348 node: SyntaxNode<'db>,
38349}
38350impl<'db> Token<'db> for TokenRBrace<'db> {
38351 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38352 TokenRBraceGreen(
38353 GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
38354 .intern(db),
38355 )
38356 }
38357 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38358 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38359 }
38360}
38361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38362pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38363impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
38364 type SyntaxNode = TokenRBrace<'db>;
38365 fn untyped(self) -> SyntaxStablePtrId<'db> {
38366 self.0
38367 }
38368 fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38369 TokenRBrace::from_syntax_node(db, self.0.lookup(db))
38370 }
38371}
38372impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38373 fn from(ptr: TokenRBracePtr<'db>) -> Self {
38374 ptr.untyped()
38375 }
38376}
38377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38378pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
38379impl<'db> TokenRBraceGreen<'db> {
38380 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38381 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38382 }
38383}
38384impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
38385 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
38386 type StablePtr = TokenRBracePtr<'db>;
38387 type Green = TokenRBraceGreen<'db>;
38388 fn missing(db: &'db dyn Database) -> Self::Green {
38389 TokenRBraceGreen(
38390 GreenNode {
38391 kind: SyntaxKind::TokenMissing,
38392 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38393 }
38394 .intern(db),
38395 )
38396 }
38397 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38398 match node.long(db).green.long(db).details {
38399 GreenNodeDetails::Token(_) => Self { node },
38400 GreenNodeDetails::Node { .. } => {
38401 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
38402 }
38403 }
38404 }
38405 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38406 match node.long(db).green.long(db).details {
38407 GreenNodeDetails::Token(_) => Some(Self { node }),
38408 GreenNodeDetails::Node { .. } => None,
38409 }
38410 }
38411 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38412 self.node
38413 }
38414 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38415 TokenRBracePtr(self.node.stable_ptr(db))
38416 }
38417}
38418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38419pub struct TerminalRBrace<'db> {
38420 node: SyntaxNode<'db>,
38421}
38422impl<'db> Terminal<'db> for TerminalRBrace<'db> {
38423 const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
38424 type TokenType = TokenRBrace<'db>;
38425 fn new_green(
38426 db: &'db dyn Database,
38427 leading_trivia: TriviaGreen<'db>,
38428 token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38429 trailing_trivia: TriviaGreen<'db>,
38430 ) -> Self::Green {
38431 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38432 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38433 TerminalRBraceGreen(
38434 GreenNode {
38435 kind: SyntaxKind::TerminalRBrace,
38436 details: GreenNodeDetails::Node { children: children.into(), width },
38437 }
38438 .intern(db),
38439 )
38440 }
38441 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38442 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38443 else {
38444 unreachable!("Expected a node, not a token");
38445 };
38446 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38447 }
38448}
38449impl<'db> TerminalRBrace<'db> {
38450 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38451 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38452 }
38453 pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38454 TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
38455 }
38456 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38457 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38458 }
38459}
38460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38461pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38462impl<'db> TerminalRBracePtr<'db> {}
38463impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
38464 type SyntaxNode = TerminalRBrace<'db>;
38465 fn untyped(self) -> SyntaxStablePtrId<'db> {
38466 self.0
38467 }
38468 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38469 TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38470 }
38471}
38472impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38473 fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38474 ptr.untyped()
38475 }
38476}
38477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38478pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38479impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38480 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38481 type StablePtr = TerminalRBracePtr<'db>;
38482 type Green = TerminalRBraceGreen<'db>;
38483 fn missing(db: &'db dyn Database) -> Self::Green {
38484 TerminalRBraceGreen(
38485 GreenNode {
38486 kind: SyntaxKind::TerminalRBrace,
38487 details: GreenNodeDetails::Node {
38488 children: [
38489 Trivia::missing(db).0,
38490 TokenRBrace::missing(db).0,
38491 Trivia::missing(db).0,
38492 ]
38493 .into(),
38494 width: TextWidth::default(),
38495 },
38496 }
38497 .intern(db),
38498 )
38499 }
38500 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38501 let kind = node.kind(db);
38502 assert_eq!(
38503 kind,
38504 SyntaxKind::TerminalRBrace,
38505 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38506 kind,
38507 SyntaxKind::TerminalRBrace
38508 );
38509 Self { node }
38510 }
38511 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38512 let kind = node.kind(db);
38513 if kind == SyntaxKind::TerminalRBrace {
38514 Some(Self::from_syntax_node(db, node))
38515 } else {
38516 None
38517 }
38518 }
38519 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38520 self.node
38521 }
38522 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38523 TerminalRBracePtr(self.node.stable_ptr(db))
38524 }
38525}
38526#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38527pub struct TokenRBrack<'db> {
38528 node: SyntaxNode<'db>,
38529}
38530impl<'db> Token<'db> for TokenRBrack<'db> {
38531 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38532 TokenRBrackGreen(
38533 GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38534 .intern(db),
38535 )
38536 }
38537 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38538 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38539 }
38540}
38541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38542pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38543impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38544 type SyntaxNode = TokenRBrack<'db>;
38545 fn untyped(self) -> SyntaxStablePtrId<'db> {
38546 self.0
38547 }
38548 fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38549 TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38550 }
38551}
38552impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38553 fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38554 ptr.untyped()
38555 }
38556}
38557#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38558pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38559impl<'db> TokenRBrackGreen<'db> {
38560 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38561 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38562 }
38563}
38564impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38565 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38566 type StablePtr = TokenRBrackPtr<'db>;
38567 type Green = TokenRBrackGreen<'db>;
38568 fn missing(db: &'db dyn Database) -> Self::Green {
38569 TokenRBrackGreen(
38570 GreenNode {
38571 kind: SyntaxKind::TokenMissing,
38572 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38573 }
38574 .intern(db),
38575 )
38576 }
38577 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38578 match node.long(db).green.long(db).details {
38579 GreenNodeDetails::Token(_) => Self { node },
38580 GreenNodeDetails::Node { .. } => {
38581 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38582 }
38583 }
38584 }
38585 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38586 match node.long(db).green.long(db).details {
38587 GreenNodeDetails::Token(_) => Some(Self { node }),
38588 GreenNodeDetails::Node { .. } => None,
38589 }
38590 }
38591 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38592 self.node
38593 }
38594 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38595 TokenRBrackPtr(self.node.stable_ptr(db))
38596 }
38597}
38598#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38599pub struct TerminalRBrack<'db> {
38600 node: SyntaxNode<'db>,
38601}
38602impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38603 const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38604 type TokenType = TokenRBrack<'db>;
38605 fn new_green(
38606 db: &'db dyn Database,
38607 leading_trivia: TriviaGreen<'db>,
38608 token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38609 trailing_trivia: TriviaGreen<'db>,
38610 ) -> Self::Green {
38611 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38612 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38613 TerminalRBrackGreen(
38614 GreenNode {
38615 kind: SyntaxKind::TerminalRBrack,
38616 details: GreenNodeDetails::Node { children: children.into(), width },
38617 }
38618 .intern(db),
38619 )
38620 }
38621 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38622 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38623 else {
38624 unreachable!("Expected a node, not a token");
38625 };
38626 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38627 }
38628}
38629impl<'db> TerminalRBrack<'db> {
38630 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38631 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38632 }
38633 pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38634 TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38635 }
38636 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38637 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38638 }
38639}
38640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38641pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38642impl<'db> TerminalRBrackPtr<'db> {}
38643impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38644 type SyntaxNode = TerminalRBrack<'db>;
38645 fn untyped(self) -> SyntaxStablePtrId<'db> {
38646 self.0
38647 }
38648 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38649 TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38650 }
38651}
38652impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38653 fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38654 ptr.untyped()
38655 }
38656}
38657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38658pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38659impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38660 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38661 type StablePtr = TerminalRBrackPtr<'db>;
38662 type Green = TerminalRBrackGreen<'db>;
38663 fn missing(db: &'db dyn Database) -> Self::Green {
38664 TerminalRBrackGreen(
38665 GreenNode {
38666 kind: SyntaxKind::TerminalRBrack,
38667 details: GreenNodeDetails::Node {
38668 children: [
38669 Trivia::missing(db).0,
38670 TokenRBrack::missing(db).0,
38671 Trivia::missing(db).0,
38672 ]
38673 .into(),
38674 width: TextWidth::default(),
38675 },
38676 }
38677 .intern(db),
38678 )
38679 }
38680 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38681 let kind = node.kind(db);
38682 assert_eq!(
38683 kind,
38684 SyntaxKind::TerminalRBrack,
38685 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38686 kind,
38687 SyntaxKind::TerminalRBrack
38688 );
38689 Self { node }
38690 }
38691 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38692 let kind = node.kind(db);
38693 if kind == SyntaxKind::TerminalRBrack {
38694 Some(Self::from_syntax_node(db, node))
38695 } else {
38696 None
38697 }
38698 }
38699 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38700 self.node
38701 }
38702 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38703 TerminalRBrackPtr(self.node.stable_ptr(db))
38704 }
38705}
38706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38707pub struct TokenRParen<'db> {
38708 node: SyntaxNode<'db>,
38709}
38710impl<'db> Token<'db> for TokenRParen<'db> {
38711 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38712 TokenRParenGreen(
38713 GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38714 .intern(db),
38715 )
38716 }
38717 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38718 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38719 }
38720}
38721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38722pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38723impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38724 type SyntaxNode = TokenRParen<'db>;
38725 fn untyped(self) -> SyntaxStablePtrId<'db> {
38726 self.0
38727 }
38728 fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38729 TokenRParen::from_syntax_node(db, self.0.lookup(db))
38730 }
38731}
38732impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38733 fn from(ptr: TokenRParenPtr<'db>) -> Self {
38734 ptr.untyped()
38735 }
38736}
38737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38738pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38739impl<'db> TokenRParenGreen<'db> {
38740 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38741 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38742 }
38743}
38744impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38745 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38746 type StablePtr = TokenRParenPtr<'db>;
38747 type Green = TokenRParenGreen<'db>;
38748 fn missing(db: &'db dyn Database) -> Self::Green {
38749 TokenRParenGreen(
38750 GreenNode {
38751 kind: SyntaxKind::TokenMissing,
38752 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38753 }
38754 .intern(db),
38755 )
38756 }
38757 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38758 match node.long(db).green.long(db).details {
38759 GreenNodeDetails::Token(_) => Self { node },
38760 GreenNodeDetails::Node { .. } => {
38761 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38762 }
38763 }
38764 }
38765 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38766 match node.long(db).green.long(db).details {
38767 GreenNodeDetails::Token(_) => Some(Self { node }),
38768 GreenNodeDetails::Node { .. } => None,
38769 }
38770 }
38771 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38772 self.node
38773 }
38774 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38775 TokenRParenPtr(self.node.stable_ptr(db))
38776 }
38777}
38778#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38779pub struct TerminalRParen<'db> {
38780 node: SyntaxNode<'db>,
38781}
38782impl<'db> Terminal<'db> for TerminalRParen<'db> {
38783 const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38784 type TokenType = TokenRParen<'db>;
38785 fn new_green(
38786 db: &'db dyn Database,
38787 leading_trivia: TriviaGreen<'db>,
38788 token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38789 trailing_trivia: TriviaGreen<'db>,
38790 ) -> Self::Green {
38791 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38792 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38793 TerminalRParenGreen(
38794 GreenNode {
38795 kind: SyntaxKind::TerminalRParen,
38796 details: GreenNodeDetails::Node { children: children.into(), width },
38797 }
38798 .intern(db),
38799 )
38800 }
38801 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38802 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38803 else {
38804 unreachable!("Expected a node, not a token");
38805 };
38806 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38807 }
38808}
38809impl<'db> TerminalRParen<'db> {
38810 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38811 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38812 }
38813 pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38814 TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38815 }
38816 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38817 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38818 }
38819}
38820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38821pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38822impl<'db> TerminalRParenPtr<'db> {}
38823impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38824 type SyntaxNode = TerminalRParen<'db>;
38825 fn untyped(self) -> SyntaxStablePtrId<'db> {
38826 self.0
38827 }
38828 fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38829 TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38830 }
38831}
38832impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38833 fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38834 ptr.untyped()
38835 }
38836}
38837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38838pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38839impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38840 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38841 type StablePtr = TerminalRParenPtr<'db>;
38842 type Green = TerminalRParenGreen<'db>;
38843 fn missing(db: &'db dyn Database) -> Self::Green {
38844 TerminalRParenGreen(
38845 GreenNode {
38846 kind: SyntaxKind::TerminalRParen,
38847 details: GreenNodeDetails::Node {
38848 children: [
38849 Trivia::missing(db).0,
38850 TokenRParen::missing(db).0,
38851 Trivia::missing(db).0,
38852 ]
38853 .into(),
38854 width: TextWidth::default(),
38855 },
38856 }
38857 .intern(db),
38858 )
38859 }
38860 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38861 let kind = node.kind(db);
38862 assert_eq!(
38863 kind,
38864 SyntaxKind::TerminalRParen,
38865 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38866 kind,
38867 SyntaxKind::TerminalRParen
38868 );
38869 Self { node }
38870 }
38871 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38872 let kind = node.kind(db);
38873 if kind == SyntaxKind::TerminalRParen {
38874 Some(Self::from_syntax_node(db, node))
38875 } else {
38876 None
38877 }
38878 }
38879 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38880 self.node
38881 }
38882 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38883 TerminalRParenPtr(self.node.stable_ptr(db))
38884 }
38885}
38886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38887pub struct TokenSemicolon<'db> {
38888 node: SyntaxNode<'db>,
38889}
38890impl<'db> Token<'db> for TokenSemicolon<'db> {
38891 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38892 TokenSemicolonGreen(
38893 GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38894 .intern(db),
38895 )
38896 }
38897 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38898 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38899 }
38900}
38901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38902pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38903impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38904 type SyntaxNode = TokenSemicolon<'db>;
38905 fn untyped(self) -> SyntaxStablePtrId<'db> {
38906 self.0
38907 }
38908 fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38909 TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38910 }
38911}
38912impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38913 fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38914 ptr.untyped()
38915 }
38916}
38917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38918pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38919impl<'db> TokenSemicolonGreen<'db> {
38920 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38921 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38922 }
38923}
38924impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38925 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38926 type StablePtr = TokenSemicolonPtr<'db>;
38927 type Green = TokenSemicolonGreen<'db>;
38928 fn missing(db: &'db dyn Database) -> Self::Green {
38929 TokenSemicolonGreen(
38930 GreenNode {
38931 kind: SyntaxKind::TokenMissing,
38932 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38933 }
38934 .intern(db),
38935 )
38936 }
38937 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38938 match node.long(db).green.long(db).details {
38939 GreenNodeDetails::Token(_) => Self { node },
38940 GreenNodeDetails::Node { .. } => {
38941 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38942 }
38943 }
38944 }
38945 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38946 match node.long(db).green.long(db).details {
38947 GreenNodeDetails::Token(_) => Some(Self { node }),
38948 GreenNodeDetails::Node { .. } => None,
38949 }
38950 }
38951 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38952 self.node
38953 }
38954 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38955 TokenSemicolonPtr(self.node.stable_ptr(db))
38956 }
38957}
38958#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38959pub struct TerminalSemicolon<'db> {
38960 node: SyntaxNode<'db>,
38961}
38962impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38963 const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38964 type TokenType = TokenSemicolon<'db>;
38965 fn new_green(
38966 db: &'db dyn Database,
38967 leading_trivia: TriviaGreen<'db>,
38968 token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38969 trailing_trivia: TriviaGreen<'db>,
38970 ) -> Self::Green {
38971 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38972 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38973 TerminalSemicolonGreen(
38974 GreenNode {
38975 kind: SyntaxKind::TerminalSemicolon,
38976 details: GreenNodeDetails::Node { children: children.into(), width },
38977 }
38978 .intern(db),
38979 )
38980 }
38981 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38982 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38983 else {
38984 unreachable!("Expected a node, not a token");
38985 };
38986 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38987 }
38988}
38989impl<'db> TerminalSemicolon<'db> {
38990 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38991 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38992 }
38993 pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38994 TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38995 }
38996 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38997 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38998 }
38999}
39000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39001pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
39002impl<'db> TerminalSemicolonPtr<'db> {}
39003impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
39004 type SyntaxNode = TerminalSemicolon<'db>;
39005 fn untyped(self) -> SyntaxStablePtrId<'db> {
39006 self.0
39007 }
39008 fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
39009 TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
39010 }
39011}
39012impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
39013 fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
39014 ptr.untyped()
39015 }
39016}
39017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39018pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
39019impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
39020 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
39021 type StablePtr = TerminalSemicolonPtr<'db>;
39022 type Green = TerminalSemicolonGreen<'db>;
39023 fn missing(db: &'db dyn Database) -> Self::Green {
39024 TerminalSemicolonGreen(
39025 GreenNode {
39026 kind: SyntaxKind::TerminalSemicolon,
39027 details: GreenNodeDetails::Node {
39028 children: [
39029 Trivia::missing(db).0,
39030 TokenSemicolon::missing(db).0,
39031 Trivia::missing(db).0,
39032 ]
39033 .into(),
39034 width: TextWidth::default(),
39035 },
39036 }
39037 .intern(db),
39038 )
39039 }
39040 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39041 let kind = node.kind(db);
39042 assert_eq!(
39043 kind,
39044 SyntaxKind::TerminalSemicolon,
39045 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39046 kind,
39047 SyntaxKind::TerminalSemicolon
39048 );
39049 Self { node }
39050 }
39051 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39052 let kind = node.kind(db);
39053 if kind == SyntaxKind::TerminalSemicolon {
39054 Some(Self::from_syntax_node(db, node))
39055 } else {
39056 None
39057 }
39058 }
39059 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39060 self.node
39061 }
39062 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39063 TerminalSemicolonPtr(self.node.stable_ptr(db))
39064 }
39065}
39066#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39067pub struct TokenUnderscore<'db> {
39068 node: SyntaxNode<'db>,
39069}
39070impl<'db> Token<'db> for TokenUnderscore<'db> {
39071 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39072 TokenUnderscoreGreen(
39073 GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
39074 .intern(db),
39075 )
39076 }
39077 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39078 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39079 }
39080}
39081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39082pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
39083impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
39084 type SyntaxNode = TokenUnderscore<'db>;
39085 fn untyped(self) -> SyntaxStablePtrId<'db> {
39086 self.0
39087 }
39088 fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
39089 TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
39090 }
39091}
39092impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
39093 fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
39094 ptr.untyped()
39095 }
39096}
39097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39098pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
39099impl<'db> TokenUnderscoreGreen<'db> {
39100 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39101 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39102 }
39103}
39104impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
39105 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
39106 type StablePtr = TokenUnderscorePtr<'db>;
39107 type Green = TokenUnderscoreGreen<'db>;
39108 fn missing(db: &'db dyn Database) -> Self::Green {
39109 TokenUnderscoreGreen(
39110 GreenNode {
39111 kind: SyntaxKind::TokenMissing,
39112 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39113 }
39114 .intern(db),
39115 )
39116 }
39117 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39118 match node.long(db).green.long(db).details {
39119 GreenNodeDetails::Token(_) => Self { node },
39120 GreenNodeDetails::Node { .. } => {
39121 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
39122 }
39123 }
39124 }
39125 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39126 match node.long(db).green.long(db).details {
39127 GreenNodeDetails::Token(_) => Some(Self { node }),
39128 GreenNodeDetails::Node { .. } => None,
39129 }
39130 }
39131 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39132 self.node
39133 }
39134 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39135 TokenUnderscorePtr(self.node.stable_ptr(db))
39136 }
39137}
39138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39139pub struct TerminalUnderscore<'db> {
39140 node: SyntaxNode<'db>,
39141}
39142impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
39143 const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
39144 type TokenType = TokenUnderscore<'db>;
39145 fn new_green(
39146 db: &'db dyn Database,
39147 leading_trivia: TriviaGreen<'db>,
39148 token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39149 trailing_trivia: TriviaGreen<'db>,
39150 ) -> Self::Green {
39151 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39152 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39153 TerminalUnderscoreGreen(
39154 GreenNode {
39155 kind: SyntaxKind::TerminalUnderscore,
39156 details: GreenNodeDetails::Node { children: children.into(), width },
39157 }
39158 .intern(db),
39159 )
39160 }
39161 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39162 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39163 else {
39164 unreachable!("Expected a node, not a token");
39165 };
39166 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39167 }
39168}
39169impl<'db> TerminalUnderscore<'db> {
39170 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39171 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39172 }
39173 pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
39174 TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
39175 }
39176 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39177 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39178 }
39179}
39180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39181pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
39182impl<'db> TerminalUnderscorePtr<'db> {}
39183impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
39184 type SyntaxNode = TerminalUnderscore<'db>;
39185 fn untyped(self) -> SyntaxStablePtrId<'db> {
39186 self.0
39187 }
39188 fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
39189 TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
39190 }
39191}
39192impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
39193 fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
39194 ptr.untyped()
39195 }
39196}
39197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39198pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
39199impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
39200 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
39201 type StablePtr = TerminalUnderscorePtr<'db>;
39202 type Green = TerminalUnderscoreGreen<'db>;
39203 fn missing(db: &'db dyn Database) -> Self::Green {
39204 TerminalUnderscoreGreen(
39205 GreenNode {
39206 kind: SyntaxKind::TerminalUnderscore,
39207 details: GreenNodeDetails::Node {
39208 children: [
39209 Trivia::missing(db).0,
39210 TokenUnderscore::missing(db).0,
39211 Trivia::missing(db).0,
39212 ]
39213 .into(),
39214 width: TextWidth::default(),
39215 },
39216 }
39217 .intern(db),
39218 )
39219 }
39220 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39221 let kind = node.kind(db);
39222 assert_eq!(
39223 kind,
39224 SyntaxKind::TerminalUnderscore,
39225 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39226 kind,
39227 SyntaxKind::TerminalUnderscore
39228 );
39229 Self { node }
39230 }
39231 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39232 let kind = node.kind(db);
39233 if kind == SyntaxKind::TerminalUnderscore {
39234 Some(Self::from_syntax_node(db, node))
39235 } else {
39236 None
39237 }
39238 }
39239 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39240 self.node
39241 }
39242 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39243 TerminalUnderscorePtr(self.node.stable_ptr(db))
39244 }
39245}
39246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39247pub struct TokenXor<'db> {
39248 node: SyntaxNode<'db>,
39249}
39250impl<'db> Token<'db> for TokenXor<'db> {
39251 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39252 TokenXorGreen(
39253 GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
39254 .intern(db),
39255 )
39256 }
39257 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39258 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39259 }
39260}
39261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39262pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39263impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
39264 type SyntaxNode = TokenXor<'db>;
39265 fn untyped(self) -> SyntaxStablePtrId<'db> {
39266 self.0
39267 }
39268 fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
39269 TokenXor::from_syntax_node(db, self.0.lookup(db))
39270 }
39271}
39272impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
39273 fn from(ptr: TokenXorPtr<'db>) -> Self {
39274 ptr.untyped()
39275 }
39276}
39277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39278pub struct TokenXorGreen<'db>(pub GreenId<'db>);
39279impl<'db> TokenXorGreen<'db> {
39280 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39281 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39282 }
39283}
39284impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
39285 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
39286 type StablePtr = TokenXorPtr<'db>;
39287 type Green = TokenXorGreen<'db>;
39288 fn missing(db: &'db dyn Database) -> Self::Green {
39289 TokenXorGreen(
39290 GreenNode {
39291 kind: SyntaxKind::TokenMissing,
39292 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39293 }
39294 .intern(db),
39295 )
39296 }
39297 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39298 match node.long(db).green.long(db).details {
39299 GreenNodeDetails::Token(_) => Self { node },
39300 GreenNodeDetails::Node { .. } => {
39301 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
39302 }
39303 }
39304 }
39305 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39306 match node.long(db).green.long(db).details {
39307 GreenNodeDetails::Token(_) => Some(Self { node }),
39308 GreenNodeDetails::Node { .. } => None,
39309 }
39310 }
39311 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39312 self.node
39313 }
39314 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39315 TokenXorPtr(self.node.stable_ptr(db))
39316 }
39317}
39318#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39319pub struct TerminalXor<'db> {
39320 node: SyntaxNode<'db>,
39321}
39322impl<'db> Terminal<'db> for TerminalXor<'db> {
39323 const KIND: SyntaxKind = SyntaxKind::TerminalXor;
39324 type TokenType = TokenXor<'db>;
39325 fn new_green(
39326 db: &'db dyn Database,
39327 leading_trivia: TriviaGreen<'db>,
39328 token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39329 trailing_trivia: TriviaGreen<'db>,
39330 ) -> Self::Green {
39331 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39332 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39333 TerminalXorGreen(
39334 GreenNode {
39335 kind: SyntaxKind::TerminalXor,
39336 details: GreenNodeDetails::Node { children: children.into(), width },
39337 }
39338 .intern(db),
39339 )
39340 }
39341 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39342 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39343 else {
39344 unreachable!("Expected a node, not a token");
39345 };
39346 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39347 }
39348}
39349impl<'db> TerminalXor<'db> {
39350 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39351 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39352 }
39353 pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
39354 TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
39355 }
39356 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39357 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39358 }
39359}
39360#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39361pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39362impl<'db> TerminalXorPtr<'db> {}
39363impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
39364 type SyntaxNode = TerminalXor<'db>;
39365 fn untyped(self) -> SyntaxStablePtrId<'db> {
39366 self.0
39367 }
39368 fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
39369 TerminalXor::from_syntax_node(db, self.0.lookup(db))
39370 }
39371}
39372impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
39373 fn from(ptr: TerminalXorPtr<'db>) -> Self {
39374 ptr.untyped()
39375 }
39376}
39377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39378pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
39379impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
39380 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
39381 type StablePtr = TerminalXorPtr<'db>;
39382 type Green = TerminalXorGreen<'db>;
39383 fn missing(db: &'db dyn Database) -> Self::Green {
39384 TerminalXorGreen(
39385 GreenNode {
39386 kind: SyntaxKind::TerminalXor,
39387 details: GreenNodeDetails::Node {
39388 children: [
39389 Trivia::missing(db).0,
39390 TokenXor::missing(db).0,
39391 Trivia::missing(db).0,
39392 ]
39393 .into(),
39394 width: TextWidth::default(),
39395 },
39396 }
39397 .intern(db),
39398 )
39399 }
39400 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39401 let kind = node.kind(db);
39402 assert_eq!(
39403 kind,
39404 SyntaxKind::TerminalXor,
39405 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39406 kind,
39407 SyntaxKind::TerminalXor
39408 );
39409 Self { node }
39410 }
39411 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39412 let kind = node.kind(db);
39413 if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
39414 }
39415 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39416 self.node
39417 }
39418 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39419 TerminalXorPtr(self.node.stable_ptr(db))
39420 }
39421}
39422#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39423pub struct SyntaxFile<'db> {
39424 node: SyntaxNode<'db>,
39425}
39426impl<'db> SyntaxFile<'db> {
39427 pub const INDEX_ITEMS: usize = 0;
39428 pub const INDEX_EOF: usize = 1;
39429 pub fn new_green(
39430 db: &'db dyn Database,
39431 items: ModuleItemListGreen<'db>,
39432 eof: TerminalEndOfFileGreen<'db>,
39433 ) -> SyntaxFileGreen<'db> {
39434 let children = [items.0, eof.0];
39435 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39436 SyntaxFileGreen(
39437 GreenNode {
39438 kind: SyntaxKind::SyntaxFile,
39439 details: GreenNodeDetails::Node { children: children.into(), width },
39440 }
39441 .intern(db),
39442 )
39443 }
39444}
39445impl<'db> SyntaxFile<'db> {
39446 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
39447 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
39448 }
39449 pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
39450 TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
39451 }
39452}
39453#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39454pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
39455impl<'db> SyntaxFilePtr<'db> {}
39456impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
39457 type SyntaxNode = SyntaxFile<'db>;
39458 fn untyped(self) -> SyntaxStablePtrId<'db> {
39459 self.0
39460 }
39461 fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
39462 SyntaxFile::from_syntax_node(db, self.0.lookup(db))
39463 }
39464}
39465impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
39466 fn from(ptr: SyntaxFilePtr<'db>) -> Self {
39467 ptr.untyped()
39468 }
39469}
39470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39471pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
39472impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39473 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39474 type StablePtr = SyntaxFilePtr<'db>;
39475 type Green = SyntaxFileGreen<'db>;
39476 fn missing(db: &'db dyn Database) -> Self::Green {
39477 SyntaxFileGreen(
39478 GreenNode {
39479 kind: SyntaxKind::SyntaxFile,
39480 details: GreenNodeDetails::Node {
39481 children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39482 .into(),
39483 width: TextWidth::default(),
39484 },
39485 }
39486 .intern(db),
39487 )
39488 }
39489 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39490 let kind = node.kind(db);
39491 assert_eq!(
39492 kind,
39493 SyntaxKind::SyntaxFile,
39494 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39495 kind,
39496 SyntaxKind::SyntaxFile
39497 );
39498 Self { node }
39499 }
39500 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39501 let kind = node.kind(db);
39502 if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39503 }
39504 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39505 self.node
39506 }
39507 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39508 SyntaxFilePtr(self.node.stable_ptr(db))
39509 }
39510}
39511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39512pub struct TokenEmpty<'db> {
39513 node: SyntaxNode<'db>,
39514}
39515impl<'db> Token<'db> for TokenEmpty<'db> {
39516 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39517 TokenEmptyGreen(
39518 GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39519 .intern(db),
39520 )
39521 }
39522 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39523 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39524 }
39525}
39526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39527pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39528impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39529 type SyntaxNode = TokenEmpty<'db>;
39530 fn untyped(self) -> SyntaxStablePtrId<'db> {
39531 self.0
39532 }
39533 fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39534 TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39535 }
39536}
39537impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39538 fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39539 ptr.untyped()
39540 }
39541}
39542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39543pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39544impl<'db> TokenEmptyGreen<'db> {
39545 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39546 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39547 }
39548}
39549impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39550 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39551 type StablePtr = TokenEmptyPtr<'db>;
39552 type Green = TokenEmptyGreen<'db>;
39553 fn missing(db: &'db dyn Database) -> Self::Green {
39554 TokenEmptyGreen(
39555 GreenNode {
39556 kind: SyntaxKind::TokenMissing,
39557 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39558 }
39559 .intern(db),
39560 )
39561 }
39562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39563 match node.long(db).green.long(db).details {
39564 GreenNodeDetails::Token(_) => Self { node },
39565 GreenNodeDetails::Node { .. } => {
39566 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39567 }
39568 }
39569 }
39570 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39571 match node.long(db).green.long(db).details {
39572 GreenNodeDetails::Token(_) => Some(Self { node }),
39573 GreenNodeDetails::Node { .. } => None,
39574 }
39575 }
39576 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39577 self.node
39578 }
39579 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39580 TokenEmptyPtr(self.node.stable_ptr(db))
39581 }
39582}
39583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39584pub struct TerminalEmpty<'db> {
39585 node: SyntaxNode<'db>,
39586}
39587impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39588 const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39589 type TokenType = TokenEmpty<'db>;
39590 fn new_green(
39591 db: &'db dyn Database,
39592 leading_trivia: TriviaGreen<'db>,
39593 token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39594 trailing_trivia: TriviaGreen<'db>,
39595 ) -> Self::Green {
39596 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39597 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39598 TerminalEmptyGreen(
39599 GreenNode {
39600 kind: SyntaxKind::TerminalEmpty,
39601 details: GreenNodeDetails::Node { children: children.into(), width },
39602 }
39603 .intern(db),
39604 )
39605 }
39606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39607 let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39608 else {
39609 unreachable!("Expected a node, not a token");
39610 };
39611 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39612 }
39613}
39614impl<'db> TerminalEmpty<'db> {
39615 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39616 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39617 }
39618 pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39619 TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39620 }
39621 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39622 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39623 }
39624}
39625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39626pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39627impl<'db> TerminalEmptyPtr<'db> {}
39628impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39629 type SyntaxNode = TerminalEmpty<'db>;
39630 fn untyped(self) -> SyntaxStablePtrId<'db> {
39631 self.0
39632 }
39633 fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39634 TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39635 }
39636}
39637impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39638 fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39639 ptr.untyped()
39640 }
39641}
39642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39643pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39644impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39645 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39646 type StablePtr = TerminalEmptyPtr<'db>;
39647 type Green = TerminalEmptyGreen<'db>;
39648 fn missing(db: &'db dyn Database) -> Self::Green {
39649 TerminalEmptyGreen(
39650 GreenNode {
39651 kind: SyntaxKind::TerminalEmpty,
39652 details: GreenNodeDetails::Node {
39653 children: [
39654 Trivia::missing(db).0,
39655 TokenEmpty::missing(db).0,
39656 Trivia::missing(db).0,
39657 ]
39658 .into(),
39659 width: TextWidth::default(),
39660 },
39661 }
39662 .intern(db),
39663 )
39664 }
39665 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39666 let kind = node.kind(db);
39667 assert_eq!(
39668 kind,
39669 SyntaxKind::TerminalEmpty,
39670 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39671 kind,
39672 SyntaxKind::TerminalEmpty
39673 );
39674 Self { node }
39675 }
39676 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39677 let kind = node.kind(db);
39678 if kind == SyntaxKind::TerminalEmpty {
39679 Some(Self::from_syntax_node(db, node))
39680 } else {
39681 None
39682 }
39683 }
39684 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39685 self.node
39686 }
39687 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39688 TerminalEmptyPtr(self.node.stable_ptr(db))
39689 }
39690}
39691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39692pub struct TokenSingleLineComment<'db> {
39693 node: SyntaxNode<'db>,
39694}
39695impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39696 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39697 TokenSingleLineCommentGreen(
39698 GreenNode {
39699 kind: SyntaxKind::TokenSingleLineComment,
39700 details: GreenNodeDetails::Token(text),
39701 }
39702 .intern(db),
39703 )
39704 }
39705 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39706 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39707 }
39708}
39709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39710pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39711impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39712 type SyntaxNode = TokenSingleLineComment<'db>;
39713 fn untyped(self) -> SyntaxStablePtrId<'db> {
39714 self.0
39715 }
39716 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39717 TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39718 }
39719}
39720impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39721 fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39722 ptr.untyped()
39723 }
39724}
39725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39726pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39727impl<'db> TokenSingleLineCommentGreen<'db> {
39728 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39729 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39730 }
39731}
39732impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39733 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39734 type StablePtr = TokenSingleLineCommentPtr<'db>;
39735 type Green = TokenSingleLineCommentGreen<'db>;
39736 fn missing(db: &'db dyn Database) -> Self::Green {
39737 TokenSingleLineCommentGreen(
39738 GreenNode {
39739 kind: SyntaxKind::TokenMissing,
39740 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39741 }
39742 .intern(db),
39743 )
39744 }
39745 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39746 match node.long(db).green.long(db).details {
39747 GreenNodeDetails::Token(_) => Self { node },
39748 GreenNodeDetails::Node { .. } => panic!(
39749 "Expected a token {:?}, not an internal node",
39750 SyntaxKind::TokenSingleLineComment
39751 ),
39752 }
39753 }
39754 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39755 match node.long(db).green.long(db).details {
39756 GreenNodeDetails::Token(_) => Some(Self { node }),
39757 GreenNodeDetails::Node { .. } => None,
39758 }
39759 }
39760 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39761 self.node
39762 }
39763 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39764 TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39765 }
39766}
39767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39768pub struct TokenSingleLineInnerComment<'db> {
39769 node: SyntaxNode<'db>,
39770}
39771impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39772 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39773 TokenSingleLineInnerCommentGreen(
39774 GreenNode {
39775 kind: SyntaxKind::TokenSingleLineInnerComment,
39776 details: GreenNodeDetails::Token(text),
39777 }
39778 .intern(db),
39779 )
39780 }
39781 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39782 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39783 }
39784}
39785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39786pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39787impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39788 type SyntaxNode = TokenSingleLineInnerComment<'db>;
39789 fn untyped(self) -> SyntaxStablePtrId<'db> {
39790 self.0
39791 }
39792 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39793 TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39794 }
39795}
39796impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39797 fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39798 ptr.untyped()
39799 }
39800}
39801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39802pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39803impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39804 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39805 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39806 }
39807}
39808impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39809 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39810 type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39811 type Green = TokenSingleLineInnerCommentGreen<'db>;
39812 fn missing(db: &'db dyn Database) -> Self::Green {
39813 TokenSingleLineInnerCommentGreen(
39814 GreenNode {
39815 kind: SyntaxKind::TokenMissing,
39816 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39817 }
39818 .intern(db),
39819 )
39820 }
39821 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39822 match node.long(db).green.long(db).details {
39823 GreenNodeDetails::Token(_) => Self { node },
39824 GreenNodeDetails::Node { .. } => panic!(
39825 "Expected a token {:?}, not an internal node",
39826 SyntaxKind::TokenSingleLineInnerComment
39827 ),
39828 }
39829 }
39830 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39831 match node.long(db).green.long(db).details {
39832 GreenNodeDetails::Token(_) => Some(Self { node }),
39833 GreenNodeDetails::Node { .. } => None,
39834 }
39835 }
39836 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39837 self.node
39838 }
39839 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39840 TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39841 }
39842}
39843#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39844pub struct TokenSingleLineDocComment<'db> {
39845 node: SyntaxNode<'db>,
39846}
39847impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39848 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39849 TokenSingleLineDocCommentGreen(
39850 GreenNode {
39851 kind: SyntaxKind::TokenSingleLineDocComment,
39852 details: GreenNodeDetails::Token(text),
39853 }
39854 .intern(db),
39855 )
39856 }
39857 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39858 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39859 }
39860}
39861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39862pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39863impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39864 type SyntaxNode = TokenSingleLineDocComment<'db>;
39865 fn untyped(self) -> SyntaxStablePtrId<'db> {
39866 self.0
39867 }
39868 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39869 TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39870 }
39871}
39872impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39873 fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39874 ptr.untyped()
39875 }
39876}
39877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39878pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39879impl<'db> TokenSingleLineDocCommentGreen<'db> {
39880 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39881 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39882 }
39883}
39884impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39885 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39886 type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39887 type Green = TokenSingleLineDocCommentGreen<'db>;
39888 fn missing(db: &'db dyn Database) -> Self::Green {
39889 TokenSingleLineDocCommentGreen(
39890 GreenNode {
39891 kind: SyntaxKind::TokenMissing,
39892 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39893 }
39894 .intern(db),
39895 )
39896 }
39897 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39898 match node.long(db).green.long(db).details {
39899 GreenNodeDetails::Token(_) => Self { node },
39900 GreenNodeDetails::Node { .. } => panic!(
39901 "Expected a token {:?}, not an internal node",
39902 SyntaxKind::TokenSingleLineDocComment
39903 ),
39904 }
39905 }
39906 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39907 match node.long(db).green.long(db).details {
39908 GreenNodeDetails::Token(_) => Some(Self { node }),
39909 GreenNodeDetails::Node { .. } => None,
39910 }
39911 }
39912 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39913 self.node
39914 }
39915 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39916 TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39917 }
39918}
39919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39920pub struct TokenWhitespace<'db> {
39921 node: SyntaxNode<'db>,
39922}
39923impl<'db> Token<'db> for TokenWhitespace<'db> {
39924 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39925 TokenWhitespaceGreen(
39926 GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39927 .intern(db),
39928 )
39929 }
39930 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39931 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39932 }
39933}
39934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39935pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39936impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39937 type SyntaxNode = TokenWhitespace<'db>;
39938 fn untyped(self) -> SyntaxStablePtrId<'db> {
39939 self.0
39940 }
39941 fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39942 TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39943 }
39944}
39945impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39946 fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39947 ptr.untyped()
39948 }
39949}
39950#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39951pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39952impl<'db> TokenWhitespaceGreen<'db> {
39953 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39954 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39955 }
39956}
39957impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39958 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39959 type StablePtr = TokenWhitespacePtr<'db>;
39960 type Green = TokenWhitespaceGreen<'db>;
39961 fn missing(db: &'db dyn Database) -> Self::Green {
39962 TokenWhitespaceGreen(
39963 GreenNode {
39964 kind: SyntaxKind::TokenMissing,
39965 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39966 }
39967 .intern(db),
39968 )
39969 }
39970 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39971 match node.long(db).green.long(db).details {
39972 GreenNodeDetails::Token(_) => Self { node },
39973 GreenNodeDetails::Node { .. } => {
39974 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39975 }
39976 }
39977 }
39978 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39979 match node.long(db).green.long(db).details {
39980 GreenNodeDetails::Token(_) => Some(Self { node }),
39981 GreenNodeDetails::Node { .. } => None,
39982 }
39983 }
39984 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39985 self.node
39986 }
39987 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39988 TokenWhitespacePtr(self.node.stable_ptr(db))
39989 }
39990}
39991#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39992pub struct TokenNewline<'db> {
39993 node: SyntaxNode<'db>,
39994}
39995impl<'db> Token<'db> for TokenNewline<'db> {
39996 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39997 TokenNewlineGreen(
39998 GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39999 .intern(db),
40000 )
40001 }
40002 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40003 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40004 }
40005}
40006#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40007pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
40008impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
40009 type SyntaxNode = TokenNewline<'db>;
40010 fn untyped(self) -> SyntaxStablePtrId<'db> {
40011 self.0
40012 }
40013 fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
40014 TokenNewline::from_syntax_node(db, self.0.lookup(db))
40015 }
40016}
40017impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
40018 fn from(ptr: TokenNewlinePtr<'db>) -> Self {
40019 ptr.untyped()
40020 }
40021}
40022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40023pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
40024impl<'db> TokenNewlineGreen<'db> {
40025 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40026 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40027 }
40028}
40029impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
40030 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
40031 type StablePtr = TokenNewlinePtr<'db>;
40032 type Green = TokenNewlineGreen<'db>;
40033 fn missing(db: &'db dyn Database) -> Self::Green {
40034 TokenNewlineGreen(
40035 GreenNode {
40036 kind: SyntaxKind::TokenMissing,
40037 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40038 }
40039 .intern(db),
40040 )
40041 }
40042 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40043 match node.long(db).green.long(db).details {
40044 GreenNodeDetails::Token(_) => Self { node },
40045 GreenNodeDetails::Node { .. } => {
40046 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
40047 }
40048 }
40049 }
40050 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40051 match node.long(db).green.long(db).details {
40052 GreenNodeDetails::Token(_) => Some(Self { node }),
40053 GreenNodeDetails::Node { .. } => None,
40054 }
40055 }
40056 fn as_syntax_node(&self) -> SyntaxNode<'db> {
40057 self.node
40058 }
40059 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40060 TokenNewlinePtr(self.node.stable_ptr(db))
40061 }
40062}
40063#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40064pub struct TokenMissing<'db> {
40065 node: SyntaxNode<'db>,
40066}
40067impl<'db> Token<'db> for TokenMissing<'db> {
40068 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
40069 TokenMissingGreen(
40070 GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
40071 .intern(db),
40072 )
40073 }
40074 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40075 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40076 }
40077}
40078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40079pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
40080impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
40081 type SyntaxNode = TokenMissing<'db>;
40082 fn untyped(self) -> SyntaxStablePtrId<'db> {
40083 self.0
40084 }
40085 fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
40086 TokenMissing::from_syntax_node(db, self.0.lookup(db))
40087 }
40088}
40089impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
40090 fn from(ptr: TokenMissingPtr<'db>) -> Self {
40091 ptr.untyped()
40092 }
40093}
40094#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40095pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
40096impl<'db> TokenMissingGreen<'db> {
40097 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40098 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40099 }
40100}
40101impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
40102 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
40103 type StablePtr = TokenMissingPtr<'db>;
40104 type Green = TokenMissingGreen<'db>;
40105 fn missing(db: &'db dyn Database) -> Self::Green {
40106 TokenMissingGreen(
40107 GreenNode {
40108 kind: SyntaxKind::TokenMissing,
40109 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40110 }
40111 .intern(db),
40112 )
40113 }
40114 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40115 match node.long(db).green.long(db).details {
40116 GreenNodeDetails::Token(_) => Self { node },
40117 GreenNodeDetails::Node { .. } => {
40118 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
40119 }
40120 }
40121 }
40122 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40123 match node.long(db).green.long(db).details {
40124 GreenNodeDetails::Token(_) => Some(Self { node }),
40125 GreenNodeDetails::Node { .. } => None,
40126 }
40127 }
40128 fn as_syntax_node(&self) -> SyntaxNode<'db> {
40129 self.node
40130 }
40131 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40132 TokenMissingPtr(self.node.stable_ptr(db))
40133 }
40134}
40135#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40136pub struct TokenSkipped<'db> {
40137 node: SyntaxNode<'db>,
40138}
40139impl<'db> Token<'db> for TokenSkipped<'db> {
40140 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
40141 TokenSkippedGreen(
40142 GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
40143 .intern(db),
40144 )
40145 }
40146 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40147 *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40148 }
40149}
40150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40151pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
40152impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
40153 type SyntaxNode = TokenSkipped<'db>;
40154 fn untyped(self) -> SyntaxStablePtrId<'db> {
40155 self.0
40156 }
40157 fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
40158 TokenSkipped::from_syntax_node(db, self.0.lookup(db))
40159 }
40160}
40161impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
40162 fn from(ptr: TokenSkippedPtr<'db>) -> Self {
40163 ptr.untyped()
40164 }
40165}
40166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40167pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
40168impl<'db> TokenSkippedGreen<'db> {
40169 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40170 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40171 }
40172}
40173impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
40174 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
40175 type StablePtr = TokenSkippedPtr<'db>;
40176 type Green = TokenSkippedGreen<'db>;
40177 fn missing(db: &'db dyn Database) -> Self::Green {
40178 TokenSkippedGreen(
40179 GreenNode {
40180 kind: SyntaxKind::TokenMissing,
40181 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40182 }
40183 .intern(db),
40184 )
40185 }
40186 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40187 match node.long(db).green.long(db).details {
40188 GreenNodeDetails::Token(_) => Self { node },
40189 GreenNodeDetails::Node { .. } => {
40190 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
40191 }
40192 }
40193 }
40194 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40195 match node.long(db).green.long(db).details {
40196 GreenNodeDetails::Token(_) => Some(Self { node }),
40197 GreenNodeDetails::Node { .. } => None,
40198 }
40199 }
40200 fn as_syntax_node(&self) -> SyntaxNode<'db> {
40201 self.node
40202 }
40203 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40204 TokenSkippedPtr(self.node.stable_ptr(db))
40205 }
40206}
40207#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40208pub enum TokenNode<'db> {
40209 TerminalIdentifier(TerminalIdentifier<'db>),
40210 TerminalLiteralNumber(TerminalLiteralNumber<'db>),
40211 TerminalShortString(TerminalShortString<'db>),
40212 TerminalString(TerminalString<'db>),
40213 TerminalAs(TerminalAs<'db>),
40214 TerminalConst(TerminalConst<'db>),
40215 TerminalElse(TerminalElse<'db>),
40216 TerminalEnum(TerminalEnum<'db>),
40217 TerminalExtern(TerminalExtern<'db>),
40218 TerminalFalse(TerminalFalse<'db>),
40219 TerminalFunction(TerminalFunction<'db>),
40220 TerminalIf(TerminalIf<'db>),
40221 TerminalWhile(TerminalWhile<'db>),
40222 TerminalFor(TerminalFor<'db>),
40223 TerminalLoop(TerminalLoop<'db>),
40224 TerminalImpl(TerminalImpl<'db>),
40225 TerminalImplicits(TerminalImplicits<'db>),
40226 TerminalLet(TerminalLet<'db>),
40227 TerminalMacro(TerminalMacro<'db>),
40228 TerminalMatch(TerminalMatch<'db>),
40229 TerminalModule(TerminalModule<'db>),
40230 TerminalMut(TerminalMut<'db>),
40231 TerminalNoPanic(TerminalNoPanic<'db>),
40232 TerminalOf(TerminalOf<'db>),
40233 TerminalRef(TerminalRef<'db>),
40234 TerminalContinue(TerminalContinue<'db>),
40235 TerminalReturn(TerminalReturn<'db>),
40236 TerminalBreak(TerminalBreak<'db>),
40237 TerminalStruct(TerminalStruct<'db>),
40238 TerminalTrait(TerminalTrait<'db>),
40239 TerminalTrue(TerminalTrue<'db>),
40240 TerminalType(TerminalType<'db>),
40241 TerminalUse(TerminalUse<'db>),
40242 TerminalPub(TerminalPub<'db>),
40243 TerminalAnd(TerminalAnd<'db>),
40244 TerminalAndAnd(TerminalAndAnd<'db>),
40245 TerminalArrow(TerminalArrow<'db>),
40246 TerminalAt(TerminalAt<'db>),
40247 TerminalBadCharacters(TerminalBadCharacters<'db>),
40248 TerminalColon(TerminalColon<'db>),
40249 TerminalColonColon(TerminalColonColon<'db>),
40250 TerminalComma(TerminalComma<'db>),
40251 TerminalDiv(TerminalDiv<'db>),
40252 TerminalDivEq(TerminalDivEq<'db>),
40253 TerminalDollar(TerminalDollar<'db>),
40254 TerminalDot(TerminalDot<'db>),
40255 TerminalDotDot(TerminalDotDot<'db>),
40256 TerminalDotDotEq(TerminalDotDotEq<'db>),
40257 TerminalEndOfFile(TerminalEndOfFile<'db>),
40258 TerminalEq(TerminalEq<'db>),
40259 TerminalEqEq(TerminalEqEq<'db>),
40260 TerminalGE(TerminalGE<'db>),
40261 TerminalGT(TerminalGT<'db>),
40262 TerminalHash(TerminalHash<'db>),
40263 TerminalLBrace(TerminalLBrace<'db>),
40264 TerminalLBrack(TerminalLBrack<'db>),
40265 TerminalLE(TerminalLE<'db>),
40266 TerminalLParen(TerminalLParen<'db>),
40267 TerminalLT(TerminalLT<'db>),
40268 TerminalMatchArrow(TerminalMatchArrow<'db>),
40269 TerminalMinus(TerminalMinus<'db>),
40270 TerminalMinusEq(TerminalMinusEq<'db>),
40271 TerminalMod(TerminalMod<'db>),
40272 TerminalModEq(TerminalModEq<'db>),
40273 TerminalMul(TerminalMul<'db>),
40274 TerminalMulEq(TerminalMulEq<'db>),
40275 TerminalNeq(TerminalNeq<'db>),
40276 TerminalNot(TerminalNot<'db>),
40277 TerminalBitNot(TerminalBitNot<'db>),
40278 TerminalOr(TerminalOr<'db>),
40279 TerminalOrOr(TerminalOrOr<'db>),
40280 TerminalPlus(TerminalPlus<'db>),
40281 TerminalPlusEq(TerminalPlusEq<'db>),
40282 TerminalQuestionMark(TerminalQuestionMark<'db>),
40283 TerminalRBrace(TerminalRBrace<'db>),
40284 TerminalRBrack(TerminalRBrack<'db>),
40285 TerminalRParen(TerminalRParen<'db>),
40286 TerminalSemicolon(TerminalSemicolon<'db>),
40287 TerminalUnderscore(TerminalUnderscore<'db>),
40288 TerminalXor(TerminalXor<'db>),
40289 TerminalEmpty(TerminalEmpty<'db>),
40290}
40291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40292pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
40293impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
40294 type SyntaxNode = TokenNode<'db>;
40295 fn untyped(self) -> SyntaxStablePtrId<'db> {
40296 self.0
40297 }
40298 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
40299 TokenNode::from_syntax_node(db, self.0.lookup(db))
40300 }
40301}
40302impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
40303 fn from(ptr: TokenNodePtr<'db>) -> Self {
40304 ptr.untyped()
40305 }
40306}
40307impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
40308 fn from(value: TerminalIdentifierPtr<'db>) -> Self {
40309 Self(value.0)
40310 }
40311}
40312impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
40313 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
40314 Self(value.0)
40315 }
40316}
40317impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
40318 fn from(value: TerminalShortStringPtr<'db>) -> Self {
40319 Self(value.0)
40320 }
40321}
40322impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
40323 fn from(value: TerminalStringPtr<'db>) -> Self {
40324 Self(value.0)
40325 }
40326}
40327impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
40328 fn from(value: TerminalAsPtr<'db>) -> Self {
40329 Self(value.0)
40330 }
40331}
40332impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
40333 fn from(value: TerminalConstPtr<'db>) -> Self {
40334 Self(value.0)
40335 }
40336}
40337impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
40338 fn from(value: TerminalElsePtr<'db>) -> Self {
40339 Self(value.0)
40340 }
40341}
40342impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
40343 fn from(value: TerminalEnumPtr<'db>) -> Self {
40344 Self(value.0)
40345 }
40346}
40347impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
40348 fn from(value: TerminalExternPtr<'db>) -> Self {
40349 Self(value.0)
40350 }
40351}
40352impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
40353 fn from(value: TerminalFalsePtr<'db>) -> Self {
40354 Self(value.0)
40355 }
40356}
40357impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
40358 fn from(value: TerminalFunctionPtr<'db>) -> Self {
40359 Self(value.0)
40360 }
40361}
40362impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
40363 fn from(value: TerminalIfPtr<'db>) -> Self {
40364 Self(value.0)
40365 }
40366}
40367impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
40368 fn from(value: TerminalWhilePtr<'db>) -> Self {
40369 Self(value.0)
40370 }
40371}
40372impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
40373 fn from(value: TerminalForPtr<'db>) -> Self {
40374 Self(value.0)
40375 }
40376}
40377impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
40378 fn from(value: TerminalLoopPtr<'db>) -> Self {
40379 Self(value.0)
40380 }
40381}
40382impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
40383 fn from(value: TerminalImplPtr<'db>) -> Self {
40384 Self(value.0)
40385 }
40386}
40387impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
40388 fn from(value: TerminalImplicitsPtr<'db>) -> Self {
40389 Self(value.0)
40390 }
40391}
40392impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
40393 fn from(value: TerminalLetPtr<'db>) -> Self {
40394 Self(value.0)
40395 }
40396}
40397impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
40398 fn from(value: TerminalMacroPtr<'db>) -> Self {
40399 Self(value.0)
40400 }
40401}
40402impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
40403 fn from(value: TerminalMatchPtr<'db>) -> Self {
40404 Self(value.0)
40405 }
40406}
40407impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
40408 fn from(value: TerminalModulePtr<'db>) -> Self {
40409 Self(value.0)
40410 }
40411}
40412impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
40413 fn from(value: TerminalMutPtr<'db>) -> Self {
40414 Self(value.0)
40415 }
40416}
40417impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
40418 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
40419 Self(value.0)
40420 }
40421}
40422impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
40423 fn from(value: TerminalOfPtr<'db>) -> Self {
40424 Self(value.0)
40425 }
40426}
40427impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
40428 fn from(value: TerminalRefPtr<'db>) -> Self {
40429 Self(value.0)
40430 }
40431}
40432impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
40433 fn from(value: TerminalContinuePtr<'db>) -> Self {
40434 Self(value.0)
40435 }
40436}
40437impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
40438 fn from(value: TerminalReturnPtr<'db>) -> Self {
40439 Self(value.0)
40440 }
40441}
40442impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
40443 fn from(value: TerminalBreakPtr<'db>) -> Self {
40444 Self(value.0)
40445 }
40446}
40447impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
40448 fn from(value: TerminalStructPtr<'db>) -> Self {
40449 Self(value.0)
40450 }
40451}
40452impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
40453 fn from(value: TerminalTraitPtr<'db>) -> Self {
40454 Self(value.0)
40455 }
40456}
40457impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
40458 fn from(value: TerminalTruePtr<'db>) -> Self {
40459 Self(value.0)
40460 }
40461}
40462impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
40463 fn from(value: TerminalTypePtr<'db>) -> Self {
40464 Self(value.0)
40465 }
40466}
40467impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
40468 fn from(value: TerminalUsePtr<'db>) -> Self {
40469 Self(value.0)
40470 }
40471}
40472impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
40473 fn from(value: TerminalPubPtr<'db>) -> Self {
40474 Self(value.0)
40475 }
40476}
40477impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40478 fn from(value: TerminalAndPtr<'db>) -> Self {
40479 Self(value.0)
40480 }
40481}
40482impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40483 fn from(value: TerminalAndAndPtr<'db>) -> Self {
40484 Self(value.0)
40485 }
40486}
40487impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40488 fn from(value: TerminalArrowPtr<'db>) -> Self {
40489 Self(value.0)
40490 }
40491}
40492impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40493 fn from(value: TerminalAtPtr<'db>) -> Self {
40494 Self(value.0)
40495 }
40496}
40497impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40498 fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40499 Self(value.0)
40500 }
40501}
40502impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40503 fn from(value: TerminalColonPtr<'db>) -> Self {
40504 Self(value.0)
40505 }
40506}
40507impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40508 fn from(value: TerminalColonColonPtr<'db>) -> Self {
40509 Self(value.0)
40510 }
40511}
40512impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40513 fn from(value: TerminalCommaPtr<'db>) -> Self {
40514 Self(value.0)
40515 }
40516}
40517impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40518 fn from(value: TerminalDivPtr<'db>) -> Self {
40519 Self(value.0)
40520 }
40521}
40522impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40523 fn from(value: TerminalDivEqPtr<'db>) -> Self {
40524 Self(value.0)
40525 }
40526}
40527impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40528 fn from(value: TerminalDollarPtr<'db>) -> Self {
40529 Self(value.0)
40530 }
40531}
40532impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40533 fn from(value: TerminalDotPtr<'db>) -> Self {
40534 Self(value.0)
40535 }
40536}
40537impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40538 fn from(value: TerminalDotDotPtr<'db>) -> Self {
40539 Self(value.0)
40540 }
40541}
40542impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40543 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40544 Self(value.0)
40545 }
40546}
40547impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40548 fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40549 Self(value.0)
40550 }
40551}
40552impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40553 fn from(value: TerminalEqPtr<'db>) -> Self {
40554 Self(value.0)
40555 }
40556}
40557impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40558 fn from(value: TerminalEqEqPtr<'db>) -> Self {
40559 Self(value.0)
40560 }
40561}
40562impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40563 fn from(value: TerminalGEPtr<'db>) -> Self {
40564 Self(value.0)
40565 }
40566}
40567impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40568 fn from(value: TerminalGTPtr<'db>) -> Self {
40569 Self(value.0)
40570 }
40571}
40572impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40573 fn from(value: TerminalHashPtr<'db>) -> Self {
40574 Self(value.0)
40575 }
40576}
40577impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40578 fn from(value: TerminalLBracePtr<'db>) -> Self {
40579 Self(value.0)
40580 }
40581}
40582impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40583 fn from(value: TerminalLBrackPtr<'db>) -> Self {
40584 Self(value.0)
40585 }
40586}
40587impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40588 fn from(value: TerminalLEPtr<'db>) -> Self {
40589 Self(value.0)
40590 }
40591}
40592impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40593 fn from(value: TerminalLParenPtr<'db>) -> Self {
40594 Self(value.0)
40595 }
40596}
40597impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40598 fn from(value: TerminalLTPtr<'db>) -> Self {
40599 Self(value.0)
40600 }
40601}
40602impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40603 fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40604 Self(value.0)
40605 }
40606}
40607impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40608 fn from(value: TerminalMinusPtr<'db>) -> Self {
40609 Self(value.0)
40610 }
40611}
40612impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40613 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40614 Self(value.0)
40615 }
40616}
40617impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40618 fn from(value: TerminalModPtr<'db>) -> Self {
40619 Self(value.0)
40620 }
40621}
40622impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40623 fn from(value: TerminalModEqPtr<'db>) -> Self {
40624 Self(value.0)
40625 }
40626}
40627impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40628 fn from(value: TerminalMulPtr<'db>) -> Self {
40629 Self(value.0)
40630 }
40631}
40632impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40633 fn from(value: TerminalMulEqPtr<'db>) -> Self {
40634 Self(value.0)
40635 }
40636}
40637impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40638 fn from(value: TerminalNeqPtr<'db>) -> Self {
40639 Self(value.0)
40640 }
40641}
40642impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40643 fn from(value: TerminalNotPtr<'db>) -> Self {
40644 Self(value.0)
40645 }
40646}
40647impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40648 fn from(value: TerminalBitNotPtr<'db>) -> Self {
40649 Self(value.0)
40650 }
40651}
40652impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40653 fn from(value: TerminalOrPtr<'db>) -> Self {
40654 Self(value.0)
40655 }
40656}
40657impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40658 fn from(value: TerminalOrOrPtr<'db>) -> Self {
40659 Self(value.0)
40660 }
40661}
40662impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40663 fn from(value: TerminalPlusPtr<'db>) -> Self {
40664 Self(value.0)
40665 }
40666}
40667impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40668 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40669 Self(value.0)
40670 }
40671}
40672impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40673 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40674 Self(value.0)
40675 }
40676}
40677impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40678 fn from(value: TerminalRBracePtr<'db>) -> Self {
40679 Self(value.0)
40680 }
40681}
40682impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40683 fn from(value: TerminalRBrackPtr<'db>) -> Self {
40684 Self(value.0)
40685 }
40686}
40687impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40688 fn from(value: TerminalRParenPtr<'db>) -> Self {
40689 Self(value.0)
40690 }
40691}
40692impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40693 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40694 Self(value.0)
40695 }
40696}
40697impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40698 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40699 Self(value.0)
40700 }
40701}
40702impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40703 fn from(value: TerminalXorPtr<'db>) -> Self {
40704 Self(value.0)
40705 }
40706}
40707impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40708 fn from(value: TerminalEmptyPtr<'db>) -> Self {
40709 Self(value.0)
40710 }
40711}
40712impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40713 fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40714 Self(value.0)
40715 }
40716}
40717impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40718 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40719 Self(value.0)
40720 }
40721}
40722impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40723 fn from(value: TerminalShortStringGreen<'db>) -> Self {
40724 Self(value.0)
40725 }
40726}
40727impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40728 fn from(value: TerminalStringGreen<'db>) -> Self {
40729 Self(value.0)
40730 }
40731}
40732impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40733 fn from(value: TerminalAsGreen<'db>) -> Self {
40734 Self(value.0)
40735 }
40736}
40737impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40738 fn from(value: TerminalConstGreen<'db>) -> Self {
40739 Self(value.0)
40740 }
40741}
40742impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40743 fn from(value: TerminalElseGreen<'db>) -> Self {
40744 Self(value.0)
40745 }
40746}
40747impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40748 fn from(value: TerminalEnumGreen<'db>) -> Self {
40749 Self(value.0)
40750 }
40751}
40752impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40753 fn from(value: TerminalExternGreen<'db>) -> Self {
40754 Self(value.0)
40755 }
40756}
40757impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40758 fn from(value: TerminalFalseGreen<'db>) -> Self {
40759 Self(value.0)
40760 }
40761}
40762impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40763 fn from(value: TerminalFunctionGreen<'db>) -> Self {
40764 Self(value.0)
40765 }
40766}
40767impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40768 fn from(value: TerminalIfGreen<'db>) -> Self {
40769 Self(value.0)
40770 }
40771}
40772impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40773 fn from(value: TerminalWhileGreen<'db>) -> Self {
40774 Self(value.0)
40775 }
40776}
40777impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40778 fn from(value: TerminalForGreen<'db>) -> Self {
40779 Self(value.0)
40780 }
40781}
40782impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40783 fn from(value: TerminalLoopGreen<'db>) -> Self {
40784 Self(value.0)
40785 }
40786}
40787impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40788 fn from(value: TerminalImplGreen<'db>) -> Self {
40789 Self(value.0)
40790 }
40791}
40792impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40793 fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40794 Self(value.0)
40795 }
40796}
40797impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40798 fn from(value: TerminalLetGreen<'db>) -> Self {
40799 Self(value.0)
40800 }
40801}
40802impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40803 fn from(value: TerminalMacroGreen<'db>) -> Self {
40804 Self(value.0)
40805 }
40806}
40807impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40808 fn from(value: TerminalMatchGreen<'db>) -> Self {
40809 Self(value.0)
40810 }
40811}
40812impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40813 fn from(value: TerminalModuleGreen<'db>) -> Self {
40814 Self(value.0)
40815 }
40816}
40817impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40818 fn from(value: TerminalMutGreen<'db>) -> Self {
40819 Self(value.0)
40820 }
40821}
40822impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40823 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40824 Self(value.0)
40825 }
40826}
40827impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40828 fn from(value: TerminalOfGreen<'db>) -> Self {
40829 Self(value.0)
40830 }
40831}
40832impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40833 fn from(value: TerminalRefGreen<'db>) -> Self {
40834 Self(value.0)
40835 }
40836}
40837impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40838 fn from(value: TerminalContinueGreen<'db>) -> Self {
40839 Self(value.0)
40840 }
40841}
40842impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40843 fn from(value: TerminalReturnGreen<'db>) -> Self {
40844 Self(value.0)
40845 }
40846}
40847impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40848 fn from(value: TerminalBreakGreen<'db>) -> Self {
40849 Self(value.0)
40850 }
40851}
40852impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40853 fn from(value: TerminalStructGreen<'db>) -> Self {
40854 Self(value.0)
40855 }
40856}
40857impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40858 fn from(value: TerminalTraitGreen<'db>) -> Self {
40859 Self(value.0)
40860 }
40861}
40862impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40863 fn from(value: TerminalTrueGreen<'db>) -> Self {
40864 Self(value.0)
40865 }
40866}
40867impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40868 fn from(value: TerminalTypeGreen<'db>) -> Self {
40869 Self(value.0)
40870 }
40871}
40872impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40873 fn from(value: TerminalUseGreen<'db>) -> Self {
40874 Self(value.0)
40875 }
40876}
40877impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40878 fn from(value: TerminalPubGreen<'db>) -> Self {
40879 Self(value.0)
40880 }
40881}
40882impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40883 fn from(value: TerminalAndGreen<'db>) -> Self {
40884 Self(value.0)
40885 }
40886}
40887impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40888 fn from(value: TerminalAndAndGreen<'db>) -> Self {
40889 Self(value.0)
40890 }
40891}
40892impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40893 fn from(value: TerminalArrowGreen<'db>) -> Self {
40894 Self(value.0)
40895 }
40896}
40897impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40898 fn from(value: TerminalAtGreen<'db>) -> Self {
40899 Self(value.0)
40900 }
40901}
40902impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40903 fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40904 Self(value.0)
40905 }
40906}
40907impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40908 fn from(value: TerminalColonGreen<'db>) -> Self {
40909 Self(value.0)
40910 }
40911}
40912impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40913 fn from(value: TerminalColonColonGreen<'db>) -> Self {
40914 Self(value.0)
40915 }
40916}
40917impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40918 fn from(value: TerminalCommaGreen<'db>) -> Self {
40919 Self(value.0)
40920 }
40921}
40922impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40923 fn from(value: TerminalDivGreen<'db>) -> Self {
40924 Self(value.0)
40925 }
40926}
40927impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40928 fn from(value: TerminalDivEqGreen<'db>) -> Self {
40929 Self(value.0)
40930 }
40931}
40932impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40933 fn from(value: TerminalDollarGreen<'db>) -> Self {
40934 Self(value.0)
40935 }
40936}
40937impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40938 fn from(value: TerminalDotGreen<'db>) -> Self {
40939 Self(value.0)
40940 }
40941}
40942impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40943 fn from(value: TerminalDotDotGreen<'db>) -> Self {
40944 Self(value.0)
40945 }
40946}
40947impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40948 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40949 Self(value.0)
40950 }
40951}
40952impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40953 fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40954 Self(value.0)
40955 }
40956}
40957impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40958 fn from(value: TerminalEqGreen<'db>) -> Self {
40959 Self(value.0)
40960 }
40961}
40962impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40963 fn from(value: TerminalEqEqGreen<'db>) -> Self {
40964 Self(value.0)
40965 }
40966}
40967impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40968 fn from(value: TerminalGEGreen<'db>) -> Self {
40969 Self(value.0)
40970 }
40971}
40972impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40973 fn from(value: TerminalGTGreen<'db>) -> Self {
40974 Self(value.0)
40975 }
40976}
40977impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40978 fn from(value: TerminalHashGreen<'db>) -> Self {
40979 Self(value.0)
40980 }
40981}
40982impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40983 fn from(value: TerminalLBraceGreen<'db>) -> Self {
40984 Self(value.0)
40985 }
40986}
40987impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40988 fn from(value: TerminalLBrackGreen<'db>) -> Self {
40989 Self(value.0)
40990 }
40991}
40992impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40993 fn from(value: TerminalLEGreen<'db>) -> Self {
40994 Self(value.0)
40995 }
40996}
40997impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40998 fn from(value: TerminalLParenGreen<'db>) -> Self {
40999 Self(value.0)
41000 }
41001}
41002impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
41003 fn from(value: TerminalLTGreen<'db>) -> Self {
41004 Self(value.0)
41005 }
41006}
41007impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
41008 fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
41009 Self(value.0)
41010 }
41011}
41012impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
41013 fn from(value: TerminalMinusGreen<'db>) -> Self {
41014 Self(value.0)
41015 }
41016}
41017impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
41018 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
41019 Self(value.0)
41020 }
41021}
41022impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
41023 fn from(value: TerminalModGreen<'db>) -> Self {
41024 Self(value.0)
41025 }
41026}
41027impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
41028 fn from(value: TerminalModEqGreen<'db>) -> Self {
41029 Self(value.0)
41030 }
41031}
41032impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
41033 fn from(value: TerminalMulGreen<'db>) -> Self {
41034 Self(value.0)
41035 }
41036}
41037impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
41038 fn from(value: TerminalMulEqGreen<'db>) -> Self {
41039 Self(value.0)
41040 }
41041}
41042impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
41043 fn from(value: TerminalNeqGreen<'db>) -> Self {
41044 Self(value.0)
41045 }
41046}
41047impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
41048 fn from(value: TerminalNotGreen<'db>) -> Self {
41049 Self(value.0)
41050 }
41051}
41052impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
41053 fn from(value: TerminalBitNotGreen<'db>) -> Self {
41054 Self(value.0)
41055 }
41056}
41057impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
41058 fn from(value: TerminalOrGreen<'db>) -> Self {
41059 Self(value.0)
41060 }
41061}
41062impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
41063 fn from(value: TerminalOrOrGreen<'db>) -> Self {
41064 Self(value.0)
41065 }
41066}
41067impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
41068 fn from(value: TerminalPlusGreen<'db>) -> Self {
41069 Self(value.0)
41070 }
41071}
41072impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
41073 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
41074 Self(value.0)
41075 }
41076}
41077impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
41078 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
41079 Self(value.0)
41080 }
41081}
41082impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
41083 fn from(value: TerminalRBraceGreen<'db>) -> Self {
41084 Self(value.0)
41085 }
41086}
41087impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
41088 fn from(value: TerminalRBrackGreen<'db>) -> Self {
41089 Self(value.0)
41090 }
41091}
41092impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
41093 fn from(value: TerminalRParenGreen<'db>) -> Self {
41094 Self(value.0)
41095 }
41096}
41097impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
41098 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
41099 Self(value.0)
41100 }
41101}
41102impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
41103 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
41104 Self(value.0)
41105 }
41106}
41107impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
41108 fn from(value: TerminalXorGreen<'db>) -> Self {
41109 Self(value.0)
41110 }
41111}
41112impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
41113 fn from(value: TerminalEmptyGreen<'db>) -> Self {
41114 Self(value.0)
41115 }
41116}
41117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
41118pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
41119impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
41120 const OPTIONAL_KIND: Option<SyntaxKind> = None;
41121 type StablePtr = TokenNodePtr<'db>;
41122 type Green = TokenNodeGreen<'db>;
41123 fn missing(db: &'db dyn Database) -> Self::Green {
41124 panic!("No missing variant.");
41125 }
41126 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
41127 let kind = node.kind(db);
41128 match kind {
41129 SyntaxKind::TerminalIdentifier => {
41130 TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
41131 }
41132 SyntaxKind::TerminalLiteralNumber => {
41133 TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
41134 }
41135 SyntaxKind::TerminalShortString => {
41136 TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
41137 }
41138 SyntaxKind::TerminalString => {
41139 TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
41140 }
41141 SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
41142 SyntaxKind::TerminalConst => {
41143 TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
41144 }
41145 SyntaxKind::TerminalElse => {
41146 TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
41147 }
41148 SyntaxKind::TerminalEnum => {
41149 TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
41150 }
41151 SyntaxKind::TerminalExtern => {
41152 TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
41153 }
41154 SyntaxKind::TerminalFalse => {
41155 TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
41156 }
41157 SyntaxKind::TerminalFunction => {
41158 TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
41159 }
41160 SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
41161 SyntaxKind::TerminalWhile => {
41162 TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
41163 }
41164 SyntaxKind::TerminalFor => {
41165 TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
41166 }
41167 SyntaxKind::TerminalLoop => {
41168 TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
41169 }
41170 SyntaxKind::TerminalImpl => {
41171 TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
41172 }
41173 SyntaxKind::TerminalImplicits => {
41174 TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
41175 }
41176 SyntaxKind::TerminalLet => {
41177 TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
41178 }
41179 SyntaxKind::TerminalMacro => {
41180 TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
41181 }
41182 SyntaxKind::TerminalMatch => {
41183 TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
41184 }
41185 SyntaxKind::TerminalModule => {
41186 TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
41187 }
41188 SyntaxKind::TerminalMut => {
41189 TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
41190 }
41191 SyntaxKind::TerminalNoPanic => {
41192 TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
41193 }
41194 SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
41195 SyntaxKind::TerminalRef => {
41196 TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
41197 }
41198 SyntaxKind::TerminalContinue => {
41199 TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
41200 }
41201 SyntaxKind::TerminalReturn => {
41202 TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
41203 }
41204 SyntaxKind::TerminalBreak => {
41205 TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
41206 }
41207 SyntaxKind::TerminalStruct => {
41208 TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
41209 }
41210 SyntaxKind::TerminalTrait => {
41211 TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
41212 }
41213 SyntaxKind::TerminalTrue => {
41214 TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
41215 }
41216 SyntaxKind::TerminalType => {
41217 TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
41218 }
41219 SyntaxKind::TerminalUse => {
41220 TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
41221 }
41222 SyntaxKind::TerminalPub => {
41223 TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
41224 }
41225 SyntaxKind::TerminalAnd => {
41226 TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
41227 }
41228 SyntaxKind::TerminalAndAnd => {
41229 TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
41230 }
41231 SyntaxKind::TerminalArrow => {
41232 TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
41233 }
41234 SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
41235 SyntaxKind::TerminalBadCharacters => {
41236 TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
41237 }
41238 SyntaxKind::TerminalColon => {
41239 TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
41240 }
41241 SyntaxKind::TerminalColonColon => {
41242 TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
41243 }
41244 SyntaxKind::TerminalComma => {
41245 TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
41246 }
41247 SyntaxKind::TerminalDiv => {
41248 TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
41249 }
41250 SyntaxKind::TerminalDivEq => {
41251 TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
41252 }
41253 SyntaxKind::TerminalDollar => {
41254 TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
41255 }
41256 SyntaxKind::TerminalDot => {
41257 TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
41258 }
41259 SyntaxKind::TerminalDotDot => {
41260 TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
41261 }
41262 SyntaxKind::TerminalDotDotEq => {
41263 TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
41264 }
41265 SyntaxKind::TerminalEndOfFile => {
41266 TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
41267 }
41268 SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
41269 SyntaxKind::TerminalEqEq => {
41270 TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
41271 }
41272 SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
41273 SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
41274 SyntaxKind::TerminalHash => {
41275 TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
41276 }
41277 SyntaxKind::TerminalLBrace => {
41278 TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
41279 }
41280 SyntaxKind::TerminalLBrack => {
41281 TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
41282 }
41283 SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
41284 SyntaxKind::TerminalLParen => {
41285 TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
41286 }
41287 SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
41288 SyntaxKind::TerminalMatchArrow => {
41289 TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
41290 }
41291 SyntaxKind::TerminalMinus => {
41292 TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
41293 }
41294 SyntaxKind::TerminalMinusEq => {
41295 TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
41296 }
41297 SyntaxKind::TerminalMod => {
41298 TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
41299 }
41300 SyntaxKind::TerminalModEq => {
41301 TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
41302 }
41303 SyntaxKind::TerminalMul => {
41304 TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
41305 }
41306 SyntaxKind::TerminalMulEq => {
41307 TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
41308 }
41309 SyntaxKind::TerminalNeq => {
41310 TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
41311 }
41312 SyntaxKind::TerminalNot => {
41313 TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
41314 }
41315 SyntaxKind::TerminalBitNot => {
41316 TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
41317 }
41318 SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
41319 SyntaxKind::TerminalOrOr => {
41320 TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
41321 }
41322 SyntaxKind::TerminalPlus => {
41323 TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
41324 }
41325 SyntaxKind::TerminalPlusEq => {
41326 TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
41327 }
41328 SyntaxKind::TerminalQuestionMark => {
41329 TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
41330 }
41331 SyntaxKind::TerminalRBrace => {
41332 TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
41333 }
41334 SyntaxKind::TerminalRBrack => {
41335 TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
41336 }
41337 SyntaxKind::TerminalRParen => {
41338 TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
41339 }
41340 SyntaxKind::TerminalSemicolon => {
41341 TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
41342 }
41343 SyntaxKind::TerminalUnderscore => {
41344 TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
41345 }
41346 SyntaxKind::TerminalXor => {
41347 TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
41348 }
41349 SyntaxKind::TerminalEmpty => {
41350 TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
41351 }
41352 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
41353 }
41354 }
41355 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
41356 let kind = node.kind(db);
41357 match kind {
41358 SyntaxKind::TerminalIdentifier => {
41359 Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
41360 }
41361 SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
41362 TerminalLiteralNumber::from_syntax_node(db, node),
41363 )),
41364 SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
41365 TerminalShortString::from_syntax_node(db, node),
41366 )),
41367 SyntaxKind::TerminalString => {
41368 Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
41369 }
41370 SyntaxKind::TerminalAs => {
41371 Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
41372 }
41373 SyntaxKind::TerminalConst => {
41374 Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
41375 }
41376 SyntaxKind::TerminalElse => {
41377 Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
41378 }
41379 SyntaxKind::TerminalEnum => {
41380 Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
41381 }
41382 SyntaxKind::TerminalExtern => {
41383 Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
41384 }
41385 SyntaxKind::TerminalFalse => {
41386 Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
41387 }
41388 SyntaxKind::TerminalFunction => {
41389 Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
41390 }
41391 SyntaxKind::TerminalIf => {
41392 Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
41393 }
41394 SyntaxKind::TerminalWhile => {
41395 Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
41396 }
41397 SyntaxKind::TerminalFor => {
41398 Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
41399 }
41400 SyntaxKind::TerminalLoop => {
41401 Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
41402 }
41403 SyntaxKind::TerminalImpl => {
41404 Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
41405 }
41406 SyntaxKind::TerminalImplicits => {
41407 Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
41408 }
41409 SyntaxKind::TerminalLet => {
41410 Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
41411 }
41412 SyntaxKind::TerminalMacro => {
41413 Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
41414 }
41415 SyntaxKind::TerminalMatch => {
41416 Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
41417 }
41418 SyntaxKind::TerminalModule => {
41419 Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
41420 }
41421 SyntaxKind::TerminalMut => {
41422 Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
41423 }
41424 SyntaxKind::TerminalNoPanic => {
41425 Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
41426 }
41427 SyntaxKind::TerminalOf => {
41428 Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
41429 }
41430 SyntaxKind::TerminalRef => {
41431 Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
41432 }
41433 SyntaxKind::TerminalContinue => {
41434 Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
41435 }
41436 SyntaxKind::TerminalReturn => {
41437 Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
41438 }
41439 SyntaxKind::TerminalBreak => {
41440 Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
41441 }
41442 SyntaxKind::TerminalStruct => {
41443 Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
41444 }
41445 SyntaxKind::TerminalTrait => {
41446 Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
41447 }
41448 SyntaxKind::TerminalTrue => {
41449 Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
41450 }
41451 SyntaxKind::TerminalType => {
41452 Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
41453 }
41454 SyntaxKind::TerminalUse => {
41455 Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
41456 }
41457 SyntaxKind::TerminalPub => {
41458 Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
41459 }
41460 SyntaxKind::TerminalAnd => {
41461 Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
41462 }
41463 SyntaxKind::TerminalAndAnd => {
41464 Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
41465 }
41466 SyntaxKind::TerminalArrow => {
41467 Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
41468 }
41469 SyntaxKind::TerminalAt => {
41470 Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
41471 }
41472 SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
41473 TerminalBadCharacters::from_syntax_node(db, node),
41474 )),
41475 SyntaxKind::TerminalColon => {
41476 Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41477 }
41478 SyntaxKind::TerminalColonColon => {
41479 Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41480 }
41481 SyntaxKind::TerminalComma => {
41482 Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41483 }
41484 SyntaxKind::TerminalDiv => {
41485 Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41486 }
41487 SyntaxKind::TerminalDivEq => {
41488 Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41489 }
41490 SyntaxKind::TerminalDollar => {
41491 Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41492 }
41493 SyntaxKind::TerminalDot => {
41494 Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41495 }
41496 SyntaxKind::TerminalDotDot => {
41497 Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41498 }
41499 SyntaxKind::TerminalDotDotEq => {
41500 Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41501 }
41502 SyntaxKind::TerminalEndOfFile => {
41503 Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41504 }
41505 SyntaxKind::TerminalEq => {
41506 Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41507 }
41508 SyntaxKind::TerminalEqEq => {
41509 Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41510 }
41511 SyntaxKind::TerminalGE => {
41512 Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41513 }
41514 SyntaxKind::TerminalGT => {
41515 Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41516 }
41517 SyntaxKind::TerminalHash => {
41518 Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41519 }
41520 SyntaxKind::TerminalLBrace => {
41521 Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41522 }
41523 SyntaxKind::TerminalLBrack => {
41524 Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41525 }
41526 SyntaxKind::TerminalLE => {
41527 Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41528 }
41529 SyntaxKind::TerminalLParen => {
41530 Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41531 }
41532 SyntaxKind::TerminalLT => {
41533 Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41534 }
41535 SyntaxKind::TerminalMatchArrow => {
41536 Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41537 }
41538 SyntaxKind::TerminalMinus => {
41539 Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41540 }
41541 SyntaxKind::TerminalMinusEq => {
41542 Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41543 }
41544 SyntaxKind::TerminalMod => {
41545 Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41546 }
41547 SyntaxKind::TerminalModEq => {
41548 Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41549 }
41550 SyntaxKind::TerminalMul => {
41551 Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41552 }
41553 SyntaxKind::TerminalMulEq => {
41554 Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41555 }
41556 SyntaxKind::TerminalNeq => {
41557 Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41558 }
41559 SyntaxKind::TerminalNot => {
41560 Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41561 }
41562 SyntaxKind::TerminalBitNot => {
41563 Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41564 }
41565 SyntaxKind::TerminalOr => {
41566 Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41567 }
41568 SyntaxKind::TerminalOrOr => {
41569 Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41570 }
41571 SyntaxKind::TerminalPlus => {
41572 Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41573 }
41574 SyntaxKind::TerminalPlusEq => {
41575 Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41576 }
41577 SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41578 TerminalQuestionMark::from_syntax_node(db, node),
41579 )),
41580 SyntaxKind::TerminalRBrace => {
41581 Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41582 }
41583 SyntaxKind::TerminalRBrack => {
41584 Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41585 }
41586 SyntaxKind::TerminalRParen => {
41587 Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41588 }
41589 SyntaxKind::TerminalSemicolon => {
41590 Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41591 }
41592 SyntaxKind::TerminalUnderscore => {
41593 Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41594 }
41595 SyntaxKind::TerminalXor => {
41596 Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41597 }
41598 SyntaxKind::TerminalEmpty => {
41599 Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41600 }
41601 _ => None,
41602 }
41603 }
41604 fn as_syntax_node(&self) -> SyntaxNode<'db> {
41605 match self {
41606 TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41607 TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41608 TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41609 TokenNode::TerminalString(x) => x.as_syntax_node(),
41610 TokenNode::TerminalAs(x) => x.as_syntax_node(),
41611 TokenNode::TerminalConst(x) => x.as_syntax_node(),
41612 TokenNode::TerminalElse(x) => x.as_syntax_node(),
41613 TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41614 TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41615 TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41616 TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41617 TokenNode::TerminalIf(x) => x.as_syntax_node(),
41618 TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41619 TokenNode::TerminalFor(x) => x.as_syntax_node(),
41620 TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41621 TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41622 TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41623 TokenNode::TerminalLet(x) => x.as_syntax_node(),
41624 TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41625 TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41626 TokenNode::TerminalModule(x) => x.as_syntax_node(),
41627 TokenNode::TerminalMut(x) => x.as_syntax_node(),
41628 TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41629 TokenNode::TerminalOf(x) => x.as_syntax_node(),
41630 TokenNode::TerminalRef(x) => x.as_syntax_node(),
41631 TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41632 TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41633 TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41634 TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41635 TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41636 TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41637 TokenNode::TerminalType(x) => x.as_syntax_node(),
41638 TokenNode::TerminalUse(x) => x.as_syntax_node(),
41639 TokenNode::TerminalPub(x) => x.as_syntax_node(),
41640 TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41641 TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41642 TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41643 TokenNode::TerminalAt(x) => x.as_syntax_node(),
41644 TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41645 TokenNode::TerminalColon(x) => x.as_syntax_node(),
41646 TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41647 TokenNode::TerminalComma(x) => x.as_syntax_node(),
41648 TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41649 TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41650 TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41651 TokenNode::TerminalDot(x) => x.as_syntax_node(),
41652 TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41653 TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41654 TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41655 TokenNode::TerminalEq(x) => x.as_syntax_node(),
41656 TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41657 TokenNode::TerminalGE(x) => x.as_syntax_node(),
41658 TokenNode::TerminalGT(x) => x.as_syntax_node(),
41659 TokenNode::TerminalHash(x) => x.as_syntax_node(),
41660 TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41661 TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41662 TokenNode::TerminalLE(x) => x.as_syntax_node(),
41663 TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41664 TokenNode::TerminalLT(x) => x.as_syntax_node(),
41665 TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41666 TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41667 TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41668 TokenNode::TerminalMod(x) => x.as_syntax_node(),
41669 TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41670 TokenNode::TerminalMul(x) => x.as_syntax_node(),
41671 TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41672 TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41673 TokenNode::TerminalNot(x) => x.as_syntax_node(),
41674 TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41675 TokenNode::TerminalOr(x) => x.as_syntax_node(),
41676 TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41677 TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41678 TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41679 TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41680 TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41681 TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41682 TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41683 TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41684 TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41685 TokenNode::TerminalXor(x) => x.as_syntax_node(),
41686 TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41687 }
41688 }
41689 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41690 TokenNodePtr(self.as_syntax_node().long(db).stable_ptr)
41691 }
41692}
41693impl<'db> TokenNode<'db> {
41694 pub fn is_variant(kind: SyntaxKind) -> bool {
41696 matches!(
41697 kind,
41698 SyntaxKind::TerminalIdentifier
41699 | SyntaxKind::TerminalLiteralNumber
41700 | SyntaxKind::TerminalShortString
41701 | SyntaxKind::TerminalString
41702 | SyntaxKind::TerminalAs
41703 | SyntaxKind::TerminalConst
41704 | SyntaxKind::TerminalElse
41705 | SyntaxKind::TerminalEnum
41706 | SyntaxKind::TerminalExtern
41707 | SyntaxKind::TerminalFalse
41708 | SyntaxKind::TerminalFunction
41709 | SyntaxKind::TerminalIf
41710 | SyntaxKind::TerminalWhile
41711 | SyntaxKind::TerminalFor
41712 | SyntaxKind::TerminalLoop
41713 | SyntaxKind::TerminalImpl
41714 | SyntaxKind::TerminalImplicits
41715 | SyntaxKind::TerminalLet
41716 | SyntaxKind::TerminalMacro
41717 | SyntaxKind::TerminalMatch
41718 | SyntaxKind::TerminalModule
41719 | SyntaxKind::TerminalMut
41720 | SyntaxKind::TerminalNoPanic
41721 | SyntaxKind::TerminalOf
41722 | SyntaxKind::TerminalRef
41723 | SyntaxKind::TerminalContinue
41724 | SyntaxKind::TerminalReturn
41725 | SyntaxKind::TerminalBreak
41726 | SyntaxKind::TerminalStruct
41727 | SyntaxKind::TerminalTrait
41728 | SyntaxKind::TerminalTrue
41729 | SyntaxKind::TerminalType
41730 | SyntaxKind::TerminalUse
41731 | SyntaxKind::TerminalPub
41732 | SyntaxKind::TerminalAnd
41733 | SyntaxKind::TerminalAndAnd
41734 | SyntaxKind::TerminalArrow
41735 | SyntaxKind::TerminalAt
41736 | SyntaxKind::TerminalBadCharacters
41737 | SyntaxKind::TerminalColon
41738 | SyntaxKind::TerminalColonColon
41739 | SyntaxKind::TerminalComma
41740 | SyntaxKind::TerminalDiv
41741 | SyntaxKind::TerminalDivEq
41742 | SyntaxKind::TerminalDollar
41743 | SyntaxKind::TerminalDot
41744 | SyntaxKind::TerminalDotDot
41745 | SyntaxKind::TerminalDotDotEq
41746 | SyntaxKind::TerminalEndOfFile
41747 | SyntaxKind::TerminalEq
41748 | SyntaxKind::TerminalEqEq
41749 | SyntaxKind::TerminalGE
41750 | SyntaxKind::TerminalGT
41751 | SyntaxKind::TerminalHash
41752 | SyntaxKind::TerminalLBrace
41753 | SyntaxKind::TerminalLBrack
41754 | SyntaxKind::TerminalLE
41755 | SyntaxKind::TerminalLParen
41756 | SyntaxKind::TerminalLT
41757 | SyntaxKind::TerminalMatchArrow
41758 | SyntaxKind::TerminalMinus
41759 | SyntaxKind::TerminalMinusEq
41760 | SyntaxKind::TerminalMod
41761 | SyntaxKind::TerminalModEq
41762 | SyntaxKind::TerminalMul
41763 | SyntaxKind::TerminalMulEq
41764 | SyntaxKind::TerminalNeq
41765 | SyntaxKind::TerminalNot
41766 | SyntaxKind::TerminalBitNot
41767 | SyntaxKind::TerminalOr
41768 | SyntaxKind::TerminalOrOr
41769 | SyntaxKind::TerminalPlus
41770 | SyntaxKind::TerminalPlusEq
41771 | SyntaxKind::TerminalQuestionMark
41772 | SyntaxKind::TerminalRBrace
41773 | SyntaxKind::TerminalRBrack
41774 | SyntaxKind::TerminalRParen
41775 | SyntaxKind::TerminalSemicolon
41776 | SyntaxKind::TerminalUnderscore
41777 | SyntaxKind::TerminalXor
41778 | SyntaxKind::TerminalEmpty
41779 )
41780 }
41781}