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_proc_macros::HeapSize;
11use cairo_lang_utils::{Intern, extract_matches};
12use salsa::Database;
13
14use super::element_list::ElementList;
15use super::green::GreenNodeDetails;
16use super::kind::SyntaxKind;
17use super::{
18 GreenId, GreenNode, SyntaxNode, SyntaxStablePtrId, Terminal, Token, TypedStablePtr,
19 TypedSyntaxNode,
20};
21#[path = "ast_ext.rs"]
22mod ast_ext;
23#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24pub struct Trivia<'db>(ElementList<'db, Trivium<'db>, 1>);
25impl<'db> Deref for Trivia<'db> {
26 type Target = ElementList<'db, Trivium<'db>, 1>;
27 fn deref(&self) -> &Self::Target {
28 &self.0
29 }
30}
31impl<'db> Trivia<'db> {
32 pub fn new_green(db: &'db dyn Database, children: &[TriviumGreen<'db>]) -> TriviaGreen<'db> {
33 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
34 TriviaGreen(
35 GreenNode {
36 kind: SyntaxKind::Trivia,
37 details: GreenNodeDetails::Node {
38 children: children.iter().map(|x| x.0).collect(),
39 width,
40 },
41 }
42 .intern(db),
43 )
44 }
45}
46#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
47pub struct TriviaPtr<'db>(pub SyntaxStablePtrId<'db>);
48impl<'db> TypedStablePtr<'db> for TriviaPtr<'db> {
49 type SyntaxNode = Trivia<'db>;
50 fn untyped(self) -> SyntaxStablePtrId<'db> {
51 self.0
52 }
53 fn lookup(&self, db: &'db dyn Database) -> Trivia<'db> {
54 Trivia::from_syntax_node(db, self.0.lookup(db))
55 }
56}
57impl<'db> From<TriviaPtr<'db>> for SyntaxStablePtrId<'db> {
58 fn from(ptr: TriviaPtr<'db>) -> Self {
59 ptr.untyped()
60 }
61}
62#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
63pub struct TriviaGreen<'db>(pub GreenId<'db>);
64impl<'db> TypedSyntaxNode<'db> for Trivia<'db> {
65 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
66 type StablePtr = TriviaPtr<'db>;
67 type Green = TriviaGreen<'db>;
68 fn missing(db: &'db dyn Database) -> Self::Green {
69 TriviaGreen(
70 GreenNode {
71 kind: SyntaxKind::Trivia,
72 details: GreenNodeDetails::Node {
73 children: [].into(),
74 width: TextWidth::default(),
75 },
76 }
77 .intern(db),
78 )
79 }
80 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
81 Self(ElementList::new(node))
82 }
83 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
84 if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
85 }
86 fn as_syntax_node(&self) -> SyntaxNode<'db> {
87 self.node
88 }
89 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
90 TriviaPtr(self.node.stable_ptr(db))
91 }
92}
93#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
94pub enum Trivium<'db> {
95 SingleLineComment(TokenSingleLineComment<'db>),
96 SingleLineDocComment(TokenSingleLineDocComment<'db>),
97 SingleLineInnerComment(TokenSingleLineInnerComment<'db>),
98 Whitespace(TokenWhitespace<'db>),
99 Newline(TokenNewline<'db>),
100 Skipped(TokenSkipped<'db>),
101 SkippedNode(TriviumSkippedNode<'db>),
102}
103#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
104pub struct TriviumPtr<'db>(pub SyntaxStablePtrId<'db>);
105impl<'db> TypedStablePtr<'db> for TriviumPtr<'db> {
106 type SyntaxNode = Trivium<'db>;
107 fn untyped(self) -> SyntaxStablePtrId<'db> {
108 self.0
109 }
110 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
111 Trivium::from_syntax_node(db, self.0.lookup(db))
112 }
113}
114impl<'db> From<TriviumPtr<'db>> for SyntaxStablePtrId<'db> {
115 fn from(ptr: TriviumPtr<'db>) -> Self {
116 ptr.untyped()
117 }
118}
119impl<'db> From<TokenSingleLineCommentPtr<'db>> for TriviumPtr<'db> {
120 fn from(value: TokenSingleLineCommentPtr<'db>) -> Self {
121 Self(value.0)
122 }
123}
124impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for TriviumPtr<'db> {
125 fn from(value: TokenSingleLineDocCommentPtr<'db>) -> Self {
126 Self(value.0)
127 }
128}
129impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for TriviumPtr<'db> {
130 fn from(value: TokenSingleLineInnerCommentPtr<'db>) -> Self {
131 Self(value.0)
132 }
133}
134impl<'db> From<TokenWhitespacePtr<'db>> for TriviumPtr<'db> {
135 fn from(value: TokenWhitespacePtr<'db>) -> Self {
136 Self(value.0)
137 }
138}
139impl<'db> From<TokenNewlinePtr<'db>> for TriviumPtr<'db> {
140 fn from(value: TokenNewlinePtr<'db>) -> Self {
141 Self(value.0)
142 }
143}
144impl<'db> From<TokenSkippedPtr<'db>> for TriviumPtr<'db> {
145 fn from(value: TokenSkippedPtr<'db>) -> Self {
146 Self(value.0)
147 }
148}
149impl<'db> From<TriviumSkippedNodePtr<'db>> for TriviumPtr<'db> {
150 fn from(value: TriviumSkippedNodePtr<'db>) -> Self {
151 Self(value.0)
152 }
153}
154impl<'db> From<TokenSingleLineCommentGreen<'db>> for TriviumGreen<'db> {
155 fn from(value: TokenSingleLineCommentGreen<'db>) -> Self {
156 Self(value.0)
157 }
158}
159impl<'db> From<TokenSingleLineDocCommentGreen<'db>> for TriviumGreen<'db> {
160 fn from(value: TokenSingleLineDocCommentGreen<'db>) -> Self {
161 Self(value.0)
162 }
163}
164impl<'db> From<TokenSingleLineInnerCommentGreen<'db>> for TriviumGreen<'db> {
165 fn from(value: TokenSingleLineInnerCommentGreen<'db>) -> Self {
166 Self(value.0)
167 }
168}
169impl<'db> From<TokenWhitespaceGreen<'db>> for TriviumGreen<'db> {
170 fn from(value: TokenWhitespaceGreen<'db>) -> Self {
171 Self(value.0)
172 }
173}
174impl<'db> From<TokenNewlineGreen<'db>> for TriviumGreen<'db> {
175 fn from(value: TokenNewlineGreen<'db>) -> Self {
176 Self(value.0)
177 }
178}
179impl<'db> From<TokenSkippedGreen<'db>> for TriviumGreen<'db> {
180 fn from(value: TokenSkippedGreen<'db>) -> Self {
181 Self(value.0)
182 }
183}
184impl<'db> From<TriviumSkippedNodeGreen<'db>> for TriviumGreen<'db> {
185 fn from(value: TriviumSkippedNodeGreen<'db>) -> Self {
186 Self(value.0)
187 }
188}
189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
190pub struct TriviumGreen<'db>(pub GreenId<'db>);
191impl<'db> TypedSyntaxNode<'db> for Trivium<'db> {
192 const OPTIONAL_KIND: Option<SyntaxKind> = None;
193 type StablePtr = TriviumPtr<'db>;
194 type Green = TriviumGreen<'db>;
195 fn missing(db: &'db dyn Database) -> Self::Green {
196 panic!("No missing variant.");
197 }
198 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
199 let kind = node.kind(db);
200 match kind {
201 SyntaxKind::TokenSingleLineComment => {
202 Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
203 }
204 SyntaxKind::TokenSingleLineDocComment => {
205 Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
206 }
207 SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
208 TokenSingleLineInnerComment::from_syntax_node(db, node),
209 ),
210 SyntaxKind::TokenWhitespace => {
211 Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
212 }
213 SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
214 SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
215 SyntaxKind::TriviumSkippedNode => {
216 Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
217 }
218 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
219 }
220 }
221 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
222 let kind = node.kind(db);
223 match kind {
224 SyntaxKind::TokenSingleLineComment => {
225 Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
226 }
227 SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
228 TokenSingleLineDocComment::from_syntax_node(db, node),
229 )),
230 SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
231 TokenSingleLineInnerComment::from_syntax_node(db, node),
232 )),
233 SyntaxKind::TokenWhitespace => {
234 Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
235 }
236 SyntaxKind::TokenNewline => {
237 Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
238 }
239 SyntaxKind::TokenSkipped => {
240 Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
241 }
242 SyntaxKind::TriviumSkippedNode => {
243 Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
244 }
245 _ => None,
246 }
247 }
248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
249 match self {
250 Trivium::SingleLineComment(x) => x.as_syntax_node(),
251 Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
252 Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
253 Trivium::Whitespace(x) => x.as_syntax_node(),
254 Trivium::Newline(x) => x.as_syntax_node(),
255 Trivium::Skipped(x) => x.as_syntax_node(),
256 Trivium::SkippedNode(x) => x.as_syntax_node(),
257 }
258 }
259 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
260 TriviumPtr(self.as_syntax_node().stable_ptr(db))
261 }
262}
263impl<'db> Trivium<'db> {
264 pub fn is_variant(kind: SyntaxKind) -> bool {
266 matches!(
267 kind,
268 SyntaxKind::TokenSingleLineComment
269 | SyntaxKind::TokenSingleLineDocComment
270 | SyntaxKind::TokenSingleLineInnerComment
271 | SyntaxKind::TokenWhitespace
272 | SyntaxKind::TokenNewline
273 | SyntaxKind::TokenSkipped
274 | SyntaxKind::TriviumSkippedNode
275 )
276 }
277}
278#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
279pub enum Expr<'db> {
280 Path(ExprPath<'db>),
281 Literal(TerminalLiteralNumber<'db>),
282 ShortString(TerminalShortString<'db>),
283 String(TerminalString<'db>),
284 False(TerminalFalse<'db>),
285 True(TerminalTrue<'db>),
286 Parenthesized(ExprParenthesized<'db>),
287 Unary(ExprUnary<'db>),
288 Binary(ExprBinary<'db>),
289 Tuple(ExprListParenthesized<'db>),
290 FunctionCall(ExprFunctionCall<'db>),
291 StructCtorCall(ExprStructCtorCall<'db>),
292 Block(ExprBlock<'db>),
293 Match(ExprMatch<'db>),
294 If(ExprIf<'db>),
295 Loop(ExprLoop<'db>),
296 While(ExprWhile<'db>),
297 For(ExprFor<'db>),
298 Closure(ExprClosure<'db>),
299 ErrorPropagate(ExprErrorPropagate<'db>),
300 FieldInitShorthand(ExprFieldInitShorthand<'db>),
301 Indexed(ExprIndexed<'db>),
302 InlineMacro(ExprInlineMacro<'db>),
303 FixedSizeArray(ExprFixedSizeArray<'db>),
304 Underscore(TerminalUnderscore<'db>),
305 Missing(ExprMissing<'db>),
306}
307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
308pub struct ExprPtr<'db>(pub SyntaxStablePtrId<'db>);
309impl<'db> TypedStablePtr<'db> for ExprPtr<'db> {
310 type SyntaxNode = Expr<'db>;
311 fn untyped(self) -> SyntaxStablePtrId<'db> {
312 self.0
313 }
314 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
315 Expr::from_syntax_node(db, self.0.lookup(db))
316 }
317}
318impl<'db> From<ExprPtr<'db>> for SyntaxStablePtrId<'db> {
319 fn from(ptr: ExprPtr<'db>) -> Self {
320 ptr.untyped()
321 }
322}
323impl<'db> From<ExprPathPtr<'db>> for ExprPtr<'db> {
324 fn from(value: ExprPathPtr<'db>) -> Self {
325 Self(value.0)
326 }
327}
328impl<'db> From<TerminalLiteralNumberPtr<'db>> for ExprPtr<'db> {
329 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
330 Self(value.0)
331 }
332}
333impl<'db> From<TerminalShortStringPtr<'db>> for ExprPtr<'db> {
334 fn from(value: TerminalShortStringPtr<'db>) -> Self {
335 Self(value.0)
336 }
337}
338impl<'db> From<TerminalStringPtr<'db>> for ExprPtr<'db> {
339 fn from(value: TerminalStringPtr<'db>) -> Self {
340 Self(value.0)
341 }
342}
343impl<'db> From<TerminalFalsePtr<'db>> for ExprPtr<'db> {
344 fn from(value: TerminalFalsePtr<'db>) -> Self {
345 Self(value.0)
346 }
347}
348impl<'db> From<TerminalTruePtr<'db>> for ExprPtr<'db> {
349 fn from(value: TerminalTruePtr<'db>) -> Self {
350 Self(value.0)
351 }
352}
353impl<'db> From<ExprParenthesizedPtr<'db>> for ExprPtr<'db> {
354 fn from(value: ExprParenthesizedPtr<'db>) -> Self {
355 Self(value.0)
356 }
357}
358impl<'db> From<ExprUnaryPtr<'db>> for ExprPtr<'db> {
359 fn from(value: ExprUnaryPtr<'db>) -> Self {
360 Self(value.0)
361 }
362}
363impl<'db> From<ExprBinaryPtr<'db>> for ExprPtr<'db> {
364 fn from(value: ExprBinaryPtr<'db>) -> Self {
365 Self(value.0)
366 }
367}
368impl<'db> From<ExprListParenthesizedPtr<'db>> for ExprPtr<'db> {
369 fn from(value: ExprListParenthesizedPtr<'db>) -> Self {
370 Self(value.0)
371 }
372}
373impl<'db> From<ExprFunctionCallPtr<'db>> for ExprPtr<'db> {
374 fn from(value: ExprFunctionCallPtr<'db>) -> Self {
375 Self(value.0)
376 }
377}
378impl<'db> From<ExprStructCtorCallPtr<'db>> for ExprPtr<'db> {
379 fn from(value: ExprStructCtorCallPtr<'db>) -> Self {
380 Self(value.0)
381 }
382}
383impl<'db> From<ExprBlockPtr<'db>> for ExprPtr<'db> {
384 fn from(value: ExprBlockPtr<'db>) -> Self {
385 Self(value.0)
386 }
387}
388impl<'db> From<ExprMatchPtr<'db>> for ExprPtr<'db> {
389 fn from(value: ExprMatchPtr<'db>) -> Self {
390 Self(value.0)
391 }
392}
393impl<'db> From<ExprIfPtr<'db>> for ExprPtr<'db> {
394 fn from(value: ExprIfPtr<'db>) -> Self {
395 Self(value.0)
396 }
397}
398impl<'db> From<ExprLoopPtr<'db>> for ExprPtr<'db> {
399 fn from(value: ExprLoopPtr<'db>) -> Self {
400 Self(value.0)
401 }
402}
403impl<'db> From<ExprWhilePtr<'db>> for ExprPtr<'db> {
404 fn from(value: ExprWhilePtr<'db>) -> Self {
405 Self(value.0)
406 }
407}
408impl<'db> From<ExprForPtr<'db>> for ExprPtr<'db> {
409 fn from(value: ExprForPtr<'db>) -> Self {
410 Self(value.0)
411 }
412}
413impl<'db> From<ExprClosurePtr<'db>> for ExprPtr<'db> {
414 fn from(value: ExprClosurePtr<'db>) -> Self {
415 Self(value.0)
416 }
417}
418impl<'db> From<ExprErrorPropagatePtr<'db>> for ExprPtr<'db> {
419 fn from(value: ExprErrorPropagatePtr<'db>) -> Self {
420 Self(value.0)
421 }
422}
423impl<'db> From<ExprFieldInitShorthandPtr<'db>> for ExprPtr<'db> {
424 fn from(value: ExprFieldInitShorthandPtr<'db>) -> Self {
425 Self(value.0)
426 }
427}
428impl<'db> From<ExprIndexedPtr<'db>> for ExprPtr<'db> {
429 fn from(value: ExprIndexedPtr<'db>) -> Self {
430 Self(value.0)
431 }
432}
433impl<'db> From<ExprInlineMacroPtr<'db>> for ExprPtr<'db> {
434 fn from(value: ExprInlineMacroPtr<'db>) -> Self {
435 Self(value.0)
436 }
437}
438impl<'db> From<ExprFixedSizeArrayPtr<'db>> for ExprPtr<'db> {
439 fn from(value: ExprFixedSizeArrayPtr<'db>) -> Self {
440 Self(value.0)
441 }
442}
443impl<'db> From<TerminalUnderscorePtr<'db>> for ExprPtr<'db> {
444 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
445 Self(value.0)
446 }
447}
448impl<'db> From<ExprMissingPtr<'db>> for ExprPtr<'db> {
449 fn from(value: ExprMissingPtr<'db>) -> Self {
450 Self(value.0)
451 }
452}
453impl<'db> From<ExprPathGreen<'db>> for ExprGreen<'db> {
454 fn from(value: ExprPathGreen<'db>) -> Self {
455 Self(value.0)
456 }
457}
458impl<'db> From<TerminalLiteralNumberGreen<'db>> for ExprGreen<'db> {
459 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
460 Self(value.0)
461 }
462}
463impl<'db> From<TerminalShortStringGreen<'db>> for ExprGreen<'db> {
464 fn from(value: TerminalShortStringGreen<'db>) -> Self {
465 Self(value.0)
466 }
467}
468impl<'db> From<TerminalStringGreen<'db>> for ExprGreen<'db> {
469 fn from(value: TerminalStringGreen<'db>) -> Self {
470 Self(value.0)
471 }
472}
473impl<'db> From<TerminalFalseGreen<'db>> for ExprGreen<'db> {
474 fn from(value: TerminalFalseGreen<'db>) -> Self {
475 Self(value.0)
476 }
477}
478impl<'db> From<TerminalTrueGreen<'db>> for ExprGreen<'db> {
479 fn from(value: TerminalTrueGreen<'db>) -> Self {
480 Self(value.0)
481 }
482}
483impl<'db> From<ExprParenthesizedGreen<'db>> for ExprGreen<'db> {
484 fn from(value: ExprParenthesizedGreen<'db>) -> Self {
485 Self(value.0)
486 }
487}
488impl<'db> From<ExprUnaryGreen<'db>> for ExprGreen<'db> {
489 fn from(value: ExprUnaryGreen<'db>) -> Self {
490 Self(value.0)
491 }
492}
493impl<'db> From<ExprBinaryGreen<'db>> for ExprGreen<'db> {
494 fn from(value: ExprBinaryGreen<'db>) -> Self {
495 Self(value.0)
496 }
497}
498impl<'db> From<ExprListParenthesizedGreen<'db>> for ExprGreen<'db> {
499 fn from(value: ExprListParenthesizedGreen<'db>) -> Self {
500 Self(value.0)
501 }
502}
503impl<'db> From<ExprFunctionCallGreen<'db>> for ExprGreen<'db> {
504 fn from(value: ExprFunctionCallGreen<'db>) -> Self {
505 Self(value.0)
506 }
507}
508impl<'db> From<ExprStructCtorCallGreen<'db>> for ExprGreen<'db> {
509 fn from(value: ExprStructCtorCallGreen<'db>) -> Self {
510 Self(value.0)
511 }
512}
513impl<'db> From<ExprBlockGreen<'db>> for ExprGreen<'db> {
514 fn from(value: ExprBlockGreen<'db>) -> Self {
515 Self(value.0)
516 }
517}
518impl<'db> From<ExprMatchGreen<'db>> for ExprGreen<'db> {
519 fn from(value: ExprMatchGreen<'db>) -> Self {
520 Self(value.0)
521 }
522}
523impl<'db> From<ExprIfGreen<'db>> for ExprGreen<'db> {
524 fn from(value: ExprIfGreen<'db>) -> Self {
525 Self(value.0)
526 }
527}
528impl<'db> From<ExprLoopGreen<'db>> for ExprGreen<'db> {
529 fn from(value: ExprLoopGreen<'db>) -> Self {
530 Self(value.0)
531 }
532}
533impl<'db> From<ExprWhileGreen<'db>> for ExprGreen<'db> {
534 fn from(value: ExprWhileGreen<'db>) -> Self {
535 Self(value.0)
536 }
537}
538impl<'db> From<ExprForGreen<'db>> for ExprGreen<'db> {
539 fn from(value: ExprForGreen<'db>) -> Self {
540 Self(value.0)
541 }
542}
543impl<'db> From<ExprClosureGreen<'db>> for ExprGreen<'db> {
544 fn from(value: ExprClosureGreen<'db>) -> Self {
545 Self(value.0)
546 }
547}
548impl<'db> From<ExprErrorPropagateGreen<'db>> for ExprGreen<'db> {
549 fn from(value: ExprErrorPropagateGreen<'db>) -> Self {
550 Self(value.0)
551 }
552}
553impl<'db> From<ExprFieldInitShorthandGreen<'db>> for ExprGreen<'db> {
554 fn from(value: ExprFieldInitShorthandGreen<'db>) -> Self {
555 Self(value.0)
556 }
557}
558impl<'db> From<ExprIndexedGreen<'db>> for ExprGreen<'db> {
559 fn from(value: ExprIndexedGreen<'db>) -> Self {
560 Self(value.0)
561 }
562}
563impl<'db> From<ExprInlineMacroGreen<'db>> for ExprGreen<'db> {
564 fn from(value: ExprInlineMacroGreen<'db>) -> Self {
565 Self(value.0)
566 }
567}
568impl<'db> From<ExprFixedSizeArrayGreen<'db>> for ExprGreen<'db> {
569 fn from(value: ExprFixedSizeArrayGreen<'db>) -> Self {
570 Self(value.0)
571 }
572}
573impl<'db> From<TerminalUnderscoreGreen<'db>> for ExprGreen<'db> {
574 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
575 Self(value.0)
576 }
577}
578impl<'db> From<ExprMissingGreen<'db>> for ExprGreen<'db> {
579 fn from(value: ExprMissingGreen<'db>) -> Self {
580 Self(value.0)
581 }
582}
583#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
584pub struct ExprGreen<'db>(pub GreenId<'db>);
585impl<'db> TypedSyntaxNode<'db> for Expr<'db> {
586 const OPTIONAL_KIND: Option<SyntaxKind> = None;
587 type StablePtr = ExprPtr<'db>;
588 type Green = ExprGreen<'db>;
589 fn missing(db: &'db dyn Database) -> Self::Green {
590 ExprGreen(ExprMissing::missing(db).0)
591 }
592 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
593 let kind = node.kind(db);
594 match kind {
595 SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
596 SyntaxKind::TerminalLiteralNumber => {
597 Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
598 }
599 SyntaxKind::TerminalShortString => {
600 Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
601 }
602 SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
603 SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
604 SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
605 SyntaxKind::ExprParenthesized => {
606 Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
607 }
608 SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
609 SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
610 SyntaxKind::ExprListParenthesized => {
611 Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
612 }
613 SyntaxKind::ExprFunctionCall => {
614 Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
615 }
616 SyntaxKind::ExprStructCtorCall => {
617 Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
618 }
619 SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
620 SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
621 SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
622 SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
623 SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
624 SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
625 SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
626 SyntaxKind::ExprErrorPropagate => {
627 Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
628 }
629 SyntaxKind::ExprFieldInitShorthand => {
630 Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
631 }
632 SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
633 SyntaxKind::ExprInlineMacro => {
634 Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
635 }
636 SyntaxKind::ExprFixedSizeArray => {
637 Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
638 }
639 SyntaxKind::TerminalUnderscore => {
640 Expr::Underscore(TerminalUnderscore::from_syntax_node(db, node))
641 }
642 SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
643 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
644 }
645 }
646 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
647 let kind = node.kind(db);
648 match kind {
649 SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
650 SyntaxKind::TerminalLiteralNumber => {
651 Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
652 }
653 SyntaxKind::TerminalShortString => {
654 Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
655 }
656 SyntaxKind::TerminalString => {
657 Some(Expr::String(TerminalString::from_syntax_node(db, node)))
658 }
659 SyntaxKind::TerminalFalse => {
660 Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
661 }
662 SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
663 SyntaxKind::ExprParenthesized => {
664 Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
665 }
666 SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
667 SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
668 SyntaxKind::ExprListParenthesized => {
669 Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
670 }
671 SyntaxKind::ExprFunctionCall => {
672 Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
673 }
674 SyntaxKind::ExprStructCtorCall => {
675 Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
676 }
677 SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
678 SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
679 SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
680 SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
681 SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
682 SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
683 SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
684 SyntaxKind::ExprErrorPropagate => {
685 Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
686 }
687 SyntaxKind::ExprFieldInitShorthand => {
688 Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
689 }
690 SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
691 SyntaxKind::ExprInlineMacro => {
692 Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
693 }
694 SyntaxKind::ExprFixedSizeArray => {
695 Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
696 }
697 SyntaxKind::TerminalUnderscore => {
698 Some(Expr::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
699 }
700 SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
701 _ => None,
702 }
703 }
704 fn as_syntax_node(&self) -> SyntaxNode<'db> {
705 match self {
706 Expr::Path(x) => x.as_syntax_node(),
707 Expr::Literal(x) => x.as_syntax_node(),
708 Expr::ShortString(x) => x.as_syntax_node(),
709 Expr::String(x) => x.as_syntax_node(),
710 Expr::False(x) => x.as_syntax_node(),
711 Expr::True(x) => x.as_syntax_node(),
712 Expr::Parenthesized(x) => x.as_syntax_node(),
713 Expr::Unary(x) => x.as_syntax_node(),
714 Expr::Binary(x) => x.as_syntax_node(),
715 Expr::Tuple(x) => x.as_syntax_node(),
716 Expr::FunctionCall(x) => x.as_syntax_node(),
717 Expr::StructCtorCall(x) => x.as_syntax_node(),
718 Expr::Block(x) => x.as_syntax_node(),
719 Expr::Match(x) => x.as_syntax_node(),
720 Expr::If(x) => x.as_syntax_node(),
721 Expr::Loop(x) => x.as_syntax_node(),
722 Expr::While(x) => x.as_syntax_node(),
723 Expr::For(x) => x.as_syntax_node(),
724 Expr::Closure(x) => x.as_syntax_node(),
725 Expr::ErrorPropagate(x) => x.as_syntax_node(),
726 Expr::FieldInitShorthand(x) => x.as_syntax_node(),
727 Expr::Indexed(x) => x.as_syntax_node(),
728 Expr::InlineMacro(x) => x.as_syntax_node(),
729 Expr::FixedSizeArray(x) => x.as_syntax_node(),
730 Expr::Underscore(x) => x.as_syntax_node(),
731 Expr::Missing(x) => x.as_syntax_node(),
732 }
733 }
734 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
735 ExprPtr(self.as_syntax_node().stable_ptr(db))
736 }
737}
738impl<'db> Expr<'db> {
739 pub fn is_variant(kind: SyntaxKind) -> bool {
741 matches!(
742 kind,
743 SyntaxKind::ExprPath
744 | SyntaxKind::TerminalLiteralNumber
745 | SyntaxKind::TerminalShortString
746 | SyntaxKind::TerminalString
747 | SyntaxKind::TerminalFalse
748 | SyntaxKind::TerminalTrue
749 | SyntaxKind::ExprParenthesized
750 | SyntaxKind::ExprUnary
751 | SyntaxKind::ExprBinary
752 | SyntaxKind::ExprListParenthesized
753 | SyntaxKind::ExprFunctionCall
754 | SyntaxKind::ExprStructCtorCall
755 | SyntaxKind::ExprBlock
756 | SyntaxKind::ExprMatch
757 | SyntaxKind::ExprIf
758 | SyntaxKind::ExprLoop
759 | SyntaxKind::ExprWhile
760 | SyntaxKind::ExprFor
761 | SyntaxKind::ExprClosure
762 | SyntaxKind::ExprErrorPropagate
763 | SyntaxKind::ExprFieldInitShorthand
764 | SyntaxKind::ExprIndexed
765 | SyntaxKind::ExprInlineMacro
766 | SyntaxKind::ExprFixedSizeArray
767 | SyntaxKind::TerminalUnderscore
768 | SyntaxKind::ExprMissing
769 )
770 }
771}
772#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
773pub struct ExprList<'db>(ElementList<'db, Expr<'db>, 2>);
774impl<'db> Deref for ExprList<'db> {
775 type Target = ElementList<'db, Expr<'db>, 2>;
776 fn deref(&self) -> &Self::Target {
777 &self.0
778 }
779}
780impl<'db> ExprList<'db> {
781 pub fn new_green(
782 db: &'db dyn Database,
783 children: &[ExprListElementOrSeparatorGreen<'db>],
784 ) -> ExprListGreen<'db> {
785 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
786 ExprListGreen(
787 GreenNode {
788 kind: SyntaxKind::ExprList,
789 details: GreenNodeDetails::Node {
790 children: children.iter().map(|x| x.id()).collect(),
791 width,
792 },
793 }
794 .intern(db),
795 )
796 }
797}
798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
799pub struct ExprListPtr<'db>(pub SyntaxStablePtrId<'db>);
800impl<'db> TypedStablePtr<'db> for ExprListPtr<'db> {
801 type SyntaxNode = ExprList<'db>;
802 fn untyped(self) -> SyntaxStablePtrId<'db> {
803 self.0
804 }
805 fn lookup(&self, db: &'db dyn Database) -> ExprList<'db> {
806 ExprList::from_syntax_node(db, self.0.lookup(db))
807 }
808}
809impl<'db> From<ExprListPtr<'db>> for SyntaxStablePtrId<'db> {
810 fn from(ptr: ExprListPtr<'db>) -> Self {
811 ptr.untyped()
812 }
813}
814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
815pub enum ExprListElementOrSeparatorGreen<'db> {
816 Separator(TerminalCommaGreen<'db>),
817 Element(ExprGreen<'db>),
818}
819impl<'db> From<TerminalCommaGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
820 fn from(value: TerminalCommaGreen<'db>) -> Self {
821 ExprListElementOrSeparatorGreen::Separator(value)
822 }
823}
824impl<'db> From<ExprGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
825 fn from(value: ExprGreen<'db>) -> Self {
826 ExprListElementOrSeparatorGreen::Element(value)
827 }
828}
829impl<'db> ExprListElementOrSeparatorGreen<'db> {
830 fn id(&self) -> GreenId<'db> {
831 match self {
832 ExprListElementOrSeparatorGreen::Separator(green) => green.0,
833 ExprListElementOrSeparatorGreen::Element(green) => green.0,
834 }
835 }
836}
837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
838pub struct ExprListGreen<'db>(pub GreenId<'db>);
839impl<'db> TypedSyntaxNode<'db> for ExprList<'db> {
840 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
841 type StablePtr = ExprListPtr<'db>;
842 type Green = ExprListGreen<'db>;
843 fn missing(db: &'db dyn Database) -> Self::Green {
844 ExprListGreen(
845 GreenNode {
846 kind: SyntaxKind::ExprList,
847 details: GreenNodeDetails::Node {
848 children: [].into(),
849 width: TextWidth::default(),
850 },
851 }
852 .intern(db),
853 )
854 }
855 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
856 Self(ElementList::new(node))
857 }
858 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
859 if node.kind(db) == SyntaxKind::ExprList {
860 Some(Self(ElementList::new(node)))
861 } else {
862 None
863 }
864 }
865 fn as_syntax_node(&self) -> SyntaxNode<'db> {
866 self.node
867 }
868 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
869 ExprListPtr(self.node.stable_ptr(db))
870 }
871}
872#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
873pub struct Arg<'db> {
874 node: SyntaxNode<'db>,
875}
876impl<'db> Arg<'db> {
877 pub const INDEX_MODIFIERS: usize = 0;
878 pub const INDEX_ARG_CLAUSE: usize = 1;
879 pub fn new_green(
880 db: &'db dyn Database,
881 modifiers: ModifierListGreen<'db>,
882 arg_clause: ArgClauseGreen<'db>,
883 ) -> ArgGreen<'db> {
884 let children = [modifiers.0, arg_clause.0];
885 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
886 ArgGreen(
887 GreenNode {
888 kind: SyntaxKind::Arg,
889 details: GreenNodeDetails::Node { children: children.into(), width },
890 }
891 .intern(db),
892 )
893 }
894}
895impl<'db> Arg<'db> {
896 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
897 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
898 }
899 pub fn arg_clause(&self, db: &'db dyn Database) -> ArgClause<'db> {
900 ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
901 }
902}
903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
904pub struct ArgPtr<'db>(pub SyntaxStablePtrId<'db>);
905impl<'db> ArgPtr<'db> {}
906impl<'db> TypedStablePtr<'db> for ArgPtr<'db> {
907 type SyntaxNode = Arg<'db>;
908 fn untyped(self) -> SyntaxStablePtrId<'db> {
909 self.0
910 }
911 fn lookup(&self, db: &'db dyn Database) -> Arg<'db> {
912 Arg::from_syntax_node(db, self.0.lookup(db))
913 }
914}
915impl<'db> From<ArgPtr<'db>> for SyntaxStablePtrId<'db> {
916 fn from(ptr: ArgPtr<'db>) -> Self {
917 ptr.untyped()
918 }
919}
920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
921pub struct ArgGreen<'db>(pub GreenId<'db>);
922impl<'db> TypedSyntaxNode<'db> for Arg<'db> {
923 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
924 type StablePtr = ArgPtr<'db>;
925 type Green = ArgGreen<'db>;
926 fn missing(db: &'db dyn Database) -> Self::Green {
927 ArgGreen(
928 GreenNode {
929 kind: SyntaxKind::Arg,
930 details: GreenNodeDetails::Node {
931 children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
932 width: TextWidth::default(),
933 },
934 }
935 .intern(db),
936 )
937 }
938 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
939 let kind = node.kind(db);
940 assert_eq!(
941 kind,
942 SyntaxKind::Arg,
943 "Unexpected SyntaxKind {:?}. Expected {:?}.",
944 kind,
945 SyntaxKind::Arg
946 );
947 Self { node }
948 }
949 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
950 let kind = node.kind(db);
951 if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
952 }
953 fn as_syntax_node(&self) -> SyntaxNode<'db> {
954 self.node
955 }
956 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
957 ArgPtr(self.node.stable_ptr(db))
958 }
959}
960#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
961pub enum ArgClause<'db> {
962 Unnamed(ArgClauseUnnamed<'db>),
963 Named(ArgClauseNamed<'db>),
964 FieldInitShorthand(ArgClauseFieldInitShorthand<'db>),
965}
966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
967pub struct ArgClausePtr<'db>(pub SyntaxStablePtrId<'db>);
968impl<'db> TypedStablePtr<'db> for ArgClausePtr<'db> {
969 type SyntaxNode = ArgClause<'db>;
970 fn untyped(self) -> SyntaxStablePtrId<'db> {
971 self.0
972 }
973 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
974 ArgClause::from_syntax_node(db, self.0.lookup(db))
975 }
976}
977impl<'db> From<ArgClausePtr<'db>> for SyntaxStablePtrId<'db> {
978 fn from(ptr: ArgClausePtr<'db>) -> Self {
979 ptr.untyped()
980 }
981}
982impl<'db> From<ArgClauseUnnamedPtr<'db>> for ArgClausePtr<'db> {
983 fn from(value: ArgClauseUnnamedPtr<'db>) -> Self {
984 Self(value.0)
985 }
986}
987impl<'db> From<ArgClauseNamedPtr<'db>> for ArgClausePtr<'db> {
988 fn from(value: ArgClauseNamedPtr<'db>) -> Self {
989 Self(value.0)
990 }
991}
992impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for ArgClausePtr<'db> {
993 fn from(value: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
994 Self(value.0)
995 }
996}
997impl<'db> From<ArgClauseUnnamedGreen<'db>> for ArgClauseGreen<'db> {
998 fn from(value: ArgClauseUnnamedGreen<'db>) -> Self {
999 Self(value.0)
1000 }
1001}
1002impl<'db> From<ArgClauseNamedGreen<'db>> for ArgClauseGreen<'db> {
1003 fn from(value: ArgClauseNamedGreen<'db>) -> Self {
1004 Self(value.0)
1005 }
1006}
1007impl<'db> From<ArgClauseFieldInitShorthandGreen<'db>> for ArgClauseGreen<'db> {
1008 fn from(value: ArgClauseFieldInitShorthandGreen<'db>) -> Self {
1009 Self(value.0)
1010 }
1011}
1012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1013pub struct ArgClauseGreen<'db>(pub GreenId<'db>);
1014impl<'db> TypedSyntaxNode<'db> for ArgClause<'db> {
1015 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1016 type StablePtr = ArgClausePtr<'db>;
1017 type Green = ArgClauseGreen<'db>;
1018 fn missing(db: &'db dyn Database) -> Self::Green {
1019 panic!("No missing variant.");
1020 }
1021 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1022 let kind = node.kind(db);
1023 match kind {
1024 SyntaxKind::ArgClauseUnnamed => {
1025 ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1026 }
1027 SyntaxKind::ArgClauseNamed => {
1028 ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1029 }
1030 SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1031 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1032 ),
1033 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1034 }
1035 }
1036 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1037 let kind = node.kind(db);
1038 match kind {
1039 SyntaxKind::ArgClauseUnnamed => {
1040 Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1041 }
1042 SyntaxKind::ArgClauseNamed => {
1043 Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1044 }
1045 SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1046 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1047 )),
1048 _ => None,
1049 }
1050 }
1051 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1052 match self {
1053 ArgClause::Unnamed(x) => x.as_syntax_node(),
1054 ArgClause::Named(x) => x.as_syntax_node(),
1055 ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1056 }
1057 }
1058 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1059 ArgClausePtr(self.as_syntax_node().stable_ptr(db))
1060 }
1061}
1062impl<'db> ArgClause<'db> {
1063 pub fn is_variant(kind: SyntaxKind) -> bool {
1065 matches!(
1066 kind,
1067 SyntaxKind::ArgClauseUnnamed
1068 | SyntaxKind::ArgClauseNamed
1069 | SyntaxKind::ArgClauseFieldInitShorthand
1070 )
1071 }
1072}
1073#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1074pub struct ArgClauseNamed<'db> {
1075 node: SyntaxNode<'db>,
1076}
1077impl<'db> ArgClauseNamed<'db> {
1078 pub const INDEX_NAME: usize = 0;
1079 pub const INDEX_COLON: usize = 1;
1080 pub const INDEX_VALUE: usize = 2;
1081 pub fn new_green(
1082 db: &'db dyn Database,
1083 name: TerminalIdentifierGreen<'db>,
1084 colon: TerminalColonGreen<'db>,
1085 value: ExprGreen<'db>,
1086 ) -> ArgClauseNamedGreen<'db> {
1087 let children = [name.0, colon.0, value.0];
1088 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1089 ArgClauseNamedGreen(
1090 GreenNode {
1091 kind: SyntaxKind::ArgClauseNamed,
1092 details: GreenNodeDetails::Node { children: children.into(), width },
1093 }
1094 .intern(db),
1095 )
1096 }
1097}
1098impl<'db> ArgClauseNamed<'db> {
1099 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1100 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1101 }
1102 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1103 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1104 }
1105 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1106 Expr::from_syntax_node(db, self.node.get_children(db)[2])
1107 }
1108}
1109#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1110pub struct ArgClauseNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1111impl<'db> ArgClauseNamedPtr<'db> {}
1112impl<'db> TypedStablePtr<'db> for ArgClauseNamedPtr<'db> {
1113 type SyntaxNode = ArgClauseNamed<'db>;
1114 fn untyped(self) -> SyntaxStablePtrId<'db> {
1115 self.0
1116 }
1117 fn lookup(&self, db: &'db dyn Database) -> ArgClauseNamed<'db> {
1118 ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1119 }
1120}
1121impl<'db> From<ArgClauseNamedPtr<'db>> for SyntaxStablePtrId<'db> {
1122 fn from(ptr: ArgClauseNamedPtr<'db>) -> Self {
1123 ptr.untyped()
1124 }
1125}
1126#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1127pub struct ArgClauseNamedGreen<'db>(pub GreenId<'db>);
1128impl<'db> TypedSyntaxNode<'db> for ArgClauseNamed<'db> {
1129 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1130 type StablePtr = ArgClauseNamedPtr<'db>;
1131 type Green = ArgClauseNamedGreen<'db>;
1132 fn missing(db: &'db dyn Database) -> Self::Green {
1133 ArgClauseNamedGreen(
1134 GreenNode {
1135 kind: SyntaxKind::ArgClauseNamed,
1136 details: GreenNodeDetails::Node {
1137 children: [
1138 TerminalIdentifier::missing(db).0,
1139 TerminalColon::missing(db).0,
1140 Expr::missing(db).0,
1141 ]
1142 .into(),
1143 width: TextWidth::default(),
1144 },
1145 }
1146 .intern(db),
1147 )
1148 }
1149 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1150 let kind = node.kind(db);
1151 assert_eq!(
1152 kind,
1153 SyntaxKind::ArgClauseNamed,
1154 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1155 kind,
1156 SyntaxKind::ArgClauseNamed
1157 );
1158 Self { node }
1159 }
1160 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1161 let kind = node.kind(db);
1162 if kind == SyntaxKind::ArgClauseNamed {
1163 Some(Self::from_syntax_node(db, node))
1164 } else {
1165 None
1166 }
1167 }
1168 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1169 self.node
1170 }
1171 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1172 ArgClauseNamedPtr(self.node.stable_ptr(db))
1173 }
1174}
1175#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1176pub struct ArgClauseUnnamed<'db> {
1177 node: SyntaxNode<'db>,
1178}
1179impl<'db> ArgClauseUnnamed<'db> {
1180 pub const INDEX_VALUE: usize = 0;
1181 pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> ArgClauseUnnamedGreen<'db> {
1182 let children = [value.0];
1183 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1184 ArgClauseUnnamedGreen(
1185 GreenNode {
1186 kind: SyntaxKind::ArgClauseUnnamed,
1187 details: GreenNodeDetails::Node { children: children.into(), width },
1188 }
1189 .intern(db),
1190 )
1191 }
1192}
1193impl<'db> ArgClauseUnnamed<'db> {
1194 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1195 Expr::from_syntax_node(db, self.node.get_children(db)[0])
1196 }
1197}
1198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1199pub struct ArgClauseUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1200impl<'db> ArgClauseUnnamedPtr<'db> {}
1201impl<'db> TypedStablePtr<'db> for ArgClauseUnnamedPtr<'db> {
1202 type SyntaxNode = ArgClauseUnnamed<'db>;
1203 fn untyped(self) -> SyntaxStablePtrId<'db> {
1204 self.0
1205 }
1206 fn lookup(&self, db: &'db dyn Database) -> ArgClauseUnnamed<'db> {
1207 ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1208 }
1209}
1210impl<'db> From<ArgClauseUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
1211 fn from(ptr: ArgClauseUnnamedPtr<'db>) -> Self {
1212 ptr.untyped()
1213 }
1214}
1215#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1216pub struct ArgClauseUnnamedGreen<'db>(pub GreenId<'db>);
1217impl<'db> TypedSyntaxNode<'db> for ArgClauseUnnamed<'db> {
1218 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1219 type StablePtr = ArgClauseUnnamedPtr<'db>;
1220 type Green = ArgClauseUnnamedGreen<'db>;
1221 fn missing(db: &'db dyn Database) -> Self::Green {
1222 ArgClauseUnnamedGreen(
1223 GreenNode {
1224 kind: SyntaxKind::ArgClauseUnnamed,
1225 details: GreenNodeDetails::Node {
1226 children: [Expr::missing(db).0].into(),
1227 width: TextWidth::default(),
1228 },
1229 }
1230 .intern(db),
1231 )
1232 }
1233 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1234 let kind = node.kind(db);
1235 assert_eq!(
1236 kind,
1237 SyntaxKind::ArgClauseUnnamed,
1238 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1239 kind,
1240 SyntaxKind::ArgClauseUnnamed
1241 );
1242 Self { node }
1243 }
1244 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1245 let kind = node.kind(db);
1246 if kind == SyntaxKind::ArgClauseUnnamed {
1247 Some(Self::from_syntax_node(db, node))
1248 } else {
1249 None
1250 }
1251 }
1252 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1253 self.node
1254 }
1255 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1256 ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1257 }
1258}
1259#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1260pub struct ArgClauseFieldInitShorthand<'db> {
1261 node: SyntaxNode<'db>,
1262}
1263impl<'db> ArgClauseFieldInitShorthand<'db> {
1264 pub const INDEX_COLON: usize = 0;
1265 pub const INDEX_NAME: usize = 1;
1266 pub fn new_green(
1267 db: &'db dyn Database,
1268 colon: TerminalColonGreen<'db>,
1269 name: ExprFieldInitShorthandGreen<'db>,
1270 ) -> ArgClauseFieldInitShorthandGreen<'db> {
1271 let children = [colon.0, name.0];
1272 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1273 ArgClauseFieldInitShorthandGreen(
1274 GreenNode {
1275 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1276 details: GreenNodeDetails::Node { children: children.into(), width },
1277 }
1278 .intern(db),
1279 )
1280 }
1281}
1282impl<'db> ArgClauseFieldInitShorthand<'db> {
1283 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1284 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1285 }
1286 pub fn name(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1287 ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1288 }
1289}
1290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1291pub struct ArgClauseFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1292impl<'db> ArgClauseFieldInitShorthandPtr<'db> {}
1293impl<'db> TypedStablePtr<'db> for ArgClauseFieldInitShorthandPtr<'db> {
1294 type SyntaxNode = ArgClauseFieldInitShorthand<'db>;
1295 fn untyped(self) -> SyntaxStablePtrId<'db> {
1296 self.0
1297 }
1298 fn lookup(&self, db: &'db dyn Database) -> ArgClauseFieldInitShorthand<'db> {
1299 ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1300 }
1301}
1302impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1303 fn from(ptr: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
1304 ptr.untyped()
1305 }
1306}
1307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1308pub struct ArgClauseFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1309impl<'db> TypedSyntaxNode<'db> for ArgClauseFieldInitShorthand<'db> {
1310 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1311 type StablePtr = ArgClauseFieldInitShorthandPtr<'db>;
1312 type Green = ArgClauseFieldInitShorthandGreen<'db>;
1313 fn missing(db: &'db dyn Database) -> Self::Green {
1314 ArgClauseFieldInitShorthandGreen(
1315 GreenNode {
1316 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1317 details: GreenNodeDetails::Node {
1318 children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1319 .into(),
1320 width: TextWidth::default(),
1321 },
1322 }
1323 .intern(db),
1324 )
1325 }
1326 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1327 let kind = node.kind(db);
1328 assert_eq!(
1329 kind,
1330 SyntaxKind::ArgClauseFieldInitShorthand,
1331 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1332 kind,
1333 SyntaxKind::ArgClauseFieldInitShorthand
1334 );
1335 Self { node }
1336 }
1337 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1338 let kind = node.kind(db);
1339 if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1340 Some(Self::from_syntax_node(db, node))
1341 } else {
1342 None
1343 }
1344 }
1345 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1346 self.node
1347 }
1348 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1349 ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1350 }
1351}
1352#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1353pub struct ExprFieldInitShorthand<'db> {
1354 node: SyntaxNode<'db>,
1355}
1356impl<'db> ExprFieldInitShorthand<'db> {
1357 pub const INDEX_NAME: usize = 0;
1358 pub fn new_green(
1359 db: &'db dyn Database,
1360 name: TerminalIdentifierGreen<'db>,
1361 ) -> ExprFieldInitShorthandGreen<'db> {
1362 let children = [name.0];
1363 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1364 ExprFieldInitShorthandGreen(
1365 GreenNode {
1366 kind: SyntaxKind::ExprFieldInitShorthand,
1367 details: GreenNodeDetails::Node { children: children.into(), width },
1368 }
1369 .intern(db),
1370 )
1371 }
1372}
1373impl<'db> ExprFieldInitShorthand<'db> {
1374 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1375 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1376 }
1377}
1378#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1379pub struct ExprFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1380impl<'db> ExprFieldInitShorthandPtr<'db> {}
1381impl<'db> TypedStablePtr<'db> for ExprFieldInitShorthandPtr<'db> {
1382 type SyntaxNode = ExprFieldInitShorthand<'db>;
1383 fn untyped(self) -> SyntaxStablePtrId<'db> {
1384 self.0
1385 }
1386 fn lookup(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1387 ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1388 }
1389}
1390impl<'db> From<ExprFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1391 fn from(ptr: ExprFieldInitShorthandPtr<'db>) -> Self {
1392 ptr.untyped()
1393 }
1394}
1395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1396pub struct ExprFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1397impl<'db> TypedSyntaxNode<'db> for ExprFieldInitShorthand<'db> {
1398 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1399 type StablePtr = ExprFieldInitShorthandPtr<'db>;
1400 type Green = ExprFieldInitShorthandGreen<'db>;
1401 fn missing(db: &'db dyn Database) -> Self::Green {
1402 ExprFieldInitShorthandGreen(
1403 GreenNode {
1404 kind: SyntaxKind::ExprFieldInitShorthand,
1405 details: GreenNodeDetails::Node {
1406 children: [TerminalIdentifier::missing(db).0].into(),
1407 width: TextWidth::default(),
1408 },
1409 }
1410 .intern(db),
1411 )
1412 }
1413 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1414 let kind = node.kind(db);
1415 assert_eq!(
1416 kind,
1417 SyntaxKind::ExprFieldInitShorthand,
1418 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1419 kind,
1420 SyntaxKind::ExprFieldInitShorthand
1421 );
1422 Self { node }
1423 }
1424 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1425 let kind = node.kind(db);
1426 if kind == SyntaxKind::ExprFieldInitShorthand {
1427 Some(Self::from_syntax_node(db, node))
1428 } else {
1429 None
1430 }
1431 }
1432 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1433 self.node
1434 }
1435 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1436 ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1437 }
1438}
1439#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1440pub struct ArgList<'db>(ElementList<'db, Arg<'db>, 2>);
1441impl<'db> Deref for ArgList<'db> {
1442 type Target = ElementList<'db, Arg<'db>, 2>;
1443 fn deref(&self) -> &Self::Target {
1444 &self.0
1445 }
1446}
1447impl<'db> ArgList<'db> {
1448 pub fn new_green(
1449 db: &'db dyn Database,
1450 children: &[ArgListElementOrSeparatorGreen<'db>],
1451 ) -> ArgListGreen<'db> {
1452 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
1453 ArgListGreen(
1454 GreenNode {
1455 kind: SyntaxKind::ArgList,
1456 details: GreenNodeDetails::Node {
1457 children: children.iter().map(|x| x.id()).collect(),
1458 width,
1459 },
1460 }
1461 .intern(db),
1462 )
1463 }
1464}
1465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1466pub struct ArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
1467impl<'db> TypedStablePtr<'db> for ArgListPtr<'db> {
1468 type SyntaxNode = ArgList<'db>;
1469 fn untyped(self) -> SyntaxStablePtrId<'db> {
1470 self.0
1471 }
1472 fn lookup(&self, db: &'db dyn Database) -> ArgList<'db> {
1473 ArgList::from_syntax_node(db, self.0.lookup(db))
1474 }
1475}
1476impl<'db> From<ArgListPtr<'db>> for SyntaxStablePtrId<'db> {
1477 fn from(ptr: ArgListPtr<'db>) -> Self {
1478 ptr.untyped()
1479 }
1480}
1481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1482pub enum ArgListElementOrSeparatorGreen<'db> {
1483 Separator(TerminalCommaGreen<'db>),
1484 Element(ArgGreen<'db>),
1485}
1486impl<'db> From<TerminalCommaGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1487 fn from(value: TerminalCommaGreen<'db>) -> Self {
1488 ArgListElementOrSeparatorGreen::Separator(value)
1489 }
1490}
1491impl<'db> From<ArgGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1492 fn from(value: ArgGreen<'db>) -> Self {
1493 ArgListElementOrSeparatorGreen::Element(value)
1494 }
1495}
1496impl<'db> ArgListElementOrSeparatorGreen<'db> {
1497 fn id(&self) -> GreenId<'db> {
1498 match self {
1499 ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1500 ArgListElementOrSeparatorGreen::Element(green) => green.0,
1501 }
1502 }
1503}
1504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1505pub struct ArgListGreen<'db>(pub GreenId<'db>);
1506impl<'db> TypedSyntaxNode<'db> for ArgList<'db> {
1507 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1508 type StablePtr = ArgListPtr<'db>;
1509 type Green = ArgListGreen<'db>;
1510 fn missing(db: &'db dyn Database) -> Self::Green {
1511 ArgListGreen(
1512 GreenNode {
1513 kind: SyntaxKind::ArgList,
1514 details: GreenNodeDetails::Node {
1515 children: [].into(),
1516 width: TextWidth::default(),
1517 },
1518 }
1519 .intern(db),
1520 )
1521 }
1522 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1523 Self(ElementList::new(node))
1524 }
1525 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1526 if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1527 }
1528 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1529 self.node
1530 }
1531 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1532 ArgListPtr(self.node.stable_ptr(db))
1533 }
1534}
1535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1536pub struct ExprMissing<'db> {
1537 node: SyntaxNode<'db>,
1538}
1539impl<'db> ExprMissing<'db> {
1540 pub fn new_green(db: &'db dyn Database) -> ExprMissingGreen<'db> {
1541 let children = [];
1542 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1543 ExprMissingGreen(
1544 GreenNode {
1545 kind: SyntaxKind::ExprMissing,
1546 details: GreenNodeDetails::Node { children: children.into(), width },
1547 }
1548 .intern(db),
1549 )
1550 }
1551}
1552impl<'db> ExprMissing<'db> {}
1553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1554pub struct ExprMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
1555impl<'db> ExprMissingPtr<'db> {}
1556impl<'db> TypedStablePtr<'db> for ExprMissingPtr<'db> {
1557 type SyntaxNode = ExprMissing<'db>;
1558 fn untyped(self) -> SyntaxStablePtrId<'db> {
1559 self.0
1560 }
1561 fn lookup(&self, db: &'db dyn Database) -> ExprMissing<'db> {
1562 ExprMissing::from_syntax_node(db, self.0.lookup(db))
1563 }
1564}
1565impl<'db> From<ExprMissingPtr<'db>> for SyntaxStablePtrId<'db> {
1566 fn from(ptr: ExprMissingPtr<'db>) -> Self {
1567 ptr.untyped()
1568 }
1569}
1570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1571pub struct ExprMissingGreen<'db>(pub GreenId<'db>);
1572impl<'db> TypedSyntaxNode<'db> for ExprMissing<'db> {
1573 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1574 type StablePtr = ExprMissingPtr<'db>;
1575 type Green = ExprMissingGreen<'db>;
1576 fn missing(db: &'db dyn Database) -> Self::Green {
1577 ExprMissingGreen(
1578 GreenNode {
1579 kind: SyntaxKind::ExprMissing,
1580 details: GreenNodeDetails::Node {
1581 children: [].into(),
1582 width: TextWidth::default(),
1583 },
1584 }
1585 .intern(db),
1586 )
1587 }
1588 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1589 let kind = node.kind(db);
1590 assert_eq!(
1591 kind,
1592 SyntaxKind::ExprMissing,
1593 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1594 kind,
1595 SyntaxKind::ExprMissing
1596 );
1597 Self { node }
1598 }
1599 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1600 let kind = node.kind(db);
1601 if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1602 }
1603 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1604 self.node
1605 }
1606 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1607 ExprMissingPtr(self.node.stable_ptr(db))
1608 }
1609}
1610#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1611pub enum PathSegment<'db> {
1612 Simple(PathSegmentSimple<'db>),
1613 WithGenericArgs(PathSegmentWithGenericArgs<'db>),
1614 Missing(PathSegmentMissing<'db>),
1615}
1616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1617pub struct PathSegmentPtr<'db>(pub SyntaxStablePtrId<'db>);
1618impl<'db> TypedStablePtr<'db> for PathSegmentPtr<'db> {
1619 type SyntaxNode = PathSegment<'db>;
1620 fn untyped(self) -> SyntaxStablePtrId<'db> {
1621 self.0
1622 }
1623 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1624 PathSegment::from_syntax_node(db, self.0.lookup(db))
1625 }
1626}
1627impl<'db> From<PathSegmentPtr<'db>> for SyntaxStablePtrId<'db> {
1628 fn from(ptr: PathSegmentPtr<'db>) -> Self {
1629 ptr.untyped()
1630 }
1631}
1632impl<'db> From<PathSegmentSimplePtr<'db>> for PathSegmentPtr<'db> {
1633 fn from(value: PathSegmentSimplePtr<'db>) -> Self {
1634 Self(value.0)
1635 }
1636}
1637impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for PathSegmentPtr<'db> {
1638 fn from(value: PathSegmentWithGenericArgsPtr<'db>) -> Self {
1639 Self(value.0)
1640 }
1641}
1642impl<'db> From<PathSegmentMissingPtr<'db>> for PathSegmentPtr<'db> {
1643 fn from(value: PathSegmentMissingPtr<'db>) -> Self {
1644 Self(value.0)
1645 }
1646}
1647impl<'db> From<PathSegmentSimpleGreen<'db>> for PathSegmentGreen<'db> {
1648 fn from(value: PathSegmentSimpleGreen<'db>) -> Self {
1649 Self(value.0)
1650 }
1651}
1652impl<'db> From<PathSegmentWithGenericArgsGreen<'db>> for PathSegmentGreen<'db> {
1653 fn from(value: PathSegmentWithGenericArgsGreen<'db>) -> Self {
1654 Self(value.0)
1655 }
1656}
1657impl<'db> From<PathSegmentMissingGreen<'db>> for PathSegmentGreen<'db> {
1658 fn from(value: PathSegmentMissingGreen<'db>) -> Self {
1659 Self(value.0)
1660 }
1661}
1662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1663pub struct PathSegmentGreen<'db>(pub GreenId<'db>);
1664impl<'db> TypedSyntaxNode<'db> for PathSegment<'db> {
1665 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1666 type StablePtr = PathSegmentPtr<'db>;
1667 type Green = PathSegmentGreen<'db>;
1668 fn missing(db: &'db dyn Database) -> Self::Green {
1669 PathSegmentGreen(PathSegmentMissing::missing(db).0)
1670 }
1671 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1672 let kind = node.kind(db);
1673 match kind {
1674 SyntaxKind::PathSegmentSimple => {
1675 PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1676 }
1677 SyntaxKind::PathSegmentWithGenericArgs => {
1678 PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1679 }
1680 SyntaxKind::PathSegmentMissing => {
1681 PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1682 }
1683 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1684 }
1685 }
1686 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1687 let kind = node.kind(db);
1688 match kind {
1689 SyntaxKind::PathSegmentSimple => {
1690 Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1691 }
1692 SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1693 PathSegmentWithGenericArgs::from_syntax_node(db, node),
1694 )),
1695 SyntaxKind::PathSegmentMissing => {
1696 Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1697 }
1698 _ => None,
1699 }
1700 }
1701 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1702 match self {
1703 PathSegment::Simple(x) => x.as_syntax_node(),
1704 PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1705 PathSegment::Missing(x) => x.as_syntax_node(),
1706 }
1707 }
1708 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1709 PathSegmentPtr(self.as_syntax_node().stable_ptr(db))
1710 }
1711}
1712impl<'db> PathSegment<'db> {
1713 pub fn is_variant(kind: SyntaxKind) -> bool {
1715 matches!(
1716 kind,
1717 SyntaxKind::PathSegmentSimple
1718 | SyntaxKind::PathSegmentWithGenericArgs
1719 | SyntaxKind::PathSegmentMissing
1720 )
1721 }
1722}
1723#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1724pub struct PathSegmentSimple<'db> {
1725 node: SyntaxNode<'db>,
1726}
1727impl<'db> PathSegmentSimple<'db> {
1728 pub const INDEX_IDENT: usize = 0;
1729 pub fn new_green(
1730 db: &'db dyn Database,
1731 ident: TerminalIdentifierGreen<'db>,
1732 ) -> PathSegmentSimpleGreen<'db> {
1733 let children = [ident.0];
1734 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1735 PathSegmentSimpleGreen(
1736 GreenNode {
1737 kind: SyntaxKind::PathSegmentSimple,
1738 details: GreenNodeDetails::Node { children: children.into(), width },
1739 }
1740 .intern(db),
1741 )
1742 }
1743}
1744impl<'db> PathSegmentSimple<'db> {
1745 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1746 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1747 }
1748}
1749#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1750pub struct PathSegmentSimplePtr<'db>(pub SyntaxStablePtrId<'db>);
1751impl<'db> PathSegmentSimplePtr<'db> {}
1752impl<'db> TypedStablePtr<'db> for PathSegmentSimplePtr<'db> {
1753 type SyntaxNode = PathSegmentSimple<'db>;
1754 fn untyped(self) -> SyntaxStablePtrId<'db> {
1755 self.0
1756 }
1757 fn lookup(&self, db: &'db dyn Database) -> PathSegmentSimple<'db> {
1758 PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1759 }
1760}
1761impl<'db> From<PathSegmentSimplePtr<'db>> for SyntaxStablePtrId<'db> {
1762 fn from(ptr: PathSegmentSimplePtr<'db>) -> Self {
1763 ptr.untyped()
1764 }
1765}
1766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1767pub struct PathSegmentSimpleGreen<'db>(pub GreenId<'db>);
1768impl<'db> TypedSyntaxNode<'db> for PathSegmentSimple<'db> {
1769 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1770 type StablePtr = PathSegmentSimplePtr<'db>;
1771 type Green = PathSegmentSimpleGreen<'db>;
1772 fn missing(db: &'db dyn Database) -> Self::Green {
1773 PathSegmentSimpleGreen(
1774 GreenNode {
1775 kind: SyntaxKind::PathSegmentSimple,
1776 details: GreenNodeDetails::Node {
1777 children: [TerminalIdentifier::missing(db).0].into(),
1778 width: TextWidth::default(),
1779 },
1780 }
1781 .intern(db),
1782 )
1783 }
1784 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1785 let kind = node.kind(db);
1786 assert_eq!(
1787 kind,
1788 SyntaxKind::PathSegmentSimple,
1789 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1790 kind,
1791 SyntaxKind::PathSegmentSimple
1792 );
1793 Self { node }
1794 }
1795 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1796 let kind = node.kind(db);
1797 if kind == SyntaxKind::PathSegmentSimple {
1798 Some(Self::from_syntax_node(db, node))
1799 } else {
1800 None
1801 }
1802 }
1803 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1804 self.node
1805 }
1806 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1807 PathSegmentSimplePtr(self.node.stable_ptr(db))
1808 }
1809}
1810#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1811pub enum OptionTerminalColonColon<'db> {
1812 Empty(OptionTerminalColonColonEmpty<'db>),
1813 TerminalColonColon(TerminalColonColon<'db>),
1814}
1815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1816pub struct OptionTerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
1817impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonPtr<'db> {
1818 type SyntaxNode = OptionTerminalColonColon<'db>;
1819 fn untyped(self) -> SyntaxStablePtrId<'db> {
1820 self.0
1821 }
1822 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1823 OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1824 }
1825}
1826impl<'db> From<OptionTerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
1827 fn from(ptr: OptionTerminalColonColonPtr<'db>) -> Self {
1828 ptr.untyped()
1829 }
1830}
1831impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1832 fn from(value: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1833 Self(value.0)
1834 }
1835}
1836impl<'db> From<TerminalColonColonPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1837 fn from(value: TerminalColonColonPtr<'db>) -> Self {
1838 Self(value.0)
1839 }
1840}
1841impl<'db> From<OptionTerminalColonColonEmptyGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1842 fn from(value: OptionTerminalColonColonEmptyGreen<'db>) -> Self {
1843 Self(value.0)
1844 }
1845}
1846impl<'db> From<TerminalColonColonGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1847 fn from(value: TerminalColonColonGreen<'db>) -> Self {
1848 Self(value.0)
1849 }
1850}
1851#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1852pub struct OptionTerminalColonColonGreen<'db>(pub GreenId<'db>);
1853impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColon<'db> {
1854 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1855 type StablePtr = OptionTerminalColonColonPtr<'db>;
1856 type Green = OptionTerminalColonColonGreen<'db>;
1857 fn missing(db: &'db dyn Database) -> Self::Green {
1858 panic!("No missing variant.");
1859 }
1860 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1861 let kind = node.kind(db);
1862 match kind {
1863 SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1864 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1865 ),
1866 SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1867 TerminalColonColon::from_syntax_node(db, node),
1868 ),
1869 _ => panic!(
1870 "Unexpected syntax kind {:?} when constructing {}.",
1871 kind, "OptionTerminalColonColon"
1872 ),
1873 }
1874 }
1875 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1876 let kind = node.kind(db);
1877 match kind {
1878 SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1879 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1880 )),
1881 SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1882 TerminalColonColon::from_syntax_node(db, node),
1883 )),
1884 _ => None,
1885 }
1886 }
1887 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1888 match self {
1889 OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1890 OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1891 }
1892 }
1893 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1894 OptionTerminalColonColonPtr(self.as_syntax_node().stable_ptr(db))
1895 }
1896}
1897impl<'db> OptionTerminalColonColon<'db> {
1898 pub fn is_variant(kind: SyntaxKind) -> bool {
1900 matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1901 }
1902}
1903#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1904pub struct OptionTerminalColonColonEmpty<'db> {
1905 node: SyntaxNode<'db>,
1906}
1907impl<'db> OptionTerminalColonColonEmpty<'db> {
1908 pub fn new_green(db: &'db dyn Database) -> OptionTerminalColonColonEmptyGreen<'db> {
1909 let children = [];
1910 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1911 OptionTerminalColonColonEmptyGreen(
1912 GreenNode {
1913 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1914 details: GreenNodeDetails::Node { children: children.into(), width },
1915 }
1916 .intern(db),
1917 )
1918 }
1919}
1920impl<'db> OptionTerminalColonColonEmpty<'db> {}
1921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1922pub struct OptionTerminalColonColonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
1923impl<'db> OptionTerminalColonColonEmptyPtr<'db> {}
1924impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonEmptyPtr<'db> {
1925 type SyntaxNode = OptionTerminalColonColonEmpty<'db>;
1926 fn untyped(self) -> SyntaxStablePtrId<'db> {
1927 self.0
1928 }
1929 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalColonColonEmpty<'db> {
1930 OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1931 }
1932}
1933impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
1934 fn from(ptr: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1935 ptr.untyped()
1936 }
1937}
1938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1939pub struct OptionTerminalColonColonEmptyGreen<'db>(pub GreenId<'db>);
1940impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColonEmpty<'db> {
1941 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1942 type StablePtr = OptionTerminalColonColonEmptyPtr<'db>;
1943 type Green = OptionTerminalColonColonEmptyGreen<'db>;
1944 fn missing(db: &'db dyn Database) -> Self::Green {
1945 OptionTerminalColonColonEmptyGreen(
1946 GreenNode {
1947 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1948 details: GreenNodeDetails::Node {
1949 children: [].into(),
1950 width: TextWidth::default(),
1951 },
1952 }
1953 .intern(db),
1954 )
1955 }
1956 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1957 let kind = node.kind(db);
1958 assert_eq!(
1959 kind,
1960 SyntaxKind::OptionTerminalColonColonEmpty,
1961 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1962 kind,
1963 SyntaxKind::OptionTerminalColonColonEmpty
1964 );
1965 Self { node }
1966 }
1967 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1968 let kind = node.kind(db);
1969 if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1970 Some(Self::from_syntax_node(db, node))
1971 } else {
1972 None
1973 }
1974 }
1975 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1976 self.node
1977 }
1978 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1979 OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1980 }
1981}
1982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1983pub struct PathSegmentWithGenericArgs<'db> {
1984 node: SyntaxNode<'db>,
1985}
1986impl<'db> PathSegmentWithGenericArgs<'db> {
1987 pub const INDEX_IDENT: usize = 0;
1988 pub const INDEX_SEPARATOR: usize = 1;
1989 pub const INDEX_GENERIC_ARGS: usize = 2;
1990 pub fn new_green(
1991 db: &'db dyn Database,
1992 ident: TerminalIdentifierGreen<'db>,
1993 separator: OptionTerminalColonColonGreen<'db>,
1994 generic_args: GenericArgsGreen<'db>,
1995 ) -> PathSegmentWithGenericArgsGreen<'db> {
1996 let children = [ident.0, separator.0, generic_args.0];
1997 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1998 PathSegmentWithGenericArgsGreen(
1999 GreenNode {
2000 kind: SyntaxKind::PathSegmentWithGenericArgs,
2001 details: GreenNodeDetails::Node { children: children.into(), width },
2002 }
2003 .intern(db),
2004 )
2005 }
2006}
2007impl<'db> PathSegmentWithGenericArgs<'db> {
2008 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2009 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2010 }
2011 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalColonColon<'db> {
2012 OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
2013 }
2014 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgs<'db> {
2015 GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
2016 }
2017}
2018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2019pub struct PathSegmentWithGenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
2020impl<'db> PathSegmentWithGenericArgsPtr<'db> {}
2021impl<'db> TypedStablePtr<'db> for PathSegmentWithGenericArgsPtr<'db> {
2022 type SyntaxNode = PathSegmentWithGenericArgs<'db>;
2023 fn untyped(self) -> SyntaxStablePtrId<'db> {
2024 self.0
2025 }
2026 fn lookup(&self, db: &'db dyn Database) -> PathSegmentWithGenericArgs<'db> {
2027 PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2028 }
2029}
2030impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
2031 fn from(ptr: PathSegmentWithGenericArgsPtr<'db>) -> Self {
2032 ptr.untyped()
2033 }
2034}
2035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2036pub struct PathSegmentWithGenericArgsGreen<'db>(pub GreenId<'db>);
2037impl<'db> TypedSyntaxNode<'db> for PathSegmentWithGenericArgs<'db> {
2038 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2039 type StablePtr = PathSegmentWithGenericArgsPtr<'db>;
2040 type Green = PathSegmentWithGenericArgsGreen<'db>;
2041 fn missing(db: &'db dyn Database) -> Self::Green {
2042 PathSegmentWithGenericArgsGreen(
2043 GreenNode {
2044 kind: SyntaxKind::PathSegmentWithGenericArgs,
2045 details: GreenNodeDetails::Node {
2046 children: [
2047 TerminalIdentifier::missing(db).0,
2048 OptionTerminalColonColon::missing(db).0,
2049 GenericArgs::missing(db).0,
2050 ]
2051 .into(),
2052 width: TextWidth::default(),
2053 },
2054 }
2055 .intern(db),
2056 )
2057 }
2058 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2059 let kind = node.kind(db);
2060 assert_eq!(
2061 kind,
2062 SyntaxKind::PathSegmentWithGenericArgs,
2063 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2064 kind,
2065 SyntaxKind::PathSegmentWithGenericArgs
2066 );
2067 Self { node }
2068 }
2069 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2070 let kind = node.kind(db);
2071 if kind == SyntaxKind::PathSegmentWithGenericArgs {
2072 Some(Self::from_syntax_node(db, node))
2073 } else {
2074 None
2075 }
2076 }
2077 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2078 self.node
2079 }
2080 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2081 PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2082 }
2083}
2084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2085pub struct ExprPath<'db> {
2086 node: SyntaxNode<'db>,
2087}
2088impl<'db> ExprPath<'db> {
2089 pub const INDEX_DOLLAR: usize = 0;
2090 pub const INDEX_SEGMENTS: usize = 1;
2091 pub fn new_green(
2092 db: &'db dyn Database,
2093 dollar: OptionTerminalDollarGreen<'db>,
2094 segments: ExprPathInnerGreen<'db>,
2095 ) -> ExprPathGreen<'db> {
2096 let children = [dollar.0, segments.0];
2097 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2098 ExprPathGreen(
2099 GreenNode {
2100 kind: SyntaxKind::ExprPath,
2101 details: GreenNodeDetails::Node { children: children.into(), width },
2102 }
2103 .intern(db),
2104 )
2105 }
2106}
2107impl<'db> ExprPath<'db> {
2108 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
2109 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2110 }
2111 pub fn segments(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2112 ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2113 }
2114}
2115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2116pub struct ExprPathPtr<'db>(pub SyntaxStablePtrId<'db>);
2117impl<'db> ExprPathPtr<'db> {}
2118impl<'db> TypedStablePtr<'db> for ExprPathPtr<'db> {
2119 type SyntaxNode = ExprPath<'db>;
2120 fn untyped(self) -> SyntaxStablePtrId<'db> {
2121 self.0
2122 }
2123 fn lookup(&self, db: &'db dyn Database) -> ExprPath<'db> {
2124 ExprPath::from_syntax_node(db, self.0.lookup(db))
2125 }
2126}
2127impl<'db> From<ExprPathPtr<'db>> for SyntaxStablePtrId<'db> {
2128 fn from(ptr: ExprPathPtr<'db>) -> Self {
2129 ptr.untyped()
2130 }
2131}
2132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2133pub struct ExprPathGreen<'db>(pub GreenId<'db>);
2134impl<'db> TypedSyntaxNode<'db> for ExprPath<'db> {
2135 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2136 type StablePtr = ExprPathPtr<'db>;
2137 type Green = ExprPathGreen<'db>;
2138 fn missing(db: &'db dyn Database) -> Self::Green {
2139 ExprPathGreen(
2140 GreenNode {
2141 kind: SyntaxKind::ExprPath,
2142 details: GreenNodeDetails::Node {
2143 children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2144 .into(),
2145 width: TextWidth::default(),
2146 },
2147 }
2148 .intern(db),
2149 )
2150 }
2151 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2152 let kind = node.kind(db);
2153 assert_eq!(
2154 kind,
2155 SyntaxKind::ExprPath,
2156 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2157 kind,
2158 SyntaxKind::ExprPath
2159 );
2160 Self { node }
2161 }
2162 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2163 let kind = node.kind(db);
2164 if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2165 }
2166 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2167 self.node
2168 }
2169 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2170 ExprPathPtr(self.node.stable_ptr(db))
2171 }
2172}
2173#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2174pub enum OptionTerminalDollar<'db> {
2175 Empty(OptionTerminalDollarEmpty<'db>),
2176 TerminalDollar(TerminalDollar<'db>),
2177}
2178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2179pub struct OptionTerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
2180impl<'db> TypedStablePtr<'db> for OptionTerminalDollarPtr<'db> {
2181 type SyntaxNode = OptionTerminalDollar<'db>;
2182 fn untyped(self) -> SyntaxStablePtrId<'db> {
2183 self.0
2184 }
2185 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2186 OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2187 }
2188}
2189impl<'db> From<OptionTerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
2190 fn from(ptr: OptionTerminalDollarPtr<'db>) -> Self {
2191 ptr.untyped()
2192 }
2193}
2194impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for OptionTerminalDollarPtr<'db> {
2195 fn from(value: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2196 Self(value.0)
2197 }
2198}
2199impl<'db> From<TerminalDollarPtr<'db>> for OptionTerminalDollarPtr<'db> {
2200 fn from(value: TerminalDollarPtr<'db>) -> Self {
2201 Self(value.0)
2202 }
2203}
2204impl<'db> From<OptionTerminalDollarEmptyGreen<'db>> for OptionTerminalDollarGreen<'db> {
2205 fn from(value: OptionTerminalDollarEmptyGreen<'db>) -> Self {
2206 Self(value.0)
2207 }
2208}
2209impl<'db> From<TerminalDollarGreen<'db>> for OptionTerminalDollarGreen<'db> {
2210 fn from(value: TerminalDollarGreen<'db>) -> Self {
2211 Self(value.0)
2212 }
2213}
2214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2215pub struct OptionTerminalDollarGreen<'db>(pub GreenId<'db>);
2216impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollar<'db> {
2217 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2218 type StablePtr = OptionTerminalDollarPtr<'db>;
2219 type Green = OptionTerminalDollarGreen<'db>;
2220 fn missing(db: &'db dyn Database) -> Self::Green {
2221 panic!("No missing variant.");
2222 }
2223 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2224 let kind = node.kind(db);
2225 match kind {
2226 SyntaxKind::OptionTerminalDollarEmpty => {
2227 OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2228 }
2229 SyntaxKind::TerminalDollar => {
2230 OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2231 }
2232 _ => panic!(
2233 "Unexpected syntax kind {:?} when constructing {}.",
2234 kind, "OptionTerminalDollar"
2235 ),
2236 }
2237 }
2238 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2239 let kind = node.kind(db);
2240 match kind {
2241 SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2242 OptionTerminalDollarEmpty::from_syntax_node(db, node),
2243 )),
2244 SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2245 TerminalDollar::from_syntax_node(db, node),
2246 )),
2247 _ => None,
2248 }
2249 }
2250 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2251 match self {
2252 OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2253 OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2254 }
2255 }
2256 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2257 OptionTerminalDollarPtr(self.as_syntax_node().stable_ptr(db))
2258 }
2259}
2260impl<'db> OptionTerminalDollar<'db> {
2261 pub fn is_variant(kind: SyntaxKind) -> bool {
2263 matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2264 }
2265}
2266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2267pub struct OptionTerminalDollarEmpty<'db> {
2268 node: SyntaxNode<'db>,
2269}
2270impl<'db> OptionTerminalDollarEmpty<'db> {
2271 pub fn new_green(db: &'db dyn Database) -> OptionTerminalDollarEmptyGreen<'db> {
2272 let children = [];
2273 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2274 OptionTerminalDollarEmptyGreen(
2275 GreenNode {
2276 kind: SyntaxKind::OptionTerminalDollarEmpty,
2277 details: GreenNodeDetails::Node { children: children.into(), width },
2278 }
2279 .intern(db),
2280 )
2281 }
2282}
2283impl<'db> OptionTerminalDollarEmpty<'db> {}
2284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2285pub struct OptionTerminalDollarEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
2286impl<'db> OptionTerminalDollarEmptyPtr<'db> {}
2287impl<'db> TypedStablePtr<'db> for OptionTerminalDollarEmptyPtr<'db> {
2288 type SyntaxNode = OptionTerminalDollarEmpty<'db>;
2289 fn untyped(self) -> SyntaxStablePtrId<'db> {
2290 self.0
2291 }
2292 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalDollarEmpty<'db> {
2293 OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2294 }
2295}
2296impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
2297 fn from(ptr: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2298 ptr.untyped()
2299 }
2300}
2301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2302pub struct OptionTerminalDollarEmptyGreen<'db>(pub GreenId<'db>);
2303impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollarEmpty<'db> {
2304 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2305 type StablePtr = OptionTerminalDollarEmptyPtr<'db>;
2306 type Green = OptionTerminalDollarEmptyGreen<'db>;
2307 fn missing(db: &'db dyn Database) -> Self::Green {
2308 OptionTerminalDollarEmptyGreen(
2309 GreenNode {
2310 kind: SyntaxKind::OptionTerminalDollarEmpty,
2311 details: GreenNodeDetails::Node {
2312 children: [].into(),
2313 width: TextWidth::default(),
2314 },
2315 }
2316 .intern(db),
2317 )
2318 }
2319 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2320 let kind = node.kind(db);
2321 assert_eq!(
2322 kind,
2323 SyntaxKind::OptionTerminalDollarEmpty,
2324 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2325 kind,
2326 SyntaxKind::OptionTerminalDollarEmpty
2327 );
2328 Self { node }
2329 }
2330 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2331 let kind = node.kind(db);
2332 if kind == SyntaxKind::OptionTerminalDollarEmpty {
2333 Some(Self::from_syntax_node(db, node))
2334 } else {
2335 None
2336 }
2337 }
2338 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2339 self.node
2340 }
2341 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2342 OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2343 }
2344}
2345#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2346pub struct PathSegmentMissing<'db> {
2347 node: SyntaxNode<'db>,
2348}
2349impl<'db> PathSegmentMissing<'db> {
2350 pub const INDEX_IDENT: usize = 0;
2351 pub fn new_green(
2352 db: &'db dyn Database,
2353 ident: TerminalIdentifierGreen<'db>,
2354 ) -> PathSegmentMissingGreen<'db> {
2355 let children = [ident.0];
2356 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2357 PathSegmentMissingGreen(
2358 GreenNode {
2359 kind: SyntaxKind::PathSegmentMissing,
2360 details: GreenNodeDetails::Node { children: children.into(), width },
2361 }
2362 .intern(db),
2363 )
2364 }
2365}
2366impl<'db> PathSegmentMissing<'db> {
2367 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2368 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2369 }
2370}
2371#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2372pub struct PathSegmentMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
2373impl<'db> PathSegmentMissingPtr<'db> {}
2374impl<'db> TypedStablePtr<'db> for PathSegmentMissingPtr<'db> {
2375 type SyntaxNode = PathSegmentMissing<'db>;
2376 fn untyped(self) -> SyntaxStablePtrId<'db> {
2377 self.0
2378 }
2379 fn lookup(&self, db: &'db dyn Database) -> PathSegmentMissing<'db> {
2380 PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2381 }
2382}
2383impl<'db> From<PathSegmentMissingPtr<'db>> for SyntaxStablePtrId<'db> {
2384 fn from(ptr: PathSegmentMissingPtr<'db>) -> Self {
2385 ptr.untyped()
2386 }
2387}
2388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2389pub struct PathSegmentMissingGreen<'db>(pub GreenId<'db>);
2390impl<'db> TypedSyntaxNode<'db> for PathSegmentMissing<'db> {
2391 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2392 type StablePtr = PathSegmentMissingPtr<'db>;
2393 type Green = PathSegmentMissingGreen<'db>;
2394 fn missing(db: &'db dyn Database) -> Self::Green {
2395 PathSegmentMissingGreen(
2396 GreenNode {
2397 kind: SyntaxKind::PathSegmentMissing,
2398 details: GreenNodeDetails::Node {
2399 children: [TerminalIdentifier::missing(db).0].into(),
2400 width: TextWidth::default(),
2401 },
2402 }
2403 .intern(db),
2404 )
2405 }
2406 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2407 let kind = node.kind(db);
2408 assert_eq!(
2409 kind,
2410 SyntaxKind::PathSegmentMissing,
2411 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2412 kind,
2413 SyntaxKind::PathSegmentMissing
2414 );
2415 Self { node }
2416 }
2417 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2418 let kind = node.kind(db);
2419 if kind == SyntaxKind::PathSegmentMissing {
2420 Some(Self::from_syntax_node(db, node))
2421 } else {
2422 None
2423 }
2424 }
2425 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2426 self.node
2427 }
2428 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2429 PathSegmentMissingPtr(self.node.stable_ptr(db))
2430 }
2431}
2432#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2433pub struct ExprPathInner<'db>(ElementList<'db, PathSegment<'db>, 2>);
2434impl<'db> Deref for ExprPathInner<'db> {
2435 type Target = ElementList<'db, PathSegment<'db>, 2>;
2436 fn deref(&self) -> &Self::Target {
2437 &self.0
2438 }
2439}
2440impl<'db> ExprPathInner<'db> {
2441 pub fn new_green(
2442 db: &'db dyn Database,
2443 children: &[ExprPathInnerElementOrSeparatorGreen<'db>],
2444 ) -> ExprPathInnerGreen<'db> {
2445 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
2446 ExprPathInnerGreen(
2447 GreenNode {
2448 kind: SyntaxKind::ExprPathInner,
2449 details: GreenNodeDetails::Node {
2450 children: children.iter().map(|x| x.id()).collect(),
2451 width,
2452 },
2453 }
2454 .intern(db),
2455 )
2456 }
2457}
2458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2459pub struct ExprPathInnerPtr<'db>(pub SyntaxStablePtrId<'db>);
2460impl<'db> TypedStablePtr<'db> for ExprPathInnerPtr<'db> {
2461 type SyntaxNode = ExprPathInner<'db>;
2462 fn untyped(self) -> SyntaxStablePtrId<'db> {
2463 self.0
2464 }
2465 fn lookup(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2466 ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2467 }
2468}
2469impl<'db> From<ExprPathInnerPtr<'db>> for SyntaxStablePtrId<'db> {
2470 fn from(ptr: ExprPathInnerPtr<'db>) -> Self {
2471 ptr.untyped()
2472 }
2473}
2474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2475pub enum ExprPathInnerElementOrSeparatorGreen<'db> {
2476 Separator(TerminalColonColonGreen<'db>),
2477 Element(PathSegmentGreen<'db>),
2478}
2479impl<'db> From<TerminalColonColonGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2480 fn from(value: TerminalColonColonGreen<'db>) -> Self {
2481 ExprPathInnerElementOrSeparatorGreen::Separator(value)
2482 }
2483}
2484impl<'db> From<PathSegmentGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2485 fn from(value: PathSegmentGreen<'db>) -> Self {
2486 ExprPathInnerElementOrSeparatorGreen::Element(value)
2487 }
2488}
2489impl<'db> ExprPathInnerElementOrSeparatorGreen<'db> {
2490 fn id(&self) -> GreenId<'db> {
2491 match self {
2492 ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2493 ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2494 }
2495 }
2496}
2497#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2498pub struct ExprPathInnerGreen<'db>(pub GreenId<'db>);
2499impl<'db> TypedSyntaxNode<'db> for ExprPathInner<'db> {
2500 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2501 type StablePtr = ExprPathInnerPtr<'db>;
2502 type Green = ExprPathInnerGreen<'db>;
2503 fn missing(db: &'db dyn Database) -> Self::Green {
2504 ExprPathInnerGreen(
2505 GreenNode {
2506 kind: SyntaxKind::ExprPathInner,
2507 details: GreenNodeDetails::Node {
2508 children: [].into(),
2509 width: TextWidth::default(),
2510 },
2511 }
2512 .intern(db),
2513 )
2514 }
2515 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2516 Self(ElementList::new(node))
2517 }
2518 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2519 if node.kind(db) == SyntaxKind::ExprPathInner {
2520 Some(Self(ElementList::new(node)))
2521 } else {
2522 None
2523 }
2524 }
2525 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2526 self.node
2527 }
2528 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2529 ExprPathInnerPtr(self.node.stable_ptr(db))
2530 }
2531}
2532#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2533pub struct ExprParenthesized<'db> {
2534 node: SyntaxNode<'db>,
2535}
2536impl<'db> ExprParenthesized<'db> {
2537 pub const INDEX_LPAREN: usize = 0;
2538 pub const INDEX_EXPR: usize = 1;
2539 pub const INDEX_RPAREN: usize = 2;
2540 pub fn new_green(
2541 db: &'db dyn Database,
2542 lparen: TerminalLParenGreen<'db>,
2543 expr: ExprGreen<'db>,
2544 rparen: TerminalRParenGreen<'db>,
2545 ) -> ExprParenthesizedGreen<'db> {
2546 let children = [lparen.0, expr.0, rparen.0];
2547 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2548 ExprParenthesizedGreen(
2549 GreenNode {
2550 kind: SyntaxKind::ExprParenthesized,
2551 details: GreenNodeDetails::Node { children: children.into(), width },
2552 }
2553 .intern(db),
2554 )
2555 }
2556}
2557impl<'db> ExprParenthesized<'db> {
2558 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
2559 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2560 }
2561 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2562 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2563 }
2564 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
2565 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2566 }
2567}
2568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2569pub struct ExprParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
2570impl<'db> ExprParenthesizedPtr<'db> {}
2571impl<'db> TypedStablePtr<'db> for ExprParenthesizedPtr<'db> {
2572 type SyntaxNode = ExprParenthesized<'db>;
2573 fn untyped(self) -> SyntaxStablePtrId<'db> {
2574 self.0
2575 }
2576 fn lookup(&self, db: &'db dyn Database) -> ExprParenthesized<'db> {
2577 ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2578 }
2579}
2580impl<'db> From<ExprParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
2581 fn from(ptr: ExprParenthesizedPtr<'db>) -> Self {
2582 ptr.untyped()
2583 }
2584}
2585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2586pub struct ExprParenthesizedGreen<'db>(pub GreenId<'db>);
2587impl<'db> TypedSyntaxNode<'db> for ExprParenthesized<'db> {
2588 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2589 type StablePtr = ExprParenthesizedPtr<'db>;
2590 type Green = ExprParenthesizedGreen<'db>;
2591 fn missing(db: &'db dyn Database) -> Self::Green {
2592 ExprParenthesizedGreen(
2593 GreenNode {
2594 kind: SyntaxKind::ExprParenthesized,
2595 details: GreenNodeDetails::Node {
2596 children: [
2597 TerminalLParen::missing(db).0,
2598 Expr::missing(db).0,
2599 TerminalRParen::missing(db).0,
2600 ]
2601 .into(),
2602 width: TextWidth::default(),
2603 },
2604 }
2605 .intern(db),
2606 )
2607 }
2608 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2609 let kind = node.kind(db);
2610 assert_eq!(
2611 kind,
2612 SyntaxKind::ExprParenthesized,
2613 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2614 kind,
2615 SyntaxKind::ExprParenthesized
2616 );
2617 Self { node }
2618 }
2619 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2620 let kind = node.kind(db);
2621 if kind == SyntaxKind::ExprParenthesized {
2622 Some(Self::from_syntax_node(db, node))
2623 } else {
2624 None
2625 }
2626 }
2627 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2628 self.node
2629 }
2630 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2631 ExprParenthesizedPtr(self.node.stable_ptr(db))
2632 }
2633}
2634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2635pub struct ExprUnary<'db> {
2636 node: SyntaxNode<'db>,
2637}
2638impl<'db> ExprUnary<'db> {
2639 pub const INDEX_OP: usize = 0;
2640 pub const INDEX_EXPR: usize = 1;
2641 pub fn new_green(
2642 db: &'db dyn Database,
2643 op: UnaryOperatorGreen<'db>,
2644 expr: ExprGreen<'db>,
2645 ) -> ExprUnaryGreen<'db> {
2646 let children = [op.0, expr.0];
2647 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2648 ExprUnaryGreen(
2649 GreenNode {
2650 kind: SyntaxKind::ExprUnary,
2651 details: GreenNodeDetails::Node { children: children.into(), width },
2652 }
2653 .intern(db),
2654 )
2655 }
2656}
2657impl<'db> ExprUnary<'db> {
2658 pub fn op(&self, db: &'db dyn Database) -> UnaryOperator<'db> {
2659 UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2660 }
2661 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2662 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2663 }
2664}
2665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2666pub struct ExprUnaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2667impl<'db> ExprUnaryPtr<'db> {}
2668impl<'db> TypedStablePtr<'db> for ExprUnaryPtr<'db> {
2669 type SyntaxNode = ExprUnary<'db>;
2670 fn untyped(self) -> SyntaxStablePtrId<'db> {
2671 self.0
2672 }
2673 fn lookup(&self, db: &'db dyn Database) -> ExprUnary<'db> {
2674 ExprUnary::from_syntax_node(db, self.0.lookup(db))
2675 }
2676}
2677impl<'db> From<ExprUnaryPtr<'db>> for SyntaxStablePtrId<'db> {
2678 fn from(ptr: ExprUnaryPtr<'db>) -> Self {
2679 ptr.untyped()
2680 }
2681}
2682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2683pub struct ExprUnaryGreen<'db>(pub GreenId<'db>);
2684impl<'db> TypedSyntaxNode<'db> for ExprUnary<'db> {
2685 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2686 type StablePtr = ExprUnaryPtr<'db>;
2687 type Green = ExprUnaryGreen<'db>;
2688 fn missing(db: &'db dyn Database) -> Self::Green {
2689 ExprUnaryGreen(
2690 GreenNode {
2691 kind: SyntaxKind::ExprUnary,
2692 details: GreenNodeDetails::Node {
2693 children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2694 width: TextWidth::default(),
2695 },
2696 }
2697 .intern(db),
2698 )
2699 }
2700 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2701 let kind = node.kind(db);
2702 assert_eq!(
2703 kind,
2704 SyntaxKind::ExprUnary,
2705 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2706 kind,
2707 SyntaxKind::ExprUnary
2708 );
2709 Self { node }
2710 }
2711 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2712 let kind = node.kind(db);
2713 if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2714 }
2715 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2716 self.node
2717 }
2718 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2719 ExprUnaryPtr(self.node.stable_ptr(db))
2720 }
2721}
2722#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2723pub enum UnaryOperator<'db> {
2724 Not(TerminalNot<'db>),
2725 BitNot(TerminalBitNot<'db>),
2726 Minus(TerminalMinus<'db>),
2727 At(TerminalAt<'db>),
2728 Desnap(TerminalMul<'db>),
2729 Reference(TerminalAnd<'db>),
2730}
2731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2732pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2733impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2734 type SyntaxNode = UnaryOperator<'db>;
2735 fn untyped(self) -> SyntaxStablePtrId<'db> {
2736 self.0
2737 }
2738 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2739 UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2740 }
2741}
2742impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2743 fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2744 ptr.untyped()
2745 }
2746}
2747impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2748 fn from(value: TerminalNotPtr<'db>) -> Self {
2749 Self(value.0)
2750 }
2751}
2752impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2753 fn from(value: TerminalBitNotPtr<'db>) -> Self {
2754 Self(value.0)
2755 }
2756}
2757impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2758 fn from(value: TerminalMinusPtr<'db>) -> Self {
2759 Self(value.0)
2760 }
2761}
2762impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2763 fn from(value: TerminalAtPtr<'db>) -> Self {
2764 Self(value.0)
2765 }
2766}
2767impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2768 fn from(value: TerminalMulPtr<'db>) -> Self {
2769 Self(value.0)
2770 }
2771}
2772impl<'db> From<TerminalAndPtr<'db>> for UnaryOperatorPtr<'db> {
2773 fn from(value: TerminalAndPtr<'db>) -> Self {
2774 Self(value.0)
2775 }
2776}
2777impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2778 fn from(value: TerminalNotGreen<'db>) -> Self {
2779 Self(value.0)
2780 }
2781}
2782impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2783 fn from(value: TerminalBitNotGreen<'db>) -> Self {
2784 Self(value.0)
2785 }
2786}
2787impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2788 fn from(value: TerminalMinusGreen<'db>) -> Self {
2789 Self(value.0)
2790 }
2791}
2792impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2793 fn from(value: TerminalAtGreen<'db>) -> Self {
2794 Self(value.0)
2795 }
2796}
2797impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2798 fn from(value: TerminalMulGreen<'db>) -> Self {
2799 Self(value.0)
2800 }
2801}
2802impl<'db> From<TerminalAndGreen<'db>> for UnaryOperatorGreen<'db> {
2803 fn from(value: TerminalAndGreen<'db>) -> Self {
2804 Self(value.0)
2805 }
2806}
2807#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2808pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2809impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2810 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2811 type StablePtr = UnaryOperatorPtr<'db>;
2812 type Green = UnaryOperatorGreen<'db>;
2813 fn missing(db: &'db dyn Database) -> Self::Green {
2814 panic!("No missing variant.");
2815 }
2816 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2817 let kind = node.kind(db);
2818 match kind {
2819 SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2820 SyntaxKind::TerminalBitNot => {
2821 UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2822 }
2823 SyntaxKind::TerminalMinus => {
2824 UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2825 }
2826 SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2827 SyntaxKind::TerminalMul => {
2828 UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2829 }
2830 SyntaxKind::TerminalAnd => {
2831 UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node))
2832 }
2833 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2834 }
2835 }
2836 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2837 let kind = node.kind(db);
2838 match kind {
2839 SyntaxKind::TerminalNot => {
2840 Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2841 }
2842 SyntaxKind::TerminalBitNot => {
2843 Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2844 }
2845 SyntaxKind::TerminalMinus => {
2846 Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2847 }
2848 SyntaxKind::TerminalAt => {
2849 Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2850 }
2851 SyntaxKind::TerminalMul => {
2852 Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2853 }
2854 SyntaxKind::TerminalAnd => {
2855 Some(UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node)))
2856 }
2857 _ => None,
2858 }
2859 }
2860 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2861 match self {
2862 UnaryOperator::Not(x) => x.as_syntax_node(),
2863 UnaryOperator::BitNot(x) => x.as_syntax_node(),
2864 UnaryOperator::Minus(x) => x.as_syntax_node(),
2865 UnaryOperator::At(x) => x.as_syntax_node(),
2866 UnaryOperator::Desnap(x) => x.as_syntax_node(),
2867 UnaryOperator::Reference(x) => x.as_syntax_node(),
2868 }
2869 }
2870 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2871 UnaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
2872 }
2873}
2874impl<'db> UnaryOperator<'db> {
2875 pub fn is_variant(kind: SyntaxKind) -> bool {
2877 matches!(
2878 kind,
2879 SyntaxKind::TerminalNot
2880 | SyntaxKind::TerminalBitNot
2881 | SyntaxKind::TerminalMinus
2882 | SyntaxKind::TerminalAt
2883 | SyntaxKind::TerminalMul
2884 | SyntaxKind::TerminalAnd
2885 )
2886 }
2887}
2888#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2889pub struct ExprBinary<'db> {
2890 node: SyntaxNode<'db>,
2891}
2892impl<'db> ExprBinary<'db> {
2893 pub const INDEX_LHS: usize = 0;
2894 pub const INDEX_OP: usize = 1;
2895 pub const INDEX_RHS: usize = 2;
2896 pub fn new_green(
2897 db: &'db dyn Database,
2898 lhs: ExprGreen<'db>,
2899 op: BinaryOperatorGreen<'db>,
2900 rhs: ExprGreen<'db>,
2901 ) -> ExprBinaryGreen<'db> {
2902 let children = [lhs.0, op.0, rhs.0];
2903 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2904 ExprBinaryGreen(
2905 GreenNode {
2906 kind: SyntaxKind::ExprBinary,
2907 details: GreenNodeDetails::Node { children: children.into(), width },
2908 }
2909 .intern(db),
2910 )
2911 }
2912}
2913impl<'db> ExprBinary<'db> {
2914 pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2915 Expr::from_syntax_node(db, self.node.get_children(db)[0])
2916 }
2917 pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2918 BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2919 }
2920 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2921 Expr::from_syntax_node(db, self.node.get_children(db)[2])
2922 }
2923}
2924#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2925pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2926impl<'db> ExprBinaryPtr<'db> {}
2927impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2928 type SyntaxNode = ExprBinary<'db>;
2929 fn untyped(self) -> SyntaxStablePtrId<'db> {
2930 self.0
2931 }
2932 fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2933 ExprBinary::from_syntax_node(db, self.0.lookup(db))
2934 }
2935}
2936impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2937 fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2938 ptr.untyped()
2939 }
2940}
2941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2942pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2943impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2944 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2945 type StablePtr = ExprBinaryPtr<'db>;
2946 type Green = ExprBinaryGreen<'db>;
2947 fn missing(db: &'db dyn Database) -> Self::Green {
2948 ExprBinaryGreen(
2949 GreenNode {
2950 kind: SyntaxKind::ExprBinary,
2951 details: GreenNodeDetails::Node {
2952 children: [
2953 Expr::missing(db).0,
2954 BinaryOperator::missing(db).0,
2955 Expr::missing(db).0,
2956 ]
2957 .into(),
2958 width: TextWidth::default(),
2959 },
2960 }
2961 .intern(db),
2962 )
2963 }
2964 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2965 let kind = node.kind(db);
2966 assert_eq!(
2967 kind,
2968 SyntaxKind::ExprBinary,
2969 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2970 kind,
2971 SyntaxKind::ExprBinary
2972 );
2973 Self { node }
2974 }
2975 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2976 let kind = node.kind(db);
2977 if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2978 }
2979 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2980 self.node
2981 }
2982 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2983 ExprBinaryPtr(self.node.stable_ptr(db))
2984 }
2985}
2986#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2987pub enum BinaryOperator<'db> {
2988 Dot(TerminalDot<'db>),
2989 Not(TerminalNot<'db>),
2990 Mul(TerminalMul<'db>),
2991 MulEq(TerminalMulEq<'db>),
2992 Div(TerminalDiv<'db>),
2993 DivEq(TerminalDivEq<'db>),
2994 Mod(TerminalMod<'db>),
2995 ModEq(TerminalModEq<'db>),
2996 Plus(TerminalPlus<'db>),
2997 PlusEq(TerminalPlusEq<'db>),
2998 Minus(TerminalMinus<'db>),
2999 MinusEq(TerminalMinusEq<'db>),
3000 EqEq(TerminalEqEq<'db>),
3001 Neq(TerminalNeq<'db>),
3002 Eq(TerminalEq<'db>),
3003 And(TerminalAnd<'db>),
3004 AndAnd(TerminalAndAnd<'db>),
3005 Or(TerminalOr<'db>),
3006 OrOr(TerminalOrOr<'db>),
3007 Xor(TerminalXor<'db>),
3008 LE(TerminalLE<'db>),
3009 GE(TerminalGE<'db>),
3010 LT(TerminalLT<'db>),
3011 GT(TerminalGT<'db>),
3012 DotDot(TerminalDotDot<'db>),
3013 DotDotEq(TerminalDotDotEq<'db>),
3014}
3015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3016pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
3017impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
3018 type SyntaxNode = BinaryOperator<'db>;
3019 fn untyped(self) -> SyntaxStablePtrId<'db> {
3020 self.0
3021 }
3022 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3023 BinaryOperator::from_syntax_node(db, self.0.lookup(db))
3024 }
3025}
3026impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
3027 fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
3028 ptr.untyped()
3029 }
3030}
3031impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
3032 fn from(value: TerminalDotPtr<'db>) -> Self {
3033 Self(value.0)
3034 }
3035}
3036impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
3037 fn from(value: TerminalNotPtr<'db>) -> Self {
3038 Self(value.0)
3039 }
3040}
3041impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3042 fn from(value: TerminalMulPtr<'db>) -> Self {
3043 Self(value.0)
3044 }
3045}
3046impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3047 fn from(value: TerminalMulEqPtr<'db>) -> Self {
3048 Self(value.0)
3049 }
3050}
3051impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3052 fn from(value: TerminalDivPtr<'db>) -> Self {
3053 Self(value.0)
3054 }
3055}
3056impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3057 fn from(value: TerminalDivEqPtr<'db>) -> Self {
3058 Self(value.0)
3059 }
3060}
3061impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3062 fn from(value: TerminalModPtr<'db>) -> Self {
3063 Self(value.0)
3064 }
3065}
3066impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3067 fn from(value: TerminalModEqPtr<'db>) -> Self {
3068 Self(value.0)
3069 }
3070}
3071impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3072 fn from(value: TerminalPlusPtr<'db>) -> Self {
3073 Self(value.0)
3074 }
3075}
3076impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3077 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3078 Self(value.0)
3079 }
3080}
3081impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3082 fn from(value: TerminalMinusPtr<'db>) -> Self {
3083 Self(value.0)
3084 }
3085}
3086impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3087 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3088 Self(value.0)
3089 }
3090}
3091impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3092 fn from(value: TerminalEqEqPtr<'db>) -> Self {
3093 Self(value.0)
3094 }
3095}
3096impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3097 fn from(value: TerminalNeqPtr<'db>) -> Self {
3098 Self(value.0)
3099 }
3100}
3101impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3102 fn from(value: TerminalEqPtr<'db>) -> Self {
3103 Self(value.0)
3104 }
3105}
3106impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3107 fn from(value: TerminalAndPtr<'db>) -> Self {
3108 Self(value.0)
3109 }
3110}
3111impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3112 fn from(value: TerminalAndAndPtr<'db>) -> Self {
3113 Self(value.0)
3114 }
3115}
3116impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3117 fn from(value: TerminalOrPtr<'db>) -> Self {
3118 Self(value.0)
3119 }
3120}
3121impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3122 fn from(value: TerminalOrOrPtr<'db>) -> Self {
3123 Self(value.0)
3124 }
3125}
3126impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3127 fn from(value: TerminalXorPtr<'db>) -> Self {
3128 Self(value.0)
3129 }
3130}
3131impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3132 fn from(value: TerminalLEPtr<'db>) -> Self {
3133 Self(value.0)
3134 }
3135}
3136impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3137 fn from(value: TerminalGEPtr<'db>) -> Self {
3138 Self(value.0)
3139 }
3140}
3141impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3142 fn from(value: TerminalLTPtr<'db>) -> Self {
3143 Self(value.0)
3144 }
3145}
3146impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3147 fn from(value: TerminalGTPtr<'db>) -> Self {
3148 Self(value.0)
3149 }
3150}
3151impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3152 fn from(value: TerminalDotDotPtr<'db>) -> Self {
3153 Self(value.0)
3154 }
3155}
3156impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3157 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3158 Self(value.0)
3159 }
3160}
3161impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3162 fn from(value: TerminalDotGreen<'db>) -> Self {
3163 Self(value.0)
3164 }
3165}
3166impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3167 fn from(value: TerminalNotGreen<'db>) -> Self {
3168 Self(value.0)
3169 }
3170}
3171impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3172 fn from(value: TerminalMulGreen<'db>) -> Self {
3173 Self(value.0)
3174 }
3175}
3176impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3177 fn from(value: TerminalMulEqGreen<'db>) -> Self {
3178 Self(value.0)
3179 }
3180}
3181impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3182 fn from(value: TerminalDivGreen<'db>) -> Self {
3183 Self(value.0)
3184 }
3185}
3186impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3187 fn from(value: TerminalDivEqGreen<'db>) -> Self {
3188 Self(value.0)
3189 }
3190}
3191impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3192 fn from(value: TerminalModGreen<'db>) -> Self {
3193 Self(value.0)
3194 }
3195}
3196impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3197 fn from(value: TerminalModEqGreen<'db>) -> Self {
3198 Self(value.0)
3199 }
3200}
3201impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3202 fn from(value: TerminalPlusGreen<'db>) -> Self {
3203 Self(value.0)
3204 }
3205}
3206impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3207 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3208 Self(value.0)
3209 }
3210}
3211impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3212 fn from(value: TerminalMinusGreen<'db>) -> Self {
3213 Self(value.0)
3214 }
3215}
3216impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3217 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3218 Self(value.0)
3219 }
3220}
3221impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3222 fn from(value: TerminalEqEqGreen<'db>) -> Self {
3223 Self(value.0)
3224 }
3225}
3226impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3227 fn from(value: TerminalNeqGreen<'db>) -> Self {
3228 Self(value.0)
3229 }
3230}
3231impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3232 fn from(value: TerminalEqGreen<'db>) -> Self {
3233 Self(value.0)
3234 }
3235}
3236impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3237 fn from(value: TerminalAndGreen<'db>) -> Self {
3238 Self(value.0)
3239 }
3240}
3241impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3242 fn from(value: TerminalAndAndGreen<'db>) -> Self {
3243 Self(value.0)
3244 }
3245}
3246impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3247 fn from(value: TerminalOrGreen<'db>) -> Self {
3248 Self(value.0)
3249 }
3250}
3251impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3252 fn from(value: TerminalOrOrGreen<'db>) -> Self {
3253 Self(value.0)
3254 }
3255}
3256impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3257 fn from(value: TerminalXorGreen<'db>) -> Self {
3258 Self(value.0)
3259 }
3260}
3261impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3262 fn from(value: TerminalLEGreen<'db>) -> Self {
3263 Self(value.0)
3264 }
3265}
3266impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3267 fn from(value: TerminalGEGreen<'db>) -> Self {
3268 Self(value.0)
3269 }
3270}
3271impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3272 fn from(value: TerminalLTGreen<'db>) -> Self {
3273 Self(value.0)
3274 }
3275}
3276impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3277 fn from(value: TerminalGTGreen<'db>) -> Self {
3278 Self(value.0)
3279 }
3280}
3281impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3282 fn from(value: TerminalDotDotGreen<'db>) -> Self {
3283 Self(value.0)
3284 }
3285}
3286impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3287 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3288 Self(value.0)
3289 }
3290}
3291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3292pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3293impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3294 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3295 type StablePtr = BinaryOperatorPtr<'db>;
3296 type Green = BinaryOperatorGreen<'db>;
3297 fn missing(db: &'db dyn Database) -> Self::Green {
3298 panic!("No missing variant.");
3299 }
3300 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3301 let kind = node.kind(db);
3302 match kind {
3303 SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3304 SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3305 SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3306 SyntaxKind::TerminalMulEq => {
3307 BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3308 }
3309 SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3310 SyntaxKind::TerminalDivEq => {
3311 BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3312 }
3313 SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3314 SyntaxKind::TerminalModEq => {
3315 BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3316 }
3317 SyntaxKind::TerminalPlus => {
3318 BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3319 }
3320 SyntaxKind::TerminalPlusEq => {
3321 BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3322 }
3323 SyntaxKind::TerminalMinus => {
3324 BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3325 }
3326 SyntaxKind::TerminalMinusEq => {
3327 BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3328 }
3329 SyntaxKind::TerminalEqEq => {
3330 BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3331 }
3332 SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3333 SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3334 SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3335 SyntaxKind::TerminalAndAnd => {
3336 BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3337 }
3338 SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3339 SyntaxKind::TerminalOrOr => {
3340 BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3341 }
3342 SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3343 SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3344 SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3345 SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3346 SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3347 SyntaxKind::TerminalDotDot => {
3348 BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3349 }
3350 SyntaxKind::TerminalDotDotEq => {
3351 BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3352 }
3353 _ => {
3354 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3355 }
3356 }
3357 }
3358 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3359 let kind = node.kind(db);
3360 match kind {
3361 SyntaxKind::TerminalDot => {
3362 Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3363 }
3364 SyntaxKind::TerminalNot => {
3365 Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3366 }
3367 SyntaxKind::TerminalMul => {
3368 Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3369 }
3370 SyntaxKind::TerminalMulEq => {
3371 Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3372 }
3373 SyntaxKind::TerminalDiv => {
3374 Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3375 }
3376 SyntaxKind::TerminalDivEq => {
3377 Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3378 }
3379 SyntaxKind::TerminalMod => {
3380 Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3381 }
3382 SyntaxKind::TerminalModEq => {
3383 Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3384 }
3385 SyntaxKind::TerminalPlus => {
3386 Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3387 }
3388 SyntaxKind::TerminalPlusEq => {
3389 Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3390 }
3391 SyntaxKind::TerminalMinus => {
3392 Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3393 }
3394 SyntaxKind::TerminalMinusEq => {
3395 Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3396 }
3397 SyntaxKind::TerminalEqEq => {
3398 Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3399 }
3400 SyntaxKind::TerminalNeq => {
3401 Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3402 }
3403 SyntaxKind::TerminalEq => {
3404 Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3405 }
3406 SyntaxKind::TerminalAnd => {
3407 Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3408 }
3409 SyntaxKind::TerminalAndAnd => {
3410 Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3411 }
3412 SyntaxKind::TerminalOr => {
3413 Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3414 }
3415 SyntaxKind::TerminalOrOr => {
3416 Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3417 }
3418 SyntaxKind::TerminalXor => {
3419 Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3420 }
3421 SyntaxKind::TerminalLE => {
3422 Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3423 }
3424 SyntaxKind::TerminalGE => {
3425 Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3426 }
3427 SyntaxKind::TerminalLT => {
3428 Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3429 }
3430 SyntaxKind::TerminalGT => {
3431 Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3432 }
3433 SyntaxKind::TerminalDotDot => {
3434 Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3435 }
3436 SyntaxKind::TerminalDotDotEq => {
3437 Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3438 }
3439 _ => None,
3440 }
3441 }
3442 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3443 match self {
3444 BinaryOperator::Dot(x) => x.as_syntax_node(),
3445 BinaryOperator::Not(x) => x.as_syntax_node(),
3446 BinaryOperator::Mul(x) => x.as_syntax_node(),
3447 BinaryOperator::MulEq(x) => x.as_syntax_node(),
3448 BinaryOperator::Div(x) => x.as_syntax_node(),
3449 BinaryOperator::DivEq(x) => x.as_syntax_node(),
3450 BinaryOperator::Mod(x) => x.as_syntax_node(),
3451 BinaryOperator::ModEq(x) => x.as_syntax_node(),
3452 BinaryOperator::Plus(x) => x.as_syntax_node(),
3453 BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3454 BinaryOperator::Minus(x) => x.as_syntax_node(),
3455 BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3456 BinaryOperator::EqEq(x) => x.as_syntax_node(),
3457 BinaryOperator::Neq(x) => x.as_syntax_node(),
3458 BinaryOperator::Eq(x) => x.as_syntax_node(),
3459 BinaryOperator::And(x) => x.as_syntax_node(),
3460 BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3461 BinaryOperator::Or(x) => x.as_syntax_node(),
3462 BinaryOperator::OrOr(x) => x.as_syntax_node(),
3463 BinaryOperator::Xor(x) => x.as_syntax_node(),
3464 BinaryOperator::LE(x) => x.as_syntax_node(),
3465 BinaryOperator::GE(x) => x.as_syntax_node(),
3466 BinaryOperator::LT(x) => x.as_syntax_node(),
3467 BinaryOperator::GT(x) => x.as_syntax_node(),
3468 BinaryOperator::DotDot(x) => x.as_syntax_node(),
3469 BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3470 }
3471 }
3472 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3473 BinaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
3474 }
3475}
3476impl<'db> BinaryOperator<'db> {
3477 pub fn is_variant(kind: SyntaxKind) -> bool {
3479 matches!(
3480 kind,
3481 SyntaxKind::TerminalDot
3482 | SyntaxKind::TerminalNot
3483 | SyntaxKind::TerminalMul
3484 | SyntaxKind::TerminalMulEq
3485 | SyntaxKind::TerminalDiv
3486 | SyntaxKind::TerminalDivEq
3487 | SyntaxKind::TerminalMod
3488 | SyntaxKind::TerminalModEq
3489 | SyntaxKind::TerminalPlus
3490 | SyntaxKind::TerminalPlusEq
3491 | SyntaxKind::TerminalMinus
3492 | SyntaxKind::TerminalMinusEq
3493 | SyntaxKind::TerminalEqEq
3494 | SyntaxKind::TerminalNeq
3495 | SyntaxKind::TerminalEq
3496 | SyntaxKind::TerminalAnd
3497 | SyntaxKind::TerminalAndAnd
3498 | SyntaxKind::TerminalOr
3499 | SyntaxKind::TerminalOrOr
3500 | SyntaxKind::TerminalXor
3501 | SyntaxKind::TerminalLE
3502 | SyntaxKind::TerminalGE
3503 | SyntaxKind::TerminalLT
3504 | SyntaxKind::TerminalGT
3505 | SyntaxKind::TerminalDotDot
3506 | SyntaxKind::TerminalDotDotEq
3507 )
3508 }
3509}
3510#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3511pub struct ExprListParenthesized<'db> {
3512 node: SyntaxNode<'db>,
3513}
3514impl<'db> ExprListParenthesized<'db> {
3515 pub const INDEX_LPAREN: usize = 0;
3516 pub const INDEX_EXPRESSIONS: usize = 1;
3517 pub const INDEX_RPAREN: usize = 2;
3518 pub fn new_green(
3519 db: &'db dyn Database,
3520 lparen: TerminalLParenGreen<'db>,
3521 expressions: ExprListGreen<'db>,
3522 rparen: TerminalRParenGreen<'db>,
3523 ) -> ExprListParenthesizedGreen<'db> {
3524 let children = [lparen.0, expressions.0, rparen.0];
3525 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3526 ExprListParenthesizedGreen(
3527 GreenNode {
3528 kind: SyntaxKind::ExprListParenthesized,
3529 details: GreenNodeDetails::Node { children: children.into(), width },
3530 }
3531 .intern(db),
3532 )
3533 }
3534}
3535impl<'db> ExprListParenthesized<'db> {
3536 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3537 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3538 }
3539 pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3540 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3541 }
3542 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3543 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3544 }
3545}
3546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3547pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3548impl<'db> ExprListParenthesizedPtr<'db> {}
3549impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3550 type SyntaxNode = ExprListParenthesized<'db>;
3551 fn untyped(self) -> SyntaxStablePtrId<'db> {
3552 self.0
3553 }
3554 fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3555 ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3556 }
3557}
3558impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3559 fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3560 ptr.untyped()
3561 }
3562}
3563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3564pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3565impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3566 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3567 type StablePtr = ExprListParenthesizedPtr<'db>;
3568 type Green = ExprListParenthesizedGreen<'db>;
3569 fn missing(db: &'db dyn Database) -> Self::Green {
3570 ExprListParenthesizedGreen(
3571 GreenNode {
3572 kind: SyntaxKind::ExprListParenthesized,
3573 details: GreenNodeDetails::Node {
3574 children: [
3575 TerminalLParen::missing(db).0,
3576 ExprList::missing(db).0,
3577 TerminalRParen::missing(db).0,
3578 ]
3579 .into(),
3580 width: TextWidth::default(),
3581 },
3582 }
3583 .intern(db),
3584 )
3585 }
3586 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3587 let kind = node.kind(db);
3588 assert_eq!(
3589 kind,
3590 SyntaxKind::ExprListParenthesized,
3591 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3592 kind,
3593 SyntaxKind::ExprListParenthesized
3594 );
3595 Self { node }
3596 }
3597 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3598 let kind = node.kind(db);
3599 if kind == SyntaxKind::ExprListParenthesized {
3600 Some(Self::from_syntax_node(db, node))
3601 } else {
3602 None
3603 }
3604 }
3605 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3606 self.node
3607 }
3608 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3609 ExprListParenthesizedPtr(self.node.stable_ptr(db))
3610 }
3611}
3612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3613pub struct ExprFunctionCall<'db> {
3614 node: SyntaxNode<'db>,
3615}
3616impl<'db> ExprFunctionCall<'db> {
3617 pub const INDEX_PATH: usize = 0;
3618 pub const INDEX_ARGUMENTS: usize = 1;
3619 pub fn new_green(
3620 db: &'db dyn Database,
3621 path: ExprPathGreen<'db>,
3622 arguments: ArgListParenthesizedGreen<'db>,
3623 ) -> ExprFunctionCallGreen<'db> {
3624 let children = [path.0, arguments.0];
3625 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3626 ExprFunctionCallGreen(
3627 GreenNode {
3628 kind: SyntaxKind::ExprFunctionCall,
3629 details: GreenNodeDetails::Node { children: children.into(), width },
3630 }
3631 .intern(db),
3632 )
3633 }
3634}
3635impl<'db> ExprFunctionCall<'db> {
3636 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3637 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3638 }
3639 pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3640 ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3641 }
3642}
3643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3644pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3645impl<'db> ExprFunctionCallPtr<'db> {}
3646impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3647 type SyntaxNode = ExprFunctionCall<'db>;
3648 fn untyped(self) -> SyntaxStablePtrId<'db> {
3649 self.0
3650 }
3651 fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3652 ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3653 }
3654}
3655impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3656 fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3657 ptr.untyped()
3658 }
3659}
3660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3661pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3662impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3663 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3664 type StablePtr = ExprFunctionCallPtr<'db>;
3665 type Green = ExprFunctionCallGreen<'db>;
3666 fn missing(db: &'db dyn Database) -> Self::Green {
3667 ExprFunctionCallGreen(
3668 GreenNode {
3669 kind: SyntaxKind::ExprFunctionCall,
3670 details: GreenNodeDetails::Node {
3671 children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3672 width: TextWidth::default(),
3673 },
3674 }
3675 .intern(db),
3676 )
3677 }
3678 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3679 let kind = node.kind(db);
3680 assert_eq!(
3681 kind,
3682 SyntaxKind::ExprFunctionCall,
3683 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3684 kind,
3685 SyntaxKind::ExprFunctionCall
3686 );
3687 Self { node }
3688 }
3689 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3690 let kind = node.kind(db);
3691 if kind == SyntaxKind::ExprFunctionCall {
3692 Some(Self::from_syntax_node(db, node))
3693 } else {
3694 None
3695 }
3696 }
3697 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3698 self.node
3699 }
3700 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3701 ExprFunctionCallPtr(self.node.stable_ptr(db))
3702 }
3703}
3704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3705pub struct ArgListParenthesized<'db> {
3706 node: SyntaxNode<'db>,
3707}
3708impl<'db> ArgListParenthesized<'db> {
3709 pub const INDEX_LPAREN: usize = 0;
3710 pub const INDEX_ARGUMENTS: usize = 1;
3711 pub const INDEX_RPAREN: usize = 2;
3712 pub fn new_green(
3713 db: &'db dyn Database,
3714 lparen: TerminalLParenGreen<'db>,
3715 arguments: ArgListGreen<'db>,
3716 rparen: TerminalRParenGreen<'db>,
3717 ) -> ArgListParenthesizedGreen<'db> {
3718 let children = [lparen.0, arguments.0, rparen.0];
3719 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3720 ArgListParenthesizedGreen(
3721 GreenNode {
3722 kind: SyntaxKind::ArgListParenthesized,
3723 details: GreenNodeDetails::Node { children: children.into(), width },
3724 }
3725 .intern(db),
3726 )
3727 }
3728}
3729impl<'db> ArgListParenthesized<'db> {
3730 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3731 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3732 }
3733 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3734 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3735 }
3736 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3737 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3738 }
3739}
3740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3741pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3742impl<'db> ArgListParenthesizedPtr<'db> {}
3743impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3744 type SyntaxNode = ArgListParenthesized<'db>;
3745 fn untyped(self) -> SyntaxStablePtrId<'db> {
3746 self.0
3747 }
3748 fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3749 ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3750 }
3751}
3752impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3753 fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3754 ptr.untyped()
3755 }
3756}
3757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3758pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3759impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3760 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3761 type StablePtr = ArgListParenthesizedPtr<'db>;
3762 type Green = ArgListParenthesizedGreen<'db>;
3763 fn missing(db: &'db dyn Database) -> Self::Green {
3764 ArgListParenthesizedGreen(
3765 GreenNode {
3766 kind: SyntaxKind::ArgListParenthesized,
3767 details: GreenNodeDetails::Node {
3768 children: [
3769 TerminalLParen::missing(db).0,
3770 ArgList::missing(db).0,
3771 TerminalRParen::missing(db).0,
3772 ]
3773 .into(),
3774 width: TextWidth::default(),
3775 },
3776 }
3777 .intern(db),
3778 )
3779 }
3780 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3781 let kind = node.kind(db);
3782 assert_eq!(
3783 kind,
3784 SyntaxKind::ArgListParenthesized,
3785 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3786 kind,
3787 SyntaxKind::ArgListParenthesized
3788 );
3789 Self { node }
3790 }
3791 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3792 let kind = node.kind(db);
3793 if kind == SyntaxKind::ArgListParenthesized {
3794 Some(Self::from_syntax_node(db, node))
3795 } else {
3796 None
3797 }
3798 }
3799 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3800 self.node
3801 }
3802 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3803 ArgListParenthesizedPtr(self.node.stable_ptr(db))
3804 }
3805}
3806#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3807pub enum OptionArgListParenthesized<'db> {
3808 Empty(OptionArgListParenthesizedEmpty<'db>),
3809 ArgListParenthesized(ArgListParenthesized<'db>),
3810}
3811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3812pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3813impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3814 type SyntaxNode = OptionArgListParenthesized<'db>;
3815 fn untyped(self) -> SyntaxStablePtrId<'db> {
3816 self.0
3817 }
3818 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3819 OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3820 }
3821}
3822impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3823 fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3824 ptr.untyped()
3825 }
3826}
3827impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3828 fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3829 Self(value.0)
3830 }
3831}
3832impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3833 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3834 Self(value.0)
3835 }
3836}
3837impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3838 fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3839 Self(value.0)
3840 }
3841}
3842impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3843 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3844 Self(value.0)
3845 }
3846}
3847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3848pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3849impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3850 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3851 type StablePtr = OptionArgListParenthesizedPtr<'db>;
3852 type Green = OptionArgListParenthesizedGreen<'db>;
3853 fn missing(db: &'db dyn Database) -> Self::Green {
3854 panic!("No missing variant.");
3855 }
3856 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3857 let kind = node.kind(db);
3858 match kind {
3859 SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3860 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3861 ),
3862 SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3863 ArgListParenthesized::from_syntax_node(db, node),
3864 ),
3865 _ => panic!(
3866 "Unexpected syntax kind {:?} when constructing {}.",
3867 kind, "OptionArgListParenthesized"
3868 ),
3869 }
3870 }
3871 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3872 let kind = node.kind(db);
3873 match kind {
3874 SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3875 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3876 )),
3877 SyntaxKind::ArgListParenthesized => {
3878 Some(OptionArgListParenthesized::ArgListParenthesized(
3879 ArgListParenthesized::from_syntax_node(db, node),
3880 ))
3881 }
3882 _ => None,
3883 }
3884 }
3885 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3886 match self {
3887 OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3888 OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3889 }
3890 }
3891 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3892 OptionArgListParenthesizedPtr(self.as_syntax_node().stable_ptr(db))
3893 }
3894}
3895impl<'db> OptionArgListParenthesized<'db> {
3896 pub fn is_variant(kind: SyntaxKind) -> bool {
3898 matches!(
3899 kind,
3900 SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3901 )
3902 }
3903}
3904#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3905pub struct OptionArgListParenthesizedEmpty<'db> {
3906 node: SyntaxNode<'db>,
3907}
3908impl<'db> OptionArgListParenthesizedEmpty<'db> {
3909 pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3910 let children = [];
3911 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3912 OptionArgListParenthesizedEmptyGreen(
3913 GreenNode {
3914 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3915 details: GreenNodeDetails::Node { children: children.into(), width },
3916 }
3917 .intern(db),
3918 )
3919 }
3920}
3921impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3922#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3923pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3924impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3925impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3926 type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3927 fn untyped(self) -> SyntaxStablePtrId<'db> {
3928 self.0
3929 }
3930 fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3931 OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3932 }
3933}
3934impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3935 fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3936 ptr.untyped()
3937 }
3938}
3939#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3940pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3941impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3942 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3943 type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3944 type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3945 fn missing(db: &'db dyn Database) -> Self::Green {
3946 OptionArgListParenthesizedEmptyGreen(
3947 GreenNode {
3948 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3949 details: GreenNodeDetails::Node {
3950 children: [].into(),
3951 width: TextWidth::default(),
3952 },
3953 }
3954 .intern(db),
3955 )
3956 }
3957 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3958 let kind = node.kind(db);
3959 assert_eq!(
3960 kind,
3961 SyntaxKind::OptionArgListParenthesizedEmpty,
3962 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3963 kind,
3964 SyntaxKind::OptionArgListParenthesizedEmpty
3965 );
3966 Self { node }
3967 }
3968 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3969 let kind = node.kind(db);
3970 if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3971 Some(Self::from_syntax_node(db, node))
3972 } else {
3973 None
3974 }
3975 }
3976 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3977 self.node
3978 }
3979 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3980 OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3981 }
3982}
3983#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3984pub struct ExprStructCtorCall<'db> {
3985 node: SyntaxNode<'db>,
3986}
3987impl<'db> ExprStructCtorCall<'db> {
3988 pub const INDEX_PATH: usize = 0;
3989 pub const INDEX_ARGUMENTS: usize = 1;
3990 pub fn new_green(
3991 db: &'db dyn Database,
3992 path: ExprPathGreen<'db>,
3993 arguments: StructArgListBracedGreen<'db>,
3994 ) -> ExprStructCtorCallGreen<'db> {
3995 let children = [path.0, arguments.0];
3996 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3997 ExprStructCtorCallGreen(
3998 GreenNode {
3999 kind: SyntaxKind::ExprStructCtorCall,
4000 details: GreenNodeDetails::Node { children: children.into(), width },
4001 }
4002 .intern(db),
4003 )
4004 }
4005}
4006impl<'db> ExprStructCtorCall<'db> {
4007 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
4008 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
4009 }
4010 pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4011 StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
4012 }
4013}
4014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4015pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
4016impl<'db> ExprStructCtorCallPtr<'db> {}
4017impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
4018 type SyntaxNode = ExprStructCtorCall<'db>;
4019 fn untyped(self) -> SyntaxStablePtrId<'db> {
4020 self.0
4021 }
4022 fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
4023 ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
4024 }
4025}
4026impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
4027 fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
4028 ptr.untyped()
4029 }
4030}
4031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4032pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
4033impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
4034 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
4035 type StablePtr = ExprStructCtorCallPtr<'db>;
4036 type Green = ExprStructCtorCallGreen<'db>;
4037 fn missing(db: &'db dyn Database) -> Self::Green {
4038 ExprStructCtorCallGreen(
4039 GreenNode {
4040 kind: SyntaxKind::ExprStructCtorCall,
4041 details: GreenNodeDetails::Node {
4042 children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4043 width: TextWidth::default(),
4044 },
4045 }
4046 .intern(db),
4047 )
4048 }
4049 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4050 let kind = node.kind(db);
4051 assert_eq!(
4052 kind,
4053 SyntaxKind::ExprStructCtorCall,
4054 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4055 kind,
4056 SyntaxKind::ExprStructCtorCall
4057 );
4058 Self { node }
4059 }
4060 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4061 let kind = node.kind(db);
4062 if kind == SyntaxKind::ExprStructCtorCall {
4063 Some(Self::from_syntax_node(db, node))
4064 } else {
4065 None
4066 }
4067 }
4068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4069 self.node
4070 }
4071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4072 ExprStructCtorCallPtr(self.node.stable_ptr(db))
4073 }
4074}
4075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4076pub struct StructArgListBraced<'db> {
4077 node: SyntaxNode<'db>,
4078}
4079impl<'db> StructArgListBraced<'db> {
4080 pub const INDEX_LBRACE: usize = 0;
4081 pub const INDEX_ARGUMENTS: usize = 1;
4082 pub const INDEX_RBRACE: usize = 2;
4083 pub fn new_green(
4084 db: &'db dyn Database,
4085 lbrace: TerminalLBraceGreen<'db>,
4086 arguments: StructArgListGreen<'db>,
4087 rbrace: TerminalRBraceGreen<'db>,
4088 ) -> StructArgListBracedGreen<'db> {
4089 let children = [lbrace.0, arguments.0, rbrace.0];
4090 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4091 StructArgListBracedGreen(
4092 GreenNode {
4093 kind: SyntaxKind::StructArgListBraced,
4094 details: GreenNodeDetails::Node { children: children.into(), width },
4095 }
4096 .intern(db),
4097 )
4098 }
4099}
4100impl<'db> StructArgListBraced<'db> {
4101 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4102 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4103 }
4104 pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4105 StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4106 }
4107 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4108 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4109 }
4110}
4111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4112pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4113impl<'db> StructArgListBracedPtr<'db> {}
4114impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4115 type SyntaxNode = StructArgListBraced<'db>;
4116 fn untyped(self) -> SyntaxStablePtrId<'db> {
4117 self.0
4118 }
4119 fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4120 StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4121 }
4122}
4123impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4124 fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4125 ptr.untyped()
4126 }
4127}
4128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4129pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4130impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4131 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4132 type StablePtr = StructArgListBracedPtr<'db>;
4133 type Green = StructArgListBracedGreen<'db>;
4134 fn missing(db: &'db dyn Database) -> Self::Green {
4135 StructArgListBracedGreen(
4136 GreenNode {
4137 kind: SyntaxKind::StructArgListBraced,
4138 details: GreenNodeDetails::Node {
4139 children: [
4140 TerminalLBrace::missing(db).0,
4141 StructArgList::missing(db).0,
4142 TerminalRBrace::missing(db).0,
4143 ]
4144 .into(),
4145 width: TextWidth::default(),
4146 },
4147 }
4148 .intern(db),
4149 )
4150 }
4151 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4152 let kind = node.kind(db);
4153 assert_eq!(
4154 kind,
4155 SyntaxKind::StructArgListBraced,
4156 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4157 kind,
4158 SyntaxKind::StructArgListBraced
4159 );
4160 Self { node }
4161 }
4162 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4163 let kind = node.kind(db);
4164 if kind == SyntaxKind::StructArgListBraced {
4165 Some(Self::from_syntax_node(db, node))
4166 } else {
4167 None
4168 }
4169 }
4170 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4171 self.node
4172 }
4173 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4174 StructArgListBracedPtr(self.node.stable_ptr(db))
4175 }
4176}
4177#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4178pub struct ExprBlock<'db> {
4179 node: SyntaxNode<'db>,
4180}
4181impl<'db> ExprBlock<'db> {
4182 pub const INDEX_LBRACE: usize = 0;
4183 pub const INDEX_STATEMENTS: usize = 1;
4184 pub const INDEX_RBRACE: usize = 2;
4185 pub fn new_green(
4186 db: &'db dyn Database,
4187 lbrace: TerminalLBraceGreen<'db>,
4188 statements: StatementListGreen<'db>,
4189 rbrace: TerminalRBraceGreen<'db>,
4190 ) -> ExprBlockGreen<'db> {
4191 let children = [lbrace.0, statements.0, rbrace.0];
4192 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4193 ExprBlockGreen(
4194 GreenNode {
4195 kind: SyntaxKind::ExprBlock,
4196 details: GreenNodeDetails::Node { children: children.into(), width },
4197 }
4198 .intern(db),
4199 )
4200 }
4201}
4202impl<'db> ExprBlock<'db> {
4203 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4204 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4205 }
4206 pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4207 StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4208 }
4209 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4210 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4211 }
4212}
4213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4214pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4215impl<'db> ExprBlockPtr<'db> {}
4216impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4217 type SyntaxNode = ExprBlock<'db>;
4218 fn untyped(self) -> SyntaxStablePtrId<'db> {
4219 self.0
4220 }
4221 fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4222 ExprBlock::from_syntax_node(db, self.0.lookup(db))
4223 }
4224}
4225impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4226 fn from(ptr: ExprBlockPtr<'db>) -> Self {
4227 ptr.untyped()
4228 }
4229}
4230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4231pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4232impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4233 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4234 type StablePtr = ExprBlockPtr<'db>;
4235 type Green = ExprBlockGreen<'db>;
4236 fn missing(db: &'db dyn Database) -> Self::Green {
4237 ExprBlockGreen(
4238 GreenNode {
4239 kind: SyntaxKind::ExprBlock,
4240 details: GreenNodeDetails::Node {
4241 children: [
4242 TerminalLBrace::missing(db).0,
4243 StatementList::missing(db).0,
4244 TerminalRBrace::missing(db).0,
4245 ]
4246 .into(),
4247 width: TextWidth::default(),
4248 },
4249 }
4250 .intern(db),
4251 )
4252 }
4253 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4254 let kind = node.kind(db);
4255 assert_eq!(
4256 kind,
4257 SyntaxKind::ExprBlock,
4258 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4259 kind,
4260 SyntaxKind::ExprBlock
4261 );
4262 Self { node }
4263 }
4264 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4265 let kind = node.kind(db);
4266 if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4267 }
4268 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4269 self.node
4270 }
4271 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4272 ExprBlockPtr(self.node.stable_ptr(db))
4273 }
4274}
4275#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4276pub struct ExprMatch<'db> {
4277 node: SyntaxNode<'db>,
4278}
4279impl<'db> ExprMatch<'db> {
4280 pub const INDEX_MATCH_KW: usize = 0;
4281 pub const INDEX_EXPR: usize = 1;
4282 pub const INDEX_LBRACE: usize = 2;
4283 pub const INDEX_ARMS: usize = 3;
4284 pub const INDEX_RBRACE: usize = 4;
4285 pub fn new_green(
4286 db: &'db dyn Database,
4287 match_kw: TerminalMatchGreen<'db>,
4288 expr: ExprGreen<'db>,
4289 lbrace: TerminalLBraceGreen<'db>,
4290 arms: MatchArmsGreen<'db>,
4291 rbrace: TerminalRBraceGreen<'db>,
4292 ) -> ExprMatchGreen<'db> {
4293 let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4294 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4295 ExprMatchGreen(
4296 GreenNode {
4297 kind: SyntaxKind::ExprMatch,
4298 details: GreenNodeDetails::Node { children: children.into(), width },
4299 }
4300 .intern(db),
4301 )
4302 }
4303}
4304impl<'db> ExprMatch<'db> {
4305 pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4306 TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4307 }
4308 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4309 Expr::from_syntax_node(db, self.node.get_children(db)[1])
4310 }
4311 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4312 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4313 }
4314 pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4315 MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4316 }
4317 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4318 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4319 }
4320}
4321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4322pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4323impl<'db> ExprMatchPtr<'db> {}
4324impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4325 type SyntaxNode = ExprMatch<'db>;
4326 fn untyped(self) -> SyntaxStablePtrId<'db> {
4327 self.0
4328 }
4329 fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4330 ExprMatch::from_syntax_node(db, self.0.lookup(db))
4331 }
4332}
4333impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4334 fn from(ptr: ExprMatchPtr<'db>) -> Self {
4335 ptr.untyped()
4336 }
4337}
4338#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4339pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4340impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4341 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4342 type StablePtr = ExprMatchPtr<'db>;
4343 type Green = ExprMatchGreen<'db>;
4344 fn missing(db: &'db dyn Database) -> Self::Green {
4345 ExprMatchGreen(
4346 GreenNode {
4347 kind: SyntaxKind::ExprMatch,
4348 details: GreenNodeDetails::Node {
4349 children: [
4350 TerminalMatch::missing(db).0,
4351 Expr::missing(db).0,
4352 TerminalLBrace::missing(db).0,
4353 MatchArms::missing(db).0,
4354 TerminalRBrace::missing(db).0,
4355 ]
4356 .into(),
4357 width: TextWidth::default(),
4358 },
4359 }
4360 .intern(db),
4361 )
4362 }
4363 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4364 let kind = node.kind(db);
4365 assert_eq!(
4366 kind,
4367 SyntaxKind::ExprMatch,
4368 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4369 kind,
4370 SyntaxKind::ExprMatch
4371 );
4372 Self { node }
4373 }
4374 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4375 let kind = node.kind(db);
4376 if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4377 }
4378 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4379 self.node
4380 }
4381 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4382 ExprMatchPtr(self.node.stable_ptr(db))
4383 }
4384}
4385#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4386pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4387impl<'db> Deref for MatchArms<'db> {
4388 type Target = ElementList<'db, MatchArm<'db>, 2>;
4389 fn deref(&self) -> &Self::Target {
4390 &self.0
4391 }
4392}
4393impl<'db> MatchArms<'db> {
4394 pub fn new_green(
4395 db: &'db dyn Database,
4396 children: &[MatchArmsElementOrSeparatorGreen<'db>],
4397 ) -> MatchArmsGreen<'db> {
4398 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4399 MatchArmsGreen(
4400 GreenNode {
4401 kind: SyntaxKind::MatchArms,
4402 details: GreenNodeDetails::Node {
4403 children: children.iter().map(|x| x.id()).collect(),
4404 width,
4405 },
4406 }
4407 .intern(db),
4408 )
4409 }
4410}
4411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4412pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4413impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4414 type SyntaxNode = MatchArms<'db>;
4415 fn untyped(self) -> SyntaxStablePtrId<'db> {
4416 self.0
4417 }
4418 fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4419 MatchArms::from_syntax_node(db, self.0.lookup(db))
4420 }
4421}
4422impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4423 fn from(ptr: MatchArmsPtr<'db>) -> Self {
4424 ptr.untyped()
4425 }
4426}
4427#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4428pub enum MatchArmsElementOrSeparatorGreen<'db> {
4429 Separator(TerminalCommaGreen<'db>),
4430 Element(MatchArmGreen<'db>),
4431}
4432impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4433 fn from(value: TerminalCommaGreen<'db>) -> Self {
4434 MatchArmsElementOrSeparatorGreen::Separator(value)
4435 }
4436}
4437impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4438 fn from(value: MatchArmGreen<'db>) -> Self {
4439 MatchArmsElementOrSeparatorGreen::Element(value)
4440 }
4441}
4442impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4443 fn id(&self) -> GreenId<'db> {
4444 match self {
4445 MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4446 MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4447 }
4448 }
4449}
4450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4451pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4452impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4453 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4454 type StablePtr = MatchArmsPtr<'db>;
4455 type Green = MatchArmsGreen<'db>;
4456 fn missing(db: &'db dyn Database) -> Self::Green {
4457 MatchArmsGreen(
4458 GreenNode {
4459 kind: SyntaxKind::MatchArms,
4460 details: GreenNodeDetails::Node {
4461 children: [].into(),
4462 width: TextWidth::default(),
4463 },
4464 }
4465 .intern(db),
4466 )
4467 }
4468 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4469 Self(ElementList::new(node))
4470 }
4471 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4472 if node.kind(db) == SyntaxKind::MatchArms {
4473 Some(Self(ElementList::new(node)))
4474 } else {
4475 None
4476 }
4477 }
4478 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4479 self.node
4480 }
4481 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4482 MatchArmsPtr(self.node.stable_ptr(db))
4483 }
4484}
4485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4486pub struct MatchArm<'db> {
4487 node: SyntaxNode<'db>,
4488}
4489impl<'db> MatchArm<'db> {
4490 pub const INDEX_PATTERNS: usize = 0;
4491 pub const INDEX_ARROW: usize = 1;
4492 pub const INDEX_EXPRESSION: usize = 2;
4493 pub fn new_green(
4494 db: &'db dyn Database,
4495 patterns: PatternListOrGreen<'db>,
4496 arrow: TerminalMatchArrowGreen<'db>,
4497 expression: ExprGreen<'db>,
4498 ) -> MatchArmGreen<'db> {
4499 let children = [patterns.0, arrow.0, expression.0];
4500 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4501 MatchArmGreen(
4502 GreenNode {
4503 kind: SyntaxKind::MatchArm,
4504 details: GreenNodeDetails::Node { children: children.into(), width },
4505 }
4506 .intern(db),
4507 )
4508 }
4509}
4510impl<'db> MatchArm<'db> {
4511 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4512 PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4513 }
4514 pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4515 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4516 }
4517 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4518 Expr::from_syntax_node(db, self.node.get_children(db)[2])
4519 }
4520}
4521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4522pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4523impl<'db> MatchArmPtr<'db> {}
4524impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4525 type SyntaxNode = MatchArm<'db>;
4526 fn untyped(self) -> SyntaxStablePtrId<'db> {
4527 self.0
4528 }
4529 fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4530 MatchArm::from_syntax_node(db, self.0.lookup(db))
4531 }
4532}
4533impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4534 fn from(ptr: MatchArmPtr<'db>) -> Self {
4535 ptr.untyped()
4536 }
4537}
4538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4539pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4540impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4541 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4542 type StablePtr = MatchArmPtr<'db>;
4543 type Green = MatchArmGreen<'db>;
4544 fn missing(db: &'db dyn Database) -> Self::Green {
4545 MatchArmGreen(
4546 GreenNode {
4547 kind: SyntaxKind::MatchArm,
4548 details: GreenNodeDetails::Node {
4549 children: [
4550 PatternListOr::missing(db).0,
4551 TerminalMatchArrow::missing(db).0,
4552 Expr::missing(db).0,
4553 ]
4554 .into(),
4555 width: TextWidth::default(),
4556 },
4557 }
4558 .intern(db),
4559 )
4560 }
4561 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4562 let kind = node.kind(db);
4563 assert_eq!(
4564 kind,
4565 SyntaxKind::MatchArm,
4566 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4567 kind,
4568 SyntaxKind::MatchArm
4569 );
4570 Self { node }
4571 }
4572 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4573 let kind = node.kind(db);
4574 if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4575 }
4576 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4577 self.node
4578 }
4579 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4580 MatchArmPtr(self.node.stable_ptr(db))
4581 }
4582}
4583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4584pub struct ExprIf<'db> {
4585 node: SyntaxNode<'db>,
4586}
4587impl<'db> ExprIf<'db> {
4588 pub const INDEX_IF_KW: usize = 0;
4589 pub const INDEX_CONDITIONS: usize = 1;
4590 pub const INDEX_IF_BLOCK: usize = 2;
4591 pub const INDEX_ELSE_CLAUSE: usize = 3;
4592 pub fn new_green(
4593 db: &'db dyn Database,
4594 if_kw: TerminalIfGreen<'db>,
4595 conditions: ConditionListAndGreen<'db>,
4596 if_block: ExprBlockGreen<'db>,
4597 else_clause: OptionElseClauseGreen<'db>,
4598 ) -> ExprIfGreen<'db> {
4599 let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4600 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4601 ExprIfGreen(
4602 GreenNode {
4603 kind: SyntaxKind::ExprIf,
4604 details: GreenNodeDetails::Node { children: children.into(), width },
4605 }
4606 .intern(db),
4607 )
4608 }
4609}
4610impl<'db> ExprIf<'db> {
4611 pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4612 TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4613 }
4614 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4615 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4616 }
4617 pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4618 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4619 }
4620 pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4621 OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4622 }
4623}
4624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4625pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4626impl<'db> ExprIfPtr<'db> {}
4627impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4628 type SyntaxNode = ExprIf<'db>;
4629 fn untyped(self) -> SyntaxStablePtrId<'db> {
4630 self.0
4631 }
4632 fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4633 ExprIf::from_syntax_node(db, self.0.lookup(db))
4634 }
4635}
4636impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4637 fn from(ptr: ExprIfPtr<'db>) -> Self {
4638 ptr.untyped()
4639 }
4640}
4641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4642pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4643impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4644 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4645 type StablePtr = ExprIfPtr<'db>;
4646 type Green = ExprIfGreen<'db>;
4647 fn missing(db: &'db dyn Database) -> Self::Green {
4648 ExprIfGreen(
4649 GreenNode {
4650 kind: SyntaxKind::ExprIf,
4651 details: GreenNodeDetails::Node {
4652 children: [
4653 TerminalIf::missing(db).0,
4654 ConditionListAnd::missing(db).0,
4655 ExprBlock::missing(db).0,
4656 OptionElseClause::missing(db).0,
4657 ]
4658 .into(),
4659 width: TextWidth::default(),
4660 },
4661 }
4662 .intern(db),
4663 )
4664 }
4665 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4666 let kind = node.kind(db);
4667 assert_eq!(
4668 kind,
4669 SyntaxKind::ExprIf,
4670 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4671 kind,
4672 SyntaxKind::ExprIf
4673 );
4674 Self { node }
4675 }
4676 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4677 let kind = node.kind(db);
4678 if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4679 }
4680 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4681 self.node
4682 }
4683 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4684 ExprIfPtr(self.node.stable_ptr(db))
4685 }
4686}
4687#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4688pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4689impl<'db> Deref for ConditionListAnd<'db> {
4690 type Target = ElementList<'db, Condition<'db>, 2>;
4691 fn deref(&self) -> &Self::Target {
4692 &self.0
4693 }
4694}
4695impl<'db> ConditionListAnd<'db> {
4696 pub fn new_green(
4697 db: &'db dyn Database,
4698 children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4699 ) -> ConditionListAndGreen<'db> {
4700 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4701 ConditionListAndGreen(
4702 GreenNode {
4703 kind: SyntaxKind::ConditionListAnd,
4704 details: GreenNodeDetails::Node {
4705 children: children.iter().map(|x| x.id()).collect(),
4706 width,
4707 },
4708 }
4709 .intern(db),
4710 )
4711 }
4712}
4713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4714pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4715impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4716 type SyntaxNode = ConditionListAnd<'db>;
4717 fn untyped(self) -> SyntaxStablePtrId<'db> {
4718 self.0
4719 }
4720 fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4721 ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4722 }
4723}
4724impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4725 fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4726 ptr.untyped()
4727 }
4728}
4729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4730pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4731 Separator(TerminalAndAndGreen<'db>),
4732 Element(ConditionGreen<'db>),
4733}
4734impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4735 fn from(value: TerminalAndAndGreen<'db>) -> Self {
4736 ConditionListAndElementOrSeparatorGreen::Separator(value)
4737 }
4738}
4739impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4740 fn from(value: ConditionGreen<'db>) -> Self {
4741 ConditionListAndElementOrSeparatorGreen::Element(value)
4742 }
4743}
4744impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4745 fn id(&self) -> GreenId<'db> {
4746 match self {
4747 ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4748 ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4749 }
4750 }
4751}
4752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4753pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4754impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4755 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4756 type StablePtr = ConditionListAndPtr<'db>;
4757 type Green = ConditionListAndGreen<'db>;
4758 fn missing(db: &'db dyn Database) -> Self::Green {
4759 ConditionListAndGreen(
4760 GreenNode {
4761 kind: SyntaxKind::ConditionListAnd,
4762 details: GreenNodeDetails::Node {
4763 children: [].into(),
4764 width: TextWidth::default(),
4765 },
4766 }
4767 .intern(db),
4768 )
4769 }
4770 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4771 Self(ElementList::new(node))
4772 }
4773 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4774 if node.kind(db) == SyntaxKind::ConditionListAnd {
4775 Some(Self(ElementList::new(node)))
4776 } else {
4777 None
4778 }
4779 }
4780 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4781 self.node
4782 }
4783 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4784 ConditionListAndPtr(self.node.stable_ptr(db))
4785 }
4786}
4787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4788pub enum Condition<'db> {
4789 Let(ConditionLet<'db>),
4790 Expr(ConditionExpr<'db>),
4791}
4792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4793pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4794impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4795 type SyntaxNode = Condition<'db>;
4796 fn untyped(self) -> SyntaxStablePtrId<'db> {
4797 self.0
4798 }
4799 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4800 Condition::from_syntax_node(db, self.0.lookup(db))
4801 }
4802}
4803impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4804 fn from(ptr: ConditionPtr<'db>) -> Self {
4805 ptr.untyped()
4806 }
4807}
4808impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4809 fn from(value: ConditionLetPtr<'db>) -> Self {
4810 Self(value.0)
4811 }
4812}
4813impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4814 fn from(value: ConditionExprPtr<'db>) -> Self {
4815 Self(value.0)
4816 }
4817}
4818impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4819 fn from(value: ConditionLetGreen<'db>) -> Self {
4820 Self(value.0)
4821 }
4822}
4823impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4824 fn from(value: ConditionExprGreen<'db>) -> Self {
4825 Self(value.0)
4826 }
4827}
4828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4829pub struct ConditionGreen<'db>(pub GreenId<'db>);
4830impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4831 const OPTIONAL_KIND: Option<SyntaxKind> = None;
4832 type StablePtr = ConditionPtr<'db>;
4833 type Green = ConditionGreen<'db>;
4834 fn missing(db: &'db dyn Database) -> Self::Green {
4835 panic!("No missing variant.");
4836 }
4837 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4838 let kind = node.kind(db);
4839 match kind {
4840 SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4841 SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4842 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4843 }
4844 }
4845 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4846 let kind = node.kind(db);
4847 match kind {
4848 SyntaxKind::ConditionLet => {
4849 Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4850 }
4851 SyntaxKind::ConditionExpr => {
4852 Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4853 }
4854 _ => None,
4855 }
4856 }
4857 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4858 match self {
4859 Condition::Let(x) => x.as_syntax_node(),
4860 Condition::Expr(x) => x.as_syntax_node(),
4861 }
4862 }
4863 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4864 ConditionPtr(self.as_syntax_node().stable_ptr(db))
4865 }
4866}
4867impl<'db> Condition<'db> {
4868 pub fn is_variant(kind: SyntaxKind) -> bool {
4870 matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4871 }
4872}
4873#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4874pub struct ConditionLet<'db> {
4875 node: SyntaxNode<'db>,
4876}
4877impl<'db> ConditionLet<'db> {
4878 pub const INDEX_LET_KW: usize = 0;
4879 pub const INDEX_PATTERNS: usize = 1;
4880 pub const INDEX_EQ: usize = 2;
4881 pub const INDEX_EXPR: usize = 3;
4882 pub fn new_green(
4883 db: &'db dyn Database,
4884 let_kw: TerminalLetGreen<'db>,
4885 patterns: PatternListOrGreen<'db>,
4886 eq: TerminalEqGreen<'db>,
4887 expr: ExprGreen<'db>,
4888 ) -> ConditionLetGreen<'db> {
4889 let children = [let_kw.0, patterns.0, eq.0, expr.0];
4890 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4891 ConditionLetGreen(
4892 GreenNode {
4893 kind: SyntaxKind::ConditionLet,
4894 details: GreenNodeDetails::Node { children: children.into(), width },
4895 }
4896 .intern(db),
4897 )
4898 }
4899}
4900impl<'db> ConditionLet<'db> {
4901 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4902 TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4903 }
4904 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4905 PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4906 }
4907 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4908 TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4909 }
4910 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4911 Expr::from_syntax_node(db, self.node.get_children(db)[3])
4912 }
4913}
4914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4915pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4916impl<'db> ConditionLetPtr<'db> {}
4917impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4918 type SyntaxNode = ConditionLet<'db>;
4919 fn untyped(self) -> SyntaxStablePtrId<'db> {
4920 self.0
4921 }
4922 fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4923 ConditionLet::from_syntax_node(db, self.0.lookup(db))
4924 }
4925}
4926impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4927 fn from(ptr: ConditionLetPtr<'db>) -> Self {
4928 ptr.untyped()
4929 }
4930}
4931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4932pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4933impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4934 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4935 type StablePtr = ConditionLetPtr<'db>;
4936 type Green = ConditionLetGreen<'db>;
4937 fn missing(db: &'db dyn Database) -> Self::Green {
4938 ConditionLetGreen(
4939 GreenNode {
4940 kind: SyntaxKind::ConditionLet,
4941 details: GreenNodeDetails::Node {
4942 children: [
4943 TerminalLet::missing(db).0,
4944 PatternListOr::missing(db).0,
4945 TerminalEq::missing(db).0,
4946 Expr::missing(db).0,
4947 ]
4948 .into(),
4949 width: TextWidth::default(),
4950 },
4951 }
4952 .intern(db),
4953 )
4954 }
4955 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4956 let kind = node.kind(db);
4957 assert_eq!(
4958 kind,
4959 SyntaxKind::ConditionLet,
4960 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4961 kind,
4962 SyntaxKind::ConditionLet
4963 );
4964 Self { node }
4965 }
4966 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4967 let kind = node.kind(db);
4968 if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4969 }
4970 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4971 self.node
4972 }
4973 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4974 ConditionLetPtr(self.node.stable_ptr(db))
4975 }
4976}
4977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4978pub struct ConditionExpr<'db> {
4979 node: SyntaxNode<'db>,
4980}
4981impl<'db> ConditionExpr<'db> {
4982 pub const INDEX_EXPR: usize = 0;
4983 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4984 let children = [expr.0];
4985 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4986 ConditionExprGreen(
4987 GreenNode {
4988 kind: SyntaxKind::ConditionExpr,
4989 details: GreenNodeDetails::Node { children: children.into(), width },
4990 }
4991 .intern(db),
4992 )
4993 }
4994}
4995impl<'db> ConditionExpr<'db> {
4996 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4997 Expr::from_syntax_node(db, self.node.get_children(db)[0])
4998 }
4999}
5000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5001pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
5002impl<'db> ConditionExprPtr<'db> {}
5003impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
5004 type SyntaxNode = ConditionExpr<'db>;
5005 fn untyped(self) -> SyntaxStablePtrId<'db> {
5006 self.0
5007 }
5008 fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
5009 ConditionExpr::from_syntax_node(db, self.0.lookup(db))
5010 }
5011}
5012impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
5013 fn from(ptr: ConditionExprPtr<'db>) -> Self {
5014 ptr.untyped()
5015 }
5016}
5017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5018pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
5019impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
5020 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
5021 type StablePtr = ConditionExprPtr<'db>;
5022 type Green = ConditionExprGreen<'db>;
5023 fn missing(db: &'db dyn Database) -> Self::Green {
5024 ConditionExprGreen(
5025 GreenNode {
5026 kind: SyntaxKind::ConditionExpr,
5027 details: GreenNodeDetails::Node {
5028 children: [Expr::missing(db).0].into(),
5029 width: TextWidth::default(),
5030 },
5031 }
5032 .intern(db),
5033 )
5034 }
5035 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5036 let kind = node.kind(db);
5037 assert_eq!(
5038 kind,
5039 SyntaxKind::ConditionExpr,
5040 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5041 kind,
5042 SyntaxKind::ConditionExpr
5043 );
5044 Self { node }
5045 }
5046 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5047 let kind = node.kind(db);
5048 if kind == SyntaxKind::ConditionExpr {
5049 Some(Self::from_syntax_node(db, node))
5050 } else {
5051 None
5052 }
5053 }
5054 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5055 self.node
5056 }
5057 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5058 ConditionExprPtr(self.node.stable_ptr(db))
5059 }
5060}
5061#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5062pub enum BlockOrIf<'db> {
5063 Block(ExprBlock<'db>),
5064 If(ExprIf<'db>),
5065}
5066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5067pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5068impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5069 type SyntaxNode = BlockOrIf<'db>;
5070 fn untyped(self) -> SyntaxStablePtrId<'db> {
5071 self.0
5072 }
5073 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5074 BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5075 }
5076}
5077impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5078 fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5079 ptr.untyped()
5080 }
5081}
5082impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5083 fn from(value: ExprBlockPtr<'db>) -> Self {
5084 Self(value.0)
5085 }
5086}
5087impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5088 fn from(value: ExprIfPtr<'db>) -> Self {
5089 Self(value.0)
5090 }
5091}
5092impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5093 fn from(value: ExprBlockGreen<'db>) -> Self {
5094 Self(value.0)
5095 }
5096}
5097impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5098 fn from(value: ExprIfGreen<'db>) -> Self {
5099 Self(value.0)
5100 }
5101}
5102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5103pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5104impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5105 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5106 type StablePtr = BlockOrIfPtr<'db>;
5107 type Green = BlockOrIfGreen<'db>;
5108 fn missing(db: &'db dyn Database) -> Self::Green {
5109 panic!("No missing variant.");
5110 }
5111 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5112 let kind = node.kind(db);
5113 match kind {
5114 SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5115 SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5116 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5117 }
5118 }
5119 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5120 let kind = node.kind(db);
5121 match kind {
5122 SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5123 SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5124 _ => None,
5125 }
5126 }
5127 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5128 match self {
5129 BlockOrIf::Block(x) => x.as_syntax_node(),
5130 BlockOrIf::If(x) => x.as_syntax_node(),
5131 }
5132 }
5133 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5134 BlockOrIfPtr(self.as_syntax_node().stable_ptr(db))
5135 }
5136}
5137impl<'db> BlockOrIf<'db> {
5138 pub fn is_variant(kind: SyntaxKind) -> bool {
5140 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5141 }
5142}
5143#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5144pub struct ExprLoop<'db> {
5145 node: SyntaxNode<'db>,
5146}
5147impl<'db> ExprLoop<'db> {
5148 pub const INDEX_LOOP_KW: usize = 0;
5149 pub const INDEX_BODY: usize = 1;
5150 pub fn new_green(
5151 db: &'db dyn Database,
5152 loop_kw: TerminalLoopGreen<'db>,
5153 body: ExprBlockGreen<'db>,
5154 ) -> ExprLoopGreen<'db> {
5155 let children = [loop_kw.0, body.0];
5156 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5157 ExprLoopGreen(
5158 GreenNode {
5159 kind: SyntaxKind::ExprLoop,
5160 details: GreenNodeDetails::Node { children: children.into(), width },
5161 }
5162 .intern(db),
5163 )
5164 }
5165}
5166impl<'db> ExprLoop<'db> {
5167 pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5168 TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5169 }
5170 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5171 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5172 }
5173}
5174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5175pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5176impl<'db> ExprLoopPtr<'db> {}
5177impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5178 type SyntaxNode = ExprLoop<'db>;
5179 fn untyped(self) -> SyntaxStablePtrId<'db> {
5180 self.0
5181 }
5182 fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5183 ExprLoop::from_syntax_node(db, self.0.lookup(db))
5184 }
5185}
5186impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5187 fn from(ptr: ExprLoopPtr<'db>) -> Self {
5188 ptr.untyped()
5189 }
5190}
5191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5192pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5193impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5194 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5195 type StablePtr = ExprLoopPtr<'db>;
5196 type Green = ExprLoopGreen<'db>;
5197 fn missing(db: &'db dyn Database) -> Self::Green {
5198 ExprLoopGreen(
5199 GreenNode {
5200 kind: SyntaxKind::ExprLoop,
5201 details: GreenNodeDetails::Node {
5202 children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5203 width: TextWidth::default(),
5204 },
5205 }
5206 .intern(db),
5207 )
5208 }
5209 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5210 let kind = node.kind(db);
5211 assert_eq!(
5212 kind,
5213 SyntaxKind::ExprLoop,
5214 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5215 kind,
5216 SyntaxKind::ExprLoop
5217 );
5218 Self { node }
5219 }
5220 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5221 let kind = node.kind(db);
5222 if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5223 }
5224 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5225 self.node
5226 }
5227 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5228 ExprLoopPtr(self.node.stable_ptr(db))
5229 }
5230}
5231#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5232pub struct ExprWhile<'db> {
5233 node: SyntaxNode<'db>,
5234}
5235impl<'db> ExprWhile<'db> {
5236 pub const INDEX_WHILE_KW: usize = 0;
5237 pub const INDEX_CONDITIONS: usize = 1;
5238 pub const INDEX_BODY: usize = 2;
5239 pub fn new_green(
5240 db: &'db dyn Database,
5241 while_kw: TerminalWhileGreen<'db>,
5242 conditions: ConditionListAndGreen<'db>,
5243 body: ExprBlockGreen<'db>,
5244 ) -> ExprWhileGreen<'db> {
5245 let children = [while_kw.0, conditions.0, body.0];
5246 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5247 ExprWhileGreen(
5248 GreenNode {
5249 kind: SyntaxKind::ExprWhile,
5250 details: GreenNodeDetails::Node { children: children.into(), width },
5251 }
5252 .intern(db),
5253 )
5254 }
5255}
5256impl<'db> ExprWhile<'db> {
5257 pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5258 TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5259 }
5260 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5261 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5262 }
5263 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5264 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5265 }
5266}
5267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5268pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5269impl<'db> ExprWhilePtr<'db> {}
5270impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5271 type SyntaxNode = ExprWhile<'db>;
5272 fn untyped(self) -> SyntaxStablePtrId<'db> {
5273 self.0
5274 }
5275 fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5276 ExprWhile::from_syntax_node(db, self.0.lookup(db))
5277 }
5278}
5279impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5280 fn from(ptr: ExprWhilePtr<'db>) -> Self {
5281 ptr.untyped()
5282 }
5283}
5284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5285pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5286impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5287 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5288 type StablePtr = ExprWhilePtr<'db>;
5289 type Green = ExprWhileGreen<'db>;
5290 fn missing(db: &'db dyn Database) -> Self::Green {
5291 ExprWhileGreen(
5292 GreenNode {
5293 kind: SyntaxKind::ExprWhile,
5294 details: GreenNodeDetails::Node {
5295 children: [
5296 TerminalWhile::missing(db).0,
5297 ConditionListAnd::missing(db).0,
5298 ExprBlock::missing(db).0,
5299 ]
5300 .into(),
5301 width: TextWidth::default(),
5302 },
5303 }
5304 .intern(db),
5305 )
5306 }
5307 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5308 let kind = node.kind(db);
5309 assert_eq!(
5310 kind,
5311 SyntaxKind::ExprWhile,
5312 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5313 kind,
5314 SyntaxKind::ExprWhile
5315 );
5316 Self { node }
5317 }
5318 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5319 let kind = node.kind(db);
5320 if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5321 }
5322 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5323 self.node
5324 }
5325 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5326 ExprWhilePtr(self.node.stable_ptr(db))
5327 }
5328}
5329#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5330pub struct ExprFor<'db> {
5331 node: SyntaxNode<'db>,
5332}
5333impl<'db> ExprFor<'db> {
5334 pub const INDEX_FOR_KW: usize = 0;
5335 pub const INDEX_PATTERN: usize = 1;
5336 pub const INDEX_IDENTIFIER: usize = 2;
5337 pub const INDEX_EXPR: usize = 3;
5338 pub const INDEX_BODY: usize = 4;
5339 pub fn new_green(
5340 db: &'db dyn Database,
5341 for_kw: TerminalForGreen<'db>,
5342 pattern: PatternGreen<'db>,
5343 identifier: TerminalIdentifierGreen<'db>,
5344 expr: ExprGreen<'db>,
5345 body: ExprBlockGreen<'db>,
5346 ) -> ExprForGreen<'db> {
5347 let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5348 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5349 ExprForGreen(
5350 GreenNode {
5351 kind: SyntaxKind::ExprFor,
5352 details: GreenNodeDetails::Node { children: children.into(), width },
5353 }
5354 .intern(db),
5355 )
5356 }
5357}
5358impl<'db> ExprFor<'db> {
5359 pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5360 TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5361 }
5362 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5363 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5364 }
5365 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5366 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5367 }
5368 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5369 Expr::from_syntax_node(db, self.node.get_children(db)[3])
5370 }
5371 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5372 ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5373 }
5374}
5375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5376pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5377impl<'db> ExprForPtr<'db> {
5378 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5379 PatternGreen(self.0.0.key_fields(db)[0])
5380 }
5381 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5382 TerminalIdentifierGreen(self.0.0.key_fields(db)[1])
5383 }
5384}
5385impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5386 type SyntaxNode = ExprFor<'db>;
5387 fn untyped(self) -> SyntaxStablePtrId<'db> {
5388 self.0
5389 }
5390 fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5391 ExprFor::from_syntax_node(db, self.0.lookup(db))
5392 }
5393}
5394impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5395 fn from(ptr: ExprForPtr<'db>) -> Self {
5396 ptr.untyped()
5397 }
5398}
5399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5400pub struct ExprForGreen<'db>(pub GreenId<'db>);
5401impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5402 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5403 type StablePtr = ExprForPtr<'db>;
5404 type Green = ExprForGreen<'db>;
5405 fn missing(db: &'db dyn Database) -> Self::Green {
5406 ExprForGreen(
5407 GreenNode {
5408 kind: SyntaxKind::ExprFor,
5409 details: GreenNodeDetails::Node {
5410 children: [
5411 TerminalFor::missing(db).0,
5412 Pattern::missing(db).0,
5413 TerminalIdentifier::missing(db).0,
5414 Expr::missing(db).0,
5415 ExprBlock::missing(db).0,
5416 ]
5417 .into(),
5418 width: TextWidth::default(),
5419 },
5420 }
5421 .intern(db),
5422 )
5423 }
5424 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5425 let kind = node.kind(db);
5426 assert_eq!(
5427 kind,
5428 SyntaxKind::ExprFor,
5429 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5430 kind,
5431 SyntaxKind::ExprFor
5432 );
5433 Self { node }
5434 }
5435 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5436 let kind = node.kind(db);
5437 if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5438 }
5439 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5440 self.node
5441 }
5442 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5443 ExprForPtr(self.node.stable_ptr(db))
5444 }
5445}
5446#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5447pub struct ElseClause<'db> {
5448 node: SyntaxNode<'db>,
5449}
5450impl<'db> ElseClause<'db> {
5451 pub const INDEX_ELSE_KW: usize = 0;
5452 pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5453 pub fn new_green(
5454 db: &'db dyn Database,
5455 else_kw: TerminalElseGreen<'db>,
5456 else_block_or_if: BlockOrIfGreen<'db>,
5457 ) -> ElseClauseGreen<'db> {
5458 let children = [else_kw.0, else_block_or_if.0];
5459 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5460 ElseClauseGreen(
5461 GreenNode {
5462 kind: SyntaxKind::ElseClause,
5463 details: GreenNodeDetails::Node { children: children.into(), width },
5464 }
5465 .intern(db),
5466 )
5467 }
5468}
5469impl<'db> ElseClause<'db> {
5470 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5471 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5472 }
5473 pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5474 BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5475 }
5476}
5477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5478pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5479impl<'db> ElseClausePtr<'db> {}
5480impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5481 type SyntaxNode = ElseClause<'db>;
5482 fn untyped(self) -> SyntaxStablePtrId<'db> {
5483 self.0
5484 }
5485 fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5486 ElseClause::from_syntax_node(db, self.0.lookup(db))
5487 }
5488}
5489impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5490 fn from(ptr: ElseClausePtr<'db>) -> Self {
5491 ptr.untyped()
5492 }
5493}
5494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5495pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5496impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5497 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5498 type StablePtr = ElseClausePtr<'db>;
5499 type Green = ElseClauseGreen<'db>;
5500 fn missing(db: &'db dyn Database) -> Self::Green {
5501 ElseClauseGreen(
5502 GreenNode {
5503 kind: SyntaxKind::ElseClause,
5504 details: GreenNodeDetails::Node {
5505 children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5506 width: TextWidth::default(),
5507 },
5508 }
5509 .intern(db),
5510 )
5511 }
5512 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5513 let kind = node.kind(db);
5514 assert_eq!(
5515 kind,
5516 SyntaxKind::ElseClause,
5517 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5518 kind,
5519 SyntaxKind::ElseClause
5520 );
5521 Self { node }
5522 }
5523 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5524 let kind = node.kind(db);
5525 if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5526 }
5527 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5528 self.node
5529 }
5530 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5531 ElseClausePtr(self.node.stable_ptr(db))
5532 }
5533}
5534#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5535pub enum OptionElseClause<'db> {
5536 Empty(OptionElseClauseEmpty<'db>),
5537 ElseClause(ElseClause<'db>),
5538}
5539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5540pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5541impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5542 type SyntaxNode = OptionElseClause<'db>;
5543 fn untyped(self) -> SyntaxStablePtrId<'db> {
5544 self.0
5545 }
5546 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5547 OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5548 }
5549}
5550impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5551 fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5552 ptr.untyped()
5553 }
5554}
5555impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5556 fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5557 Self(value.0)
5558 }
5559}
5560impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5561 fn from(value: ElseClausePtr<'db>) -> Self {
5562 Self(value.0)
5563 }
5564}
5565impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5566 fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5567 Self(value.0)
5568 }
5569}
5570impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5571 fn from(value: ElseClauseGreen<'db>) -> Self {
5572 Self(value.0)
5573 }
5574}
5575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5576pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5577impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5578 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5579 type StablePtr = OptionElseClausePtr<'db>;
5580 type Green = OptionElseClauseGreen<'db>;
5581 fn missing(db: &'db dyn Database) -> Self::Green {
5582 panic!("No missing variant.");
5583 }
5584 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5585 let kind = node.kind(db);
5586 match kind {
5587 SyntaxKind::OptionElseClauseEmpty => {
5588 OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5589 }
5590 SyntaxKind::ElseClause => {
5591 OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5592 }
5593 _ => panic!(
5594 "Unexpected syntax kind {:?} when constructing {}.",
5595 kind, "OptionElseClause"
5596 ),
5597 }
5598 }
5599 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5600 let kind = node.kind(db);
5601 match kind {
5602 SyntaxKind::OptionElseClauseEmpty => {
5603 Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5604 }
5605 SyntaxKind::ElseClause => {
5606 Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5607 }
5608 _ => None,
5609 }
5610 }
5611 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5612 match self {
5613 OptionElseClause::Empty(x) => x.as_syntax_node(),
5614 OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5615 }
5616 }
5617 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5618 OptionElseClausePtr(self.as_syntax_node().stable_ptr(db))
5619 }
5620}
5621impl<'db> OptionElseClause<'db> {
5622 pub fn is_variant(kind: SyntaxKind) -> bool {
5624 matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5625 }
5626}
5627#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5628pub struct OptionElseClauseEmpty<'db> {
5629 node: SyntaxNode<'db>,
5630}
5631impl<'db> OptionElseClauseEmpty<'db> {
5632 pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5633 let children = [];
5634 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5635 OptionElseClauseEmptyGreen(
5636 GreenNode {
5637 kind: SyntaxKind::OptionElseClauseEmpty,
5638 details: GreenNodeDetails::Node { children: children.into(), width },
5639 }
5640 .intern(db),
5641 )
5642 }
5643}
5644impl<'db> OptionElseClauseEmpty<'db> {}
5645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5646pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5647impl<'db> OptionElseClauseEmptyPtr<'db> {}
5648impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5649 type SyntaxNode = OptionElseClauseEmpty<'db>;
5650 fn untyped(self) -> SyntaxStablePtrId<'db> {
5651 self.0
5652 }
5653 fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5654 OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5655 }
5656}
5657impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5658 fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5659 ptr.untyped()
5660 }
5661}
5662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5663pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5664impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5665 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5666 type StablePtr = OptionElseClauseEmptyPtr<'db>;
5667 type Green = OptionElseClauseEmptyGreen<'db>;
5668 fn missing(db: &'db dyn Database) -> Self::Green {
5669 OptionElseClauseEmptyGreen(
5670 GreenNode {
5671 kind: SyntaxKind::OptionElseClauseEmpty,
5672 details: GreenNodeDetails::Node {
5673 children: [].into(),
5674 width: TextWidth::default(),
5675 },
5676 }
5677 .intern(db),
5678 )
5679 }
5680 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5681 let kind = node.kind(db);
5682 assert_eq!(
5683 kind,
5684 SyntaxKind::OptionElseClauseEmpty,
5685 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5686 kind,
5687 SyntaxKind::OptionElseClauseEmpty
5688 );
5689 Self { node }
5690 }
5691 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5692 let kind = node.kind(db);
5693 if kind == SyntaxKind::OptionElseClauseEmpty {
5694 Some(Self::from_syntax_node(db, node))
5695 } else {
5696 None
5697 }
5698 }
5699 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5700 self.node
5701 }
5702 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5703 OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5704 }
5705}
5706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5707pub struct ExprErrorPropagate<'db> {
5708 node: SyntaxNode<'db>,
5709}
5710impl<'db> ExprErrorPropagate<'db> {
5711 pub const INDEX_EXPR: usize = 0;
5712 pub const INDEX_OP: usize = 1;
5713 pub fn new_green(
5714 db: &'db dyn Database,
5715 expr: ExprGreen<'db>,
5716 op: TerminalQuestionMarkGreen<'db>,
5717 ) -> ExprErrorPropagateGreen<'db> {
5718 let children = [expr.0, op.0];
5719 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5720 ExprErrorPropagateGreen(
5721 GreenNode {
5722 kind: SyntaxKind::ExprErrorPropagate,
5723 details: GreenNodeDetails::Node { children: children.into(), width },
5724 }
5725 .intern(db),
5726 )
5727 }
5728}
5729impl<'db> ExprErrorPropagate<'db> {
5730 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5731 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5732 }
5733 pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5734 TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5735 }
5736}
5737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5738pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5739impl<'db> ExprErrorPropagatePtr<'db> {}
5740impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5741 type SyntaxNode = ExprErrorPropagate<'db>;
5742 fn untyped(self) -> SyntaxStablePtrId<'db> {
5743 self.0
5744 }
5745 fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5746 ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5747 }
5748}
5749impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5750 fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5751 ptr.untyped()
5752 }
5753}
5754#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5755pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5756impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5757 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5758 type StablePtr = ExprErrorPropagatePtr<'db>;
5759 type Green = ExprErrorPropagateGreen<'db>;
5760 fn missing(db: &'db dyn Database) -> Self::Green {
5761 ExprErrorPropagateGreen(
5762 GreenNode {
5763 kind: SyntaxKind::ExprErrorPropagate,
5764 details: GreenNodeDetails::Node {
5765 children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5766 width: TextWidth::default(),
5767 },
5768 }
5769 .intern(db),
5770 )
5771 }
5772 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5773 let kind = node.kind(db);
5774 assert_eq!(
5775 kind,
5776 SyntaxKind::ExprErrorPropagate,
5777 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5778 kind,
5779 SyntaxKind::ExprErrorPropagate
5780 );
5781 Self { node }
5782 }
5783 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5784 let kind = node.kind(db);
5785 if kind == SyntaxKind::ExprErrorPropagate {
5786 Some(Self::from_syntax_node(db, node))
5787 } else {
5788 None
5789 }
5790 }
5791 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5792 self.node
5793 }
5794 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5795 ExprErrorPropagatePtr(self.node.stable_ptr(db))
5796 }
5797}
5798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5799pub struct ExprIndexed<'db> {
5800 node: SyntaxNode<'db>,
5801}
5802impl<'db> ExprIndexed<'db> {
5803 pub const INDEX_EXPR: usize = 0;
5804 pub const INDEX_LBRACK: usize = 1;
5805 pub const INDEX_INDEX_EXPR: usize = 2;
5806 pub const INDEX_RBRACK: usize = 3;
5807 pub fn new_green(
5808 db: &'db dyn Database,
5809 expr: ExprGreen<'db>,
5810 lbrack: TerminalLBrackGreen<'db>,
5811 index_expr: ExprGreen<'db>,
5812 rbrack: TerminalRBrackGreen<'db>,
5813 ) -> ExprIndexedGreen<'db> {
5814 let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5815 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5816 ExprIndexedGreen(
5817 GreenNode {
5818 kind: SyntaxKind::ExprIndexed,
5819 details: GreenNodeDetails::Node { children: children.into(), width },
5820 }
5821 .intern(db),
5822 )
5823 }
5824}
5825impl<'db> ExprIndexed<'db> {
5826 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5827 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5828 }
5829 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5830 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5831 }
5832 pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5833 Expr::from_syntax_node(db, self.node.get_children(db)[2])
5834 }
5835 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5836 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5837 }
5838}
5839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5840pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5841impl<'db> ExprIndexedPtr<'db> {}
5842impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5843 type SyntaxNode = ExprIndexed<'db>;
5844 fn untyped(self) -> SyntaxStablePtrId<'db> {
5845 self.0
5846 }
5847 fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5848 ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5849 }
5850}
5851impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5852 fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5853 ptr.untyped()
5854 }
5855}
5856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5857pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5858impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5859 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5860 type StablePtr = ExprIndexedPtr<'db>;
5861 type Green = ExprIndexedGreen<'db>;
5862 fn missing(db: &'db dyn Database) -> Self::Green {
5863 ExprIndexedGreen(
5864 GreenNode {
5865 kind: SyntaxKind::ExprIndexed,
5866 details: GreenNodeDetails::Node {
5867 children: [
5868 Expr::missing(db).0,
5869 TerminalLBrack::missing(db).0,
5870 Expr::missing(db).0,
5871 TerminalRBrack::missing(db).0,
5872 ]
5873 .into(),
5874 width: TextWidth::default(),
5875 },
5876 }
5877 .intern(db),
5878 )
5879 }
5880 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5881 let kind = node.kind(db);
5882 assert_eq!(
5883 kind,
5884 SyntaxKind::ExprIndexed,
5885 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5886 kind,
5887 SyntaxKind::ExprIndexed
5888 );
5889 Self { node }
5890 }
5891 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5892 let kind = node.kind(db);
5893 if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5894 }
5895 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5896 self.node
5897 }
5898 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5899 ExprIndexedPtr(self.node.stable_ptr(db))
5900 }
5901}
5902#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5903pub struct ExprFixedSizeArray<'db> {
5904 node: SyntaxNode<'db>,
5905}
5906impl<'db> ExprFixedSizeArray<'db> {
5907 pub const INDEX_LBRACK: usize = 0;
5908 pub const INDEX_EXPRS: usize = 1;
5909 pub const INDEX_SIZE: usize = 2;
5910 pub const INDEX_RBRACK: usize = 3;
5911 pub fn new_green(
5912 db: &'db dyn Database,
5913 lbrack: TerminalLBrackGreen<'db>,
5914 exprs: ExprListGreen<'db>,
5915 size: OptionFixedSizeArraySizeGreen<'db>,
5916 rbrack: TerminalRBrackGreen<'db>,
5917 ) -> ExprFixedSizeArrayGreen<'db> {
5918 let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5919 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5920 ExprFixedSizeArrayGreen(
5921 GreenNode {
5922 kind: SyntaxKind::ExprFixedSizeArray,
5923 details: GreenNodeDetails::Node { children: children.into(), width },
5924 }
5925 .intern(db),
5926 )
5927 }
5928}
5929impl<'db> ExprFixedSizeArray<'db> {
5930 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5931 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5932 }
5933 pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5934 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5935 }
5936 pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5937 OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5938 }
5939 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5940 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5941 }
5942}
5943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5944pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5945impl<'db> ExprFixedSizeArrayPtr<'db> {}
5946impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5947 type SyntaxNode = ExprFixedSizeArray<'db>;
5948 fn untyped(self) -> SyntaxStablePtrId<'db> {
5949 self.0
5950 }
5951 fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5952 ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5953 }
5954}
5955impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5956 fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5957 ptr.untyped()
5958 }
5959}
5960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5961pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5962impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5963 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5964 type StablePtr = ExprFixedSizeArrayPtr<'db>;
5965 type Green = ExprFixedSizeArrayGreen<'db>;
5966 fn missing(db: &'db dyn Database) -> Self::Green {
5967 ExprFixedSizeArrayGreen(
5968 GreenNode {
5969 kind: SyntaxKind::ExprFixedSizeArray,
5970 details: GreenNodeDetails::Node {
5971 children: [
5972 TerminalLBrack::missing(db).0,
5973 ExprList::missing(db).0,
5974 OptionFixedSizeArraySize::missing(db).0,
5975 TerminalRBrack::missing(db).0,
5976 ]
5977 .into(),
5978 width: TextWidth::default(),
5979 },
5980 }
5981 .intern(db),
5982 )
5983 }
5984 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5985 let kind = node.kind(db);
5986 assert_eq!(
5987 kind,
5988 SyntaxKind::ExprFixedSizeArray,
5989 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5990 kind,
5991 SyntaxKind::ExprFixedSizeArray
5992 );
5993 Self { node }
5994 }
5995 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5996 let kind = node.kind(db);
5997 if kind == SyntaxKind::ExprFixedSizeArray {
5998 Some(Self::from_syntax_node(db, node))
5999 } else {
6000 None
6001 }
6002 }
6003 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6004 self.node
6005 }
6006 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6007 ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
6008 }
6009}
6010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6011pub struct FixedSizeArraySize<'db> {
6012 node: SyntaxNode<'db>,
6013}
6014impl<'db> FixedSizeArraySize<'db> {
6015 pub const INDEX_SEMICOLON: usize = 0;
6016 pub const INDEX_SIZE: usize = 1;
6017 pub fn new_green(
6018 db: &'db dyn Database,
6019 semicolon: TerminalSemicolonGreen<'db>,
6020 size: ExprGreen<'db>,
6021 ) -> FixedSizeArraySizeGreen<'db> {
6022 let children = [semicolon.0, size.0];
6023 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6024 FixedSizeArraySizeGreen(
6025 GreenNode {
6026 kind: SyntaxKind::FixedSizeArraySize,
6027 details: GreenNodeDetails::Node { children: children.into(), width },
6028 }
6029 .intern(db),
6030 )
6031 }
6032}
6033impl<'db> FixedSizeArraySize<'db> {
6034 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6035 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6036 }
6037 pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6038 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6039 }
6040}
6041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6042pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6043impl<'db> FixedSizeArraySizePtr<'db> {}
6044impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6045 type SyntaxNode = FixedSizeArraySize<'db>;
6046 fn untyped(self) -> SyntaxStablePtrId<'db> {
6047 self.0
6048 }
6049 fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6050 FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6051 }
6052}
6053impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6054 fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6055 ptr.untyped()
6056 }
6057}
6058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6059pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6060impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6061 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6062 type StablePtr = FixedSizeArraySizePtr<'db>;
6063 type Green = FixedSizeArraySizeGreen<'db>;
6064 fn missing(db: &'db dyn Database) -> Self::Green {
6065 FixedSizeArraySizeGreen(
6066 GreenNode {
6067 kind: SyntaxKind::FixedSizeArraySize,
6068 details: GreenNodeDetails::Node {
6069 children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6070 width: TextWidth::default(),
6071 },
6072 }
6073 .intern(db),
6074 )
6075 }
6076 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6077 let kind = node.kind(db);
6078 assert_eq!(
6079 kind,
6080 SyntaxKind::FixedSizeArraySize,
6081 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6082 kind,
6083 SyntaxKind::FixedSizeArraySize
6084 );
6085 Self { node }
6086 }
6087 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6088 let kind = node.kind(db);
6089 if kind == SyntaxKind::FixedSizeArraySize {
6090 Some(Self::from_syntax_node(db, node))
6091 } else {
6092 None
6093 }
6094 }
6095 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6096 self.node
6097 }
6098 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6099 FixedSizeArraySizePtr(self.node.stable_ptr(db))
6100 }
6101}
6102#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6103pub enum OptionFixedSizeArraySize<'db> {
6104 Empty(OptionFixedSizeArraySizeEmpty<'db>),
6105 FixedSizeArraySize(FixedSizeArraySize<'db>),
6106}
6107#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6108pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6109impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6110 type SyntaxNode = OptionFixedSizeArraySize<'db>;
6111 fn untyped(self) -> SyntaxStablePtrId<'db> {
6112 self.0
6113 }
6114 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6115 OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6116 }
6117}
6118impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6119 fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6120 ptr.untyped()
6121 }
6122}
6123impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6124 fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6125 Self(value.0)
6126 }
6127}
6128impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6129 fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6130 Self(value.0)
6131 }
6132}
6133impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6134 fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6135 Self(value.0)
6136 }
6137}
6138impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6139 fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6140 Self(value.0)
6141 }
6142}
6143#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6144pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6145impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6146 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6147 type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6148 type Green = OptionFixedSizeArraySizeGreen<'db>;
6149 fn missing(db: &'db dyn Database) -> Self::Green {
6150 panic!("No missing variant.");
6151 }
6152 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6153 let kind = node.kind(db);
6154 match kind {
6155 SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6156 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6157 ),
6158 SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6159 FixedSizeArraySize::from_syntax_node(db, node),
6160 ),
6161 _ => panic!(
6162 "Unexpected syntax kind {:?} when constructing {}.",
6163 kind, "OptionFixedSizeArraySize"
6164 ),
6165 }
6166 }
6167 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6168 let kind = node.kind(db);
6169 match kind {
6170 SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6171 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6172 )),
6173 SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6174 FixedSizeArraySize::from_syntax_node(db, node),
6175 )),
6176 _ => None,
6177 }
6178 }
6179 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6180 match self {
6181 OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6182 OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6183 }
6184 }
6185 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6186 OptionFixedSizeArraySizePtr(self.as_syntax_node().stable_ptr(db))
6187 }
6188}
6189impl<'db> OptionFixedSizeArraySize<'db> {
6190 pub fn is_variant(kind: SyntaxKind) -> bool {
6192 matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6193 }
6194}
6195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6196pub struct OptionFixedSizeArraySizeEmpty<'db> {
6197 node: SyntaxNode<'db>,
6198}
6199impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6200 pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6201 let children = [];
6202 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6203 OptionFixedSizeArraySizeEmptyGreen(
6204 GreenNode {
6205 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6206 details: GreenNodeDetails::Node { children: children.into(), width },
6207 }
6208 .intern(db),
6209 )
6210 }
6211}
6212impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6214pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6215impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6216impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6217 type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6218 fn untyped(self) -> SyntaxStablePtrId<'db> {
6219 self.0
6220 }
6221 fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6222 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6223 }
6224}
6225impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6226 fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6227 ptr.untyped()
6228 }
6229}
6230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6231pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6232impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6233 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6234 type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6235 type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6236 fn missing(db: &'db dyn Database) -> Self::Green {
6237 OptionFixedSizeArraySizeEmptyGreen(
6238 GreenNode {
6239 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6240 details: GreenNodeDetails::Node {
6241 children: [].into(),
6242 width: TextWidth::default(),
6243 },
6244 }
6245 .intern(db),
6246 )
6247 }
6248 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6249 let kind = node.kind(db);
6250 assert_eq!(
6251 kind,
6252 SyntaxKind::OptionFixedSizeArraySizeEmpty,
6253 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6254 kind,
6255 SyntaxKind::OptionFixedSizeArraySizeEmpty
6256 );
6257 Self { node }
6258 }
6259 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6260 let kind = node.kind(db);
6261 if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6262 Some(Self::from_syntax_node(db, node))
6263 } else {
6264 None
6265 }
6266 }
6267 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6268 self.node
6269 }
6270 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6271 OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6272 }
6273}
6274#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6275pub struct ExprClosure<'db> {
6276 node: SyntaxNode<'db>,
6277}
6278impl<'db> ExprClosure<'db> {
6279 pub const INDEX_PARAMS: usize = 0;
6280 pub const INDEX_RET_TY: usize = 1;
6281 pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6282 pub const INDEX_EXPR: usize = 3;
6283 pub fn new_green(
6284 db: &'db dyn Database,
6285 params: ClosureParamsGreen<'db>,
6286 ret_ty: OptionReturnTypeClauseGreen<'db>,
6287 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6288 expr: ExprGreen<'db>,
6289 ) -> ExprClosureGreen<'db> {
6290 let children = [params.0, ret_ty.0, optional_no_panic.0, expr.0];
6291 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6292 ExprClosureGreen(
6293 GreenNode {
6294 kind: SyntaxKind::ExprClosure,
6295 details: GreenNodeDetails::Node { children: children.into(), width },
6296 }
6297 .intern(db),
6298 )
6299 }
6300}
6301impl<'db> ExprClosure<'db> {
6302 pub fn params(&self, db: &'db dyn Database) -> ClosureParams<'db> {
6303 ClosureParams::from_syntax_node(db, self.node.get_children(db)[0])
6304 }
6305 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6306 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6307 }
6308 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6309 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6310 }
6311 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6312 Expr::from_syntax_node(db, self.node.get_children(db)[3])
6313 }
6314}
6315#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6316pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6317impl<'db> ExprClosurePtr<'db> {}
6318impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6319 type SyntaxNode = ExprClosure<'db>;
6320 fn untyped(self) -> SyntaxStablePtrId<'db> {
6321 self.0
6322 }
6323 fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6324 ExprClosure::from_syntax_node(db, self.0.lookup(db))
6325 }
6326}
6327impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6328 fn from(ptr: ExprClosurePtr<'db>) -> Self {
6329 ptr.untyped()
6330 }
6331}
6332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6333pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6334impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6335 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6336 type StablePtr = ExprClosurePtr<'db>;
6337 type Green = ExprClosureGreen<'db>;
6338 fn missing(db: &'db dyn Database) -> Self::Green {
6339 ExprClosureGreen(
6340 GreenNode {
6341 kind: SyntaxKind::ExprClosure,
6342 details: GreenNodeDetails::Node {
6343 children: [
6344 ClosureParams::missing(db).0,
6345 OptionReturnTypeClause::missing(db).0,
6346 OptionTerminalNoPanic::missing(db).0,
6347 Expr::missing(db).0,
6348 ]
6349 .into(),
6350 width: TextWidth::default(),
6351 },
6352 }
6353 .intern(db),
6354 )
6355 }
6356 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6357 let kind = node.kind(db);
6358 assert_eq!(
6359 kind,
6360 SyntaxKind::ExprClosure,
6361 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6362 kind,
6363 SyntaxKind::ExprClosure
6364 );
6365 Self { node }
6366 }
6367 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6368 let kind = node.kind(db);
6369 if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6370 }
6371 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6372 self.node
6373 }
6374 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6375 ExprClosurePtr(self.node.stable_ptr(db))
6376 }
6377}
6378#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6379pub struct ClosureParams<'db> {
6380 node: SyntaxNode<'db>,
6381}
6382impl<'db> ClosureParams<'db> {
6383 pub const INDEX_LEFTOR: usize = 0;
6384 pub const INDEX_PARAMS: usize = 1;
6385 pub const INDEX_RIGHTOR: usize = 2;
6386 pub fn new_green(
6387 db: &'db dyn Database,
6388 leftor: TerminalOrGreen<'db>,
6389 params: ParamListGreen<'db>,
6390 rightor: TerminalOrGreen<'db>,
6391 ) -> ClosureParamsGreen<'db> {
6392 let children = [leftor.0, params.0, rightor.0];
6393 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6394 ClosureParamsGreen(
6395 GreenNode {
6396 kind: SyntaxKind::ClosureParams,
6397 details: GreenNodeDetails::Node { children: children.into(), width },
6398 }
6399 .intern(db),
6400 )
6401 }
6402}
6403impl<'db> ClosureParams<'db> {
6404 pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6405 TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6406 }
6407 pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6408 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6409 }
6410 pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6411 TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6412 }
6413}
6414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6415pub struct ClosureParamsPtr<'db>(pub SyntaxStablePtrId<'db>);
6416impl<'db> ClosureParamsPtr<'db> {}
6417impl<'db> TypedStablePtr<'db> for ClosureParamsPtr<'db> {
6418 type SyntaxNode = ClosureParams<'db>;
6419 fn untyped(self) -> SyntaxStablePtrId<'db> {
6420 self.0
6421 }
6422 fn lookup(&self, db: &'db dyn Database) -> ClosureParams<'db> {
6423 ClosureParams::from_syntax_node(db, self.0.lookup(db))
6424 }
6425}
6426impl<'db> From<ClosureParamsPtr<'db>> for SyntaxStablePtrId<'db> {
6427 fn from(ptr: ClosureParamsPtr<'db>) -> Self {
6428 ptr.untyped()
6429 }
6430}
6431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6432pub struct ClosureParamsGreen<'db>(pub GreenId<'db>);
6433impl<'db> TypedSyntaxNode<'db> for ClosureParams<'db> {
6434 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParams);
6435 type StablePtr = ClosureParamsPtr<'db>;
6436 type Green = ClosureParamsGreen<'db>;
6437 fn missing(db: &'db dyn Database) -> Self::Green {
6438 ClosureParamsGreen(
6439 GreenNode {
6440 kind: SyntaxKind::ClosureParams,
6441 details: GreenNodeDetails::Node {
6442 children: [
6443 TerminalOr::missing(db).0,
6444 ParamList::missing(db).0,
6445 TerminalOr::missing(db).0,
6446 ]
6447 .into(),
6448 width: TextWidth::default(),
6449 },
6450 }
6451 .intern(db),
6452 )
6453 }
6454 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6455 let kind = node.kind(db);
6456 assert_eq!(
6457 kind,
6458 SyntaxKind::ClosureParams,
6459 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6460 kind,
6461 SyntaxKind::ClosureParams
6462 );
6463 Self { node }
6464 }
6465 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6466 let kind = node.kind(db);
6467 if kind == SyntaxKind::ClosureParams {
6468 Some(Self::from_syntax_node(db, node))
6469 } else {
6470 None
6471 }
6472 }
6473 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6474 self.node
6475 }
6476 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6477 ClosureParamsPtr(self.node.stable_ptr(db))
6478 }
6479}
6480#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6481pub struct StructArgExpr<'db> {
6482 node: SyntaxNode<'db>,
6483}
6484impl<'db> StructArgExpr<'db> {
6485 pub const INDEX_COLON: usize = 0;
6486 pub const INDEX_EXPR: usize = 1;
6487 pub fn new_green(
6488 db: &'db dyn Database,
6489 colon: TerminalColonGreen<'db>,
6490 expr: ExprGreen<'db>,
6491 ) -> StructArgExprGreen<'db> {
6492 let children = [colon.0, expr.0];
6493 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6494 StructArgExprGreen(
6495 GreenNode {
6496 kind: SyntaxKind::StructArgExpr,
6497 details: GreenNodeDetails::Node { children: children.into(), width },
6498 }
6499 .intern(db),
6500 )
6501 }
6502}
6503impl<'db> StructArgExpr<'db> {
6504 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6505 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6506 }
6507 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6508 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6509 }
6510}
6511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6512pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6513impl<'db> StructArgExprPtr<'db> {}
6514impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6515 type SyntaxNode = StructArgExpr<'db>;
6516 fn untyped(self) -> SyntaxStablePtrId<'db> {
6517 self.0
6518 }
6519 fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6520 StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6521 }
6522}
6523impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6524 fn from(ptr: StructArgExprPtr<'db>) -> Self {
6525 ptr.untyped()
6526 }
6527}
6528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6529pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6530impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6531 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6532 type StablePtr = StructArgExprPtr<'db>;
6533 type Green = StructArgExprGreen<'db>;
6534 fn missing(db: &'db dyn Database) -> Self::Green {
6535 StructArgExprGreen(
6536 GreenNode {
6537 kind: SyntaxKind::StructArgExpr,
6538 details: GreenNodeDetails::Node {
6539 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6540 width: TextWidth::default(),
6541 },
6542 }
6543 .intern(db),
6544 )
6545 }
6546 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6547 let kind = node.kind(db);
6548 assert_eq!(
6549 kind,
6550 SyntaxKind::StructArgExpr,
6551 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6552 kind,
6553 SyntaxKind::StructArgExpr
6554 );
6555 Self { node }
6556 }
6557 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6558 let kind = node.kind(db);
6559 if kind == SyntaxKind::StructArgExpr {
6560 Some(Self::from_syntax_node(db, node))
6561 } else {
6562 None
6563 }
6564 }
6565 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6566 self.node
6567 }
6568 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6569 StructArgExprPtr(self.node.stable_ptr(db))
6570 }
6571}
6572#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6573pub enum OptionStructArgExpr<'db> {
6574 Empty(OptionStructArgExprEmpty<'db>),
6575 StructArgExpr(StructArgExpr<'db>),
6576}
6577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6578pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6579impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6580 type SyntaxNode = OptionStructArgExpr<'db>;
6581 fn untyped(self) -> SyntaxStablePtrId<'db> {
6582 self.0
6583 }
6584 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6585 OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6586 }
6587}
6588impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6589 fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6590 ptr.untyped()
6591 }
6592}
6593impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6594 fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6595 Self(value.0)
6596 }
6597}
6598impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6599 fn from(value: StructArgExprPtr<'db>) -> Self {
6600 Self(value.0)
6601 }
6602}
6603impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6604 fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6605 Self(value.0)
6606 }
6607}
6608impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6609 fn from(value: StructArgExprGreen<'db>) -> Self {
6610 Self(value.0)
6611 }
6612}
6613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6614pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6615impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6616 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6617 type StablePtr = OptionStructArgExprPtr<'db>;
6618 type Green = OptionStructArgExprGreen<'db>;
6619 fn missing(db: &'db dyn Database) -> Self::Green {
6620 panic!("No missing variant.");
6621 }
6622 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6623 let kind = node.kind(db);
6624 match kind {
6625 SyntaxKind::OptionStructArgExprEmpty => {
6626 OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6627 }
6628 SyntaxKind::StructArgExpr => {
6629 OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6630 }
6631 _ => panic!(
6632 "Unexpected syntax kind {:?} when constructing {}.",
6633 kind, "OptionStructArgExpr"
6634 ),
6635 }
6636 }
6637 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6638 let kind = node.kind(db);
6639 match kind {
6640 SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6641 OptionStructArgExprEmpty::from_syntax_node(db, node),
6642 )),
6643 SyntaxKind::StructArgExpr => {
6644 Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6645 }
6646 _ => None,
6647 }
6648 }
6649 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6650 match self {
6651 OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6652 OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6653 }
6654 }
6655 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6656 OptionStructArgExprPtr(self.as_syntax_node().stable_ptr(db))
6657 }
6658}
6659impl<'db> OptionStructArgExpr<'db> {
6660 pub fn is_variant(kind: SyntaxKind) -> bool {
6662 matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6663 }
6664}
6665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6666pub struct OptionStructArgExprEmpty<'db> {
6667 node: SyntaxNode<'db>,
6668}
6669impl<'db> OptionStructArgExprEmpty<'db> {
6670 pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6671 let children = [];
6672 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6673 OptionStructArgExprEmptyGreen(
6674 GreenNode {
6675 kind: SyntaxKind::OptionStructArgExprEmpty,
6676 details: GreenNodeDetails::Node { children: children.into(), width },
6677 }
6678 .intern(db),
6679 )
6680 }
6681}
6682impl<'db> OptionStructArgExprEmpty<'db> {}
6683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6684pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6685impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6686impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6687 type SyntaxNode = OptionStructArgExprEmpty<'db>;
6688 fn untyped(self) -> SyntaxStablePtrId<'db> {
6689 self.0
6690 }
6691 fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6692 OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6693 }
6694}
6695impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6696 fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6697 ptr.untyped()
6698 }
6699}
6700#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6701pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6702impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6703 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6704 type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6705 type Green = OptionStructArgExprEmptyGreen<'db>;
6706 fn missing(db: &'db dyn Database) -> Self::Green {
6707 OptionStructArgExprEmptyGreen(
6708 GreenNode {
6709 kind: SyntaxKind::OptionStructArgExprEmpty,
6710 details: GreenNodeDetails::Node {
6711 children: [].into(),
6712 width: TextWidth::default(),
6713 },
6714 }
6715 .intern(db),
6716 )
6717 }
6718 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6719 let kind = node.kind(db);
6720 assert_eq!(
6721 kind,
6722 SyntaxKind::OptionStructArgExprEmpty,
6723 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6724 kind,
6725 SyntaxKind::OptionStructArgExprEmpty
6726 );
6727 Self { node }
6728 }
6729 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6730 let kind = node.kind(db);
6731 if kind == SyntaxKind::OptionStructArgExprEmpty {
6732 Some(Self::from_syntax_node(db, node))
6733 } else {
6734 None
6735 }
6736 }
6737 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6738 self.node
6739 }
6740 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6741 OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6742 }
6743}
6744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6745pub struct StructArgSingle<'db> {
6746 node: SyntaxNode<'db>,
6747}
6748impl<'db> StructArgSingle<'db> {
6749 pub const INDEX_IDENTIFIER: usize = 0;
6750 pub const INDEX_ARG_EXPR: usize = 1;
6751 pub fn new_green(
6752 db: &'db dyn Database,
6753 identifier: TerminalIdentifierGreen<'db>,
6754 arg_expr: OptionStructArgExprGreen<'db>,
6755 ) -> StructArgSingleGreen<'db> {
6756 let children = [identifier.0, arg_expr.0];
6757 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6758 StructArgSingleGreen(
6759 GreenNode {
6760 kind: SyntaxKind::StructArgSingle,
6761 details: GreenNodeDetails::Node { children: children.into(), width },
6762 }
6763 .intern(db),
6764 )
6765 }
6766}
6767impl<'db> StructArgSingle<'db> {
6768 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6769 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6770 }
6771 pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6772 OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6773 }
6774}
6775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6776pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6777impl<'db> StructArgSinglePtr<'db> {
6778 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6779 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
6780 }
6781}
6782impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6783 type SyntaxNode = StructArgSingle<'db>;
6784 fn untyped(self) -> SyntaxStablePtrId<'db> {
6785 self.0
6786 }
6787 fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6788 StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6789 }
6790}
6791impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6792 fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6793 ptr.untyped()
6794 }
6795}
6796#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6797pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6798impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6799 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6800 type StablePtr = StructArgSinglePtr<'db>;
6801 type Green = StructArgSingleGreen<'db>;
6802 fn missing(db: &'db dyn Database) -> Self::Green {
6803 StructArgSingleGreen(
6804 GreenNode {
6805 kind: SyntaxKind::StructArgSingle,
6806 details: GreenNodeDetails::Node {
6807 children: [
6808 TerminalIdentifier::missing(db).0,
6809 OptionStructArgExpr::missing(db).0,
6810 ]
6811 .into(),
6812 width: TextWidth::default(),
6813 },
6814 }
6815 .intern(db),
6816 )
6817 }
6818 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6819 let kind = node.kind(db);
6820 assert_eq!(
6821 kind,
6822 SyntaxKind::StructArgSingle,
6823 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6824 kind,
6825 SyntaxKind::StructArgSingle
6826 );
6827 Self { node }
6828 }
6829 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6830 let kind = node.kind(db);
6831 if kind == SyntaxKind::StructArgSingle {
6832 Some(Self::from_syntax_node(db, node))
6833 } else {
6834 None
6835 }
6836 }
6837 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6838 self.node
6839 }
6840 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6841 StructArgSinglePtr(self.node.stable_ptr(db))
6842 }
6843}
6844#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6845pub struct StructArgTail<'db> {
6846 node: SyntaxNode<'db>,
6847}
6848impl<'db> StructArgTail<'db> {
6849 pub const INDEX_DOTDOT: usize = 0;
6850 pub const INDEX_EXPRESSION: usize = 1;
6851 pub fn new_green(
6852 db: &'db dyn Database,
6853 dotdot: TerminalDotDotGreen<'db>,
6854 expression: ExprGreen<'db>,
6855 ) -> StructArgTailGreen<'db> {
6856 let children = [dotdot.0, expression.0];
6857 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6858 StructArgTailGreen(
6859 GreenNode {
6860 kind: SyntaxKind::StructArgTail,
6861 details: GreenNodeDetails::Node { children: children.into(), width },
6862 }
6863 .intern(db),
6864 )
6865 }
6866}
6867impl<'db> StructArgTail<'db> {
6868 pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6869 TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6870 }
6871 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6872 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6873 }
6874}
6875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6876pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6877impl<'db> StructArgTailPtr<'db> {}
6878impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6879 type SyntaxNode = StructArgTail<'db>;
6880 fn untyped(self) -> SyntaxStablePtrId<'db> {
6881 self.0
6882 }
6883 fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6884 StructArgTail::from_syntax_node(db, self.0.lookup(db))
6885 }
6886}
6887impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6888 fn from(ptr: StructArgTailPtr<'db>) -> Self {
6889 ptr.untyped()
6890 }
6891}
6892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6893pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6894impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6895 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6896 type StablePtr = StructArgTailPtr<'db>;
6897 type Green = StructArgTailGreen<'db>;
6898 fn missing(db: &'db dyn Database) -> Self::Green {
6899 StructArgTailGreen(
6900 GreenNode {
6901 kind: SyntaxKind::StructArgTail,
6902 details: GreenNodeDetails::Node {
6903 children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6904 width: TextWidth::default(),
6905 },
6906 }
6907 .intern(db),
6908 )
6909 }
6910 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6911 let kind = node.kind(db);
6912 assert_eq!(
6913 kind,
6914 SyntaxKind::StructArgTail,
6915 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6916 kind,
6917 SyntaxKind::StructArgTail
6918 );
6919 Self { node }
6920 }
6921 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6922 let kind = node.kind(db);
6923 if kind == SyntaxKind::StructArgTail {
6924 Some(Self::from_syntax_node(db, node))
6925 } else {
6926 None
6927 }
6928 }
6929 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6930 self.node
6931 }
6932 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6933 StructArgTailPtr(self.node.stable_ptr(db))
6934 }
6935}
6936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6937pub enum StructArg<'db> {
6938 StructArgSingle(StructArgSingle<'db>),
6939 StructArgTail(StructArgTail<'db>),
6940}
6941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6942pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
6943impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
6944 type SyntaxNode = StructArg<'db>;
6945 fn untyped(self) -> SyntaxStablePtrId<'db> {
6946 self.0
6947 }
6948 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6949 StructArg::from_syntax_node(db, self.0.lookup(db))
6950 }
6951}
6952impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
6953 fn from(ptr: StructArgPtr<'db>) -> Self {
6954 ptr.untyped()
6955 }
6956}
6957impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
6958 fn from(value: StructArgSinglePtr<'db>) -> Self {
6959 Self(value.0)
6960 }
6961}
6962impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
6963 fn from(value: StructArgTailPtr<'db>) -> Self {
6964 Self(value.0)
6965 }
6966}
6967impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
6968 fn from(value: StructArgSingleGreen<'db>) -> Self {
6969 Self(value.0)
6970 }
6971}
6972impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
6973 fn from(value: StructArgTailGreen<'db>) -> Self {
6974 Self(value.0)
6975 }
6976}
6977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6978pub struct StructArgGreen<'db>(pub GreenId<'db>);
6979impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
6980 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6981 type StablePtr = StructArgPtr<'db>;
6982 type Green = StructArgGreen<'db>;
6983 fn missing(db: &'db dyn Database) -> Self::Green {
6984 panic!("No missing variant.");
6985 }
6986 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6987 let kind = node.kind(db);
6988 match kind {
6989 SyntaxKind::StructArgSingle => {
6990 StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
6991 }
6992 SyntaxKind::StructArgTail => {
6993 StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
6994 }
6995 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
6996 }
6997 }
6998 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6999 let kind = node.kind(db);
7000 match kind {
7001 SyntaxKind::StructArgSingle => {
7002 Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7003 }
7004 SyntaxKind::StructArgTail => {
7005 Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7006 }
7007 _ => None,
7008 }
7009 }
7010 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7011 match self {
7012 StructArg::StructArgSingle(x) => x.as_syntax_node(),
7013 StructArg::StructArgTail(x) => x.as_syntax_node(),
7014 }
7015 }
7016 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7017 StructArgPtr(self.as_syntax_node().stable_ptr(db))
7018 }
7019}
7020impl<'db> StructArg<'db> {
7021 pub fn is_variant(kind: SyntaxKind) -> bool {
7023 matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7024 }
7025}
7026#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7027pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7028impl<'db> Deref for StructArgList<'db> {
7029 type Target = ElementList<'db, StructArg<'db>, 2>;
7030 fn deref(&self) -> &Self::Target {
7031 &self.0
7032 }
7033}
7034impl<'db> StructArgList<'db> {
7035 pub fn new_green(
7036 db: &'db dyn Database,
7037 children: &[StructArgListElementOrSeparatorGreen<'db>],
7038 ) -> StructArgListGreen<'db> {
7039 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7040 StructArgListGreen(
7041 GreenNode {
7042 kind: SyntaxKind::StructArgList,
7043 details: GreenNodeDetails::Node {
7044 children: children.iter().map(|x| x.id()).collect(),
7045 width,
7046 },
7047 }
7048 .intern(db),
7049 )
7050 }
7051}
7052#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7053pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7054impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7055 type SyntaxNode = StructArgList<'db>;
7056 fn untyped(self) -> SyntaxStablePtrId<'db> {
7057 self.0
7058 }
7059 fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7060 StructArgList::from_syntax_node(db, self.0.lookup(db))
7061 }
7062}
7063impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7064 fn from(ptr: StructArgListPtr<'db>) -> Self {
7065 ptr.untyped()
7066 }
7067}
7068#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7069pub enum StructArgListElementOrSeparatorGreen<'db> {
7070 Separator(TerminalCommaGreen<'db>),
7071 Element(StructArgGreen<'db>),
7072}
7073impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7074 fn from(value: TerminalCommaGreen<'db>) -> Self {
7075 StructArgListElementOrSeparatorGreen::Separator(value)
7076 }
7077}
7078impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7079 fn from(value: StructArgGreen<'db>) -> Self {
7080 StructArgListElementOrSeparatorGreen::Element(value)
7081 }
7082}
7083impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7084 fn id(&self) -> GreenId<'db> {
7085 match self {
7086 StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7087 StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7088 }
7089 }
7090}
7091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7092pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7093impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7094 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7095 type StablePtr = StructArgListPtr<'db>;
7096 type Green = StructArgListGreen<'db>;
7097 fn missing(db: &'db dyn Database) -> Self::Green {
7098 StructArgListGreen(
7099 GreenNode {
7100 kind: SyntaxKind::StructArgList,
7101 details: GreenNodeDetails::Node {
7102 children: [].into(),
7103 width: TextWidth::default(),
7104 },
7105 }
7106 .intern(db),
7107 )
7108 }
7109 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7110 Self(ElementList::new(node))
7111 }
7112 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7113 if node.kind(db) == SyntaxKind::StructArgList {
7114 Some(Self(ElementList::new(node)))
7115 } else {
7116 None
7117 }
7118 }
7119 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7120 self.node
7121 }
7122 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7123 StructArgListPtr(self.node.stable_ptr(db))
7124 }
7125}
7126#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7127pub struct ArgListBraced<'db> {
7128 node: SyntaxNode<'db>,
7129}
7130impl<'db> ArgListBraced<'db> {
7131 pub const INDEX_LBRACE: usize = 0;
7132 pub const INDEX_ARGUMENTS: usize = 1;
7133 pub const INDEX_RBRACE: usize = 2;
7134 pub fn new_green(
7135 db: &'db dyn Database,
7136 lbrace: TerminalLBraceGreen<'db>,
7137 arguments: ArgListGreen<'db>,
7138 rbrace: TerminalRBraceGreen<'db>,
7139 ) -> ArgListBracedGreen<'db> {
7140 let children = [lbrace.0, arguments.0, rbrace.0];
7141 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7142 ArgListBracedGreen(
7143 GreenNode {
7144 kind: SyntaxKind::ArgListBraced,
7145 details: GreenNodeDetails::Node { children: children.into(), width },
7146 }
7147 .intern(db),
7148 )
7149 }
7150}
7151impl<'db> ArgListBraced<'db> {
7152 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7153 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7154 }
7155 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7156 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7157 }
7158 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7159 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7160 }
7161}
7162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7163pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7164impl<'db> ArgListBracedPtr<'db> {}
7165impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7166 type SyntaxNode = ArgListBraced<'db>;
7167 fn untyped(self) -> SyntaxStablePtrId<'db> {
7168 self.0
7169 }
7170 fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7171 ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7172 }
7173}
7174impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7175 fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7176 ptr.untyped()
7177 }
7178}
7179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7180pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7181impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7182 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7183 type StablePtr = ArgListBracedPtr<'db>;
7184 type Green = ArgListBracedGreen<'db>;
7185 fn missing(db: &'db dyn Database) -> Self::Green {
7186 ArgListBracedGreen(
7187 GreenNode {
7188 kind: SyntaxKind::ArgListBraced,
7189 details: GreenNodeDetails::Node {
7190 children: [
7191 TerminalLBrace::missing(db).0,
7192 ArgList::missing(db).0,
7193 TerminalRBrace::missing(db).0,
7194 ]
7195 .into(),
7196 width: TextWidth::default(),
7197 },
7198 }
7199 .intern(db),
7200 )
7201 }
7202 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7203 let kind = node.kind(db);
7204 assert_eq!(
7205 kind,
7206 SyntaxKind::ArgListBraced,
7207 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7208 kind,
7209 SyntaxKind::ArgListBraced
7210 );
7211 Self { node }
7212 }
7213 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7214 let kind = node.kind(db);
7215 if kind == SyntaxKind::ArgListBraced {
7216 Some(Self::from_syntax_node(db, node))
7217 } else {
7218 None
7219 }
7220 }
7221 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7222 self.node
7223 }
7224 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7225 ArgListBracedPtr(self.node.stable_ptr(db))
7226 }
7227}
7228#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7229pub struct ArgListBracketed<'db> {
7230 node: SyntaxNode<'db>,
7231}
7232impl<'db> ArgListBracketed<'db> {
7233 pub const INDEX_LBRACK: usize = 0;
7234 pub const INDEX_ARGUMENTS: usize = 1;
7235 pub const INDEX_RBRACK: usize = 2;
7236 pub fn new_green(
7237 db: &'db dyn Database,
7238 lbrack: TerminalLBrackGreen<'db>,
7239 arguments: ArgListGreen<'db>,
7240 rbrack: TerminalRBrackGreen<'db>,
7241 ) -> ArgListBracketedGreen<'db> {
7242 let children = [lbrack.0, arguments.0, rbrack.0];
7243 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7244 ArgListBracketedGreen(
7245 GreenNode {
7246 kind: SyntaxKind::ArgListBracketed,
7247 details: GreenNodeDetails::Node { children: children.into(), width },
7248 }
7249 .intern(db),
7250 )
7251 }
7252}
7253impl<'db> ArgListBracketed<'db> {
7254 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7255 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7256 }
7257 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7258 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7259 }
7260 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7261 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7262 }
7263}
7264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7265pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7266impl<'db> ArgListBracketedPtr<'db> {}
7267impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7268 type SyntaxNode = ArgListBracketed<'db>;
7269 fn untyped(self) -> SyntaxStablePtrId<'db> {
7270 self.0
7271 }
7272 fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7273 ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7274 }
7275}
7276impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7277 fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7278 ptr.untyped()
7279 }
7280}
7281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7282pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7283impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7284 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7285 type StablePtr = ArgListBracketedPtr<'db>;
7286 type Green = ArgListBracketedGreen<'db>;
7287 fn missing(db: &'db dyn Database) -> Self::Green {
7288 ArgListBracketedGreen(
7289 GreenNode {
7290 kind: SyntaxKind::ArgListBracketed,
7291 details: GreenNodeDetails::Node {
7292 children: [
7293 TerminalLBrack::missing(db).0,
7294 ArgList::missing(db).0,
7295 TerminalRBrack::missing(db).0,
7296 ]
7297 .into(),
7298 width: TextWidth::default(),
7299 },
7300 }
7301 .intern(db),
7302 )
7303 }
7304 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7305 let kind = node.kind(db);
7306 assert_eq!(
7307 kind,
7308 SyntaxKind::ArgListBracketed,
7309 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7310 kind,
7311 SyntaxKind::ArgListBracketed
7312 );
7313 Self { node }
7314 }
7315 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7316 let kind = node.kind(db);
7317 if kind == SyntaxKind::ArgListBracketed {
7318 Some(Self::from_syntax_node(db, node))
7319 } else {
7320 None
7321 }
7322 }
7323 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7324 self.node
7325 }
7326 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7327 ArgListBracketedPtr(self.node.stable_ptr(db))
7328 }
7329}
7330#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7331pub enum WrappedArgList<'db> {
7332 BracketedArgList(ArgListBracketed<'db>),
7333 ParenthesizedArgList(ArgListParenthesized<'db>),
7334 BracedArgList(ArgListBraced<'db>),
7335 Missing(WrappedArgListMissing<'db>),
7336}
7337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7338pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7339impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7340 type SyntaxNode = WrappedArgList<'db>;
7341 fn untyped(self) -> SyntaxStablePtrId<'db> {
7342 self.0
7343 }
7344 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7345 WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7346 }
7347}
7348impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7349 fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7350 ptr.untyped()
7351 }
7352}
7353impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7354 fn from(value: ArgListBracketedPtr<'db>) -> Self {
7355 Self(value.0)
7356 }
7357}
7358impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7359 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7360 Self(value.0)
7361 }
7362}
7363impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7364 fn from(value: ArgListBracedPtr<'db>) -> Self {
7365 Self(value.0)
7366 }
7367}
7368impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7369 fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7370 Self(value.0)
7371 }
7372}
7373impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7374 fn from(value: ArgListBracketedGreen<'db>) -> Self {
7375 Self(value.0)
7376 }
7377}
7378impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7379 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7380 Self(value.0)
7381 }
7382}
7383impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7384 fn from(value: ArgListBracedGreen<'db>) -> Self {
7385 Self(value.0)
7386 }
7387}
7388impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7389 fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7390 Self(value.0)
7391 }
7392}
7393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7394pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7395impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7396 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7397 type StablePtr = WrappedArgListPtr<'db>;
7398 type Green = WrappedArgListGreen<'db>;
7399 fn missing(db: &'db dyn Database) -> Self::Green {
7400 WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7401 }
7402 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7403 let kind = node.kind(db);
7404 match kind {
7405 SyntaxKind::ArgListBracketed => {
7406 WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7407 }
7408 SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7409 ArgListParenthesized::from_syntax_node(db, node),
7410 ),
7411 SyntaxKind::ArgListBraced => {
7412 WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7413 }
7414 SyntaxKind::WrappedArgListMissing => {
7415 WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7416 }
7417 _ => {
7418 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7419 }
7420 }
7421 }
7422 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7423 let kind = node.kind(db);
7424 match kind {
7425 SyntaxKind::ArgListBracketed => {
7426 Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7427 }
7428 SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7429 ArgListParenthesized::from_syntax_node(db, node),
7430 )),
7431 SyntaxKind::ArgListBraced => {
7432 Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7433 }
7434 SyntaxKind::WrappedArgListMissing => {
7435 Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7436 }
7437 _ => None,
7438 }
7439 }
7440 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7441 match self {
7442 WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7443 WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7444 WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7445 WrappedArgList::Missing(x) => x.as_syntax_node(),
7446 }
7447 }
7448 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7449 WrappedArgListPtr(self.as_syntax_node().stable_ptr(db))
7450 }
7451}
7452impl<'db> WrappedArgList<'db> {
7453 pub fn is_variant(kind: SyntaxKind) -> bool {
7455 matches!(
7456 kind,
7457 SyntaxKind::ArgListBracketed
7458 | SyntaxKind::ArgListParenthesized
7459 | SyntaxKind::ArgListBraced
7460 | SyntaxKind::WrappedArgListMissing
7461 )
7462 }
7463}
7464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7465pub struct WrappedArgListMissing<'db> {
7466 node: SyntaxNode<'db>,
7467}
7468impl<'db> WrappedArgListMissing<'db> {
7469 pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7470 let children = [];
7471 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7472 WrappedArgListMissingGreen(
7473 GreenNode {
7474 kind: SyntaxKind::WrappedArgListMissing,
7475 details: GreenNodeDetails::Node { children: children.into(), width },
7476 }
7477 .intern(db),
7478 )
7479 }
7480}
7481impl<'db> WrappedArgListMissing<'db> {}
7482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7483pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7484impl<'db> WrappedArgListMissingPtr<'db> {}
7485impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7486 type SyntaxNode = WrappedArgListMissing<'db>;
7487 fn untyped(self) -> SyntaxStablePtrId<'db> {
7488 self.0
7489 }
7490 fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7491 WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7492 }
7493}
7494impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7495 fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7496 ptr.untyped()
7497 }
7498}
7499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7500pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7501impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7502 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7503 type StablePtr = WrappedArgListMissingPtr<'db>;
7504 type Green = WrappedArgListMissingGreen<'db>;
7505 fn missing(db: &'db dyn Database) -> Self::Green {
7506 WrappedArgListMissingGreen(
7507 GreenNode {
7508 kind: SyntaxKind::WrappedArgListMissing,
7509 details: GreenNodeDetails::Node {
7510 children: [].into(),
7511 width: TextWidth::default(),
7512 },
7513 }
7514 .intern(db),
7515 )
7516 }
7517 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7518 let kind = node.kind(db);
7519 assert_eq!(
7520 kind,
7521 SyntaxKind::WrappedArgListMissing,
7522 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7523 kind,
7524 SyntaxKind::WrappedArgListMissing
7525 );
7526 Self { node }
7527 }
7528 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7529 let kind = node.kind(db);
7530 if kind == SyntaxKind::WrappedArgListMissing {
7531 Some(Self::from_syntax_node(db, node))
7532 } else {
7533 None
7534 }
7535 }
7536 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7537 self.node
7538 }
7539 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7540 WrappedArgListMissingPtr(self.node.stable_ptr(db))
7541 }
7542}
7543#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7544pub enum Pattern<'db> {
7545 Underscore(TerminalUnderscore<'db>),
7546 Literal(TerminalLiteralNumber<'db>),
7547 False(TerminalFalse<'db>),
7548 True(TerminalTrue<'db>),
7549 ShortString(TerminalShortString<'db>),
7550 String(TerminalString<'db>),
7551 Identifier(PatternIdentifier<'db>),
7552 Struct(PatternStruct<'db>),
7553 Tuple(PatternTuple<'db>),
7554 Enum(PatternEnum<'db>),
7555 FixedSizeArray(PatternFixedSizeArray<'db>),
7556 Path(ExprPath<'db>),
7557}
7558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7559pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7560impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7561 type SyntaxNode = Pattern<'db>;
7562 fn untyped(self) -> SyntaxStablePtrId<'db> {
7563 self.0
7564 }
7565 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7566 Pattern::from_syntax_node(db, self.0.lookup(db))
7567 }
7568}
7569impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7570 fn from(ptr: PatternPtr<'db>) -> Self {
7571 ptr.untyped()
7572 }
7573}
7574impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7575 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7576 Self(value.0)
7577 }
7578}
7579impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7580 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7581 Self(value.0)
7582 }
7583}
7584impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7585 fn from(value: TerminalFalsePtr<'db>) -> Self {
7586 Self(value.0)
7587 }
7588}
7589impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7590 fn from(value: TerminalTruePtr<'db>) -> Self {
7591 Self(value.0)
7592 }
7593}
7594impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7595 fn from(value: TerminalShortStringPtr<'db>) -> Self {
7596 Self(value.0)
7597 }
7598}
7599impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7600 fn from(value: TerminalStringPtr<'db>) -> Self {
7601 Self(value.0)
7602 }
7603}
7604impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7605 fn from(value: PatternIdentifierPtr<'db>) -> Self {
7606 Self(value.0)
7607 }
7608}
7609impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7610 fn from(value: PatternStructPtr<'db>) -> Self {
7611 Self(value.0)
7612 }
7613}
7614impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7615 fn from(value: PatternTuplePtr<'db>) -> Self {
7616 Self(value.0)
7617 }
7618}
7619impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7620 fn from(value: PatternEnumPtr<'db>) -> Self {
7621 Self(value.0)
7622 }
7623}
7624impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7625 fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7626 Self(value.0)
7627 }
7628}
7629impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7630 fn from(value: ExprPathPtr<'db>) -> Self {
7631 Self(value.0)
7632 }
7633}
7634impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7635 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7636 Self(value.0)
7637 }
7638}
7639impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7640 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7641 Self(value.0)
7642 }
7643}
7644impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7645 fn from(value: TerminalFalseGreen<'db>) -> Self {
7646 Self(value.0)
7647 }
7648}
7649impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7650 fn from(value: TerminalTrueGreen<'db>) -> Self {
7651 Self(value.0)
7652 }
7653}
7654impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7655 fn from(value: TerminalShortStringGreen<'db>) -> Self {
7656 Self(value.0)
7657 }
7658}
7659impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7660 fn from(value: TerminalStringGreen<'db>) -> Self {
7661 Self(value.0)
7662 }
7663}
7664impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7665 fn from(value: PatternIdentifierGreen<'db>) -> Self {
7666 Self(value.0)
7667 }
7668}
7669impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7670 fn from(value: PatternStructGreen<'db>) -> Self {
7671 Self(value.0)
7672 }
7673}
7674impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7675 fn from(value: PatternTupleGreen<'db>) -> Self {
7676 Self(value.0)
7677 }
7678}
7679impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7680 fn from(value: PatternEnumGreen<'db>) -> Self {
7681 Self(value.0)
7682 }
7683}
7684impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7685 fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7686 Self(value.0)
7687 }
7688}
7689impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7690 fn from(value: ExprPathGreen<'db>) -> Self {
7691 Self(value.0)
7692 }
7693}
7694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7695pub struct PatternGreen<'db>(pub GreenId<'db>);
7696impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7697 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7698 type StablePtr = PatternPtr<'db>;
7699 type Green = PatternGreen<'db>;
7700 fn missing(db: &'db dyn Database) -> Self::Green {
7701 panic!("No missing variant.");
7702 }
7703 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7704 let kind = node.kind(db);
7705 match kind {
7706 SyntaxKind::TerminalUnderscore => {
7707 Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7708 }
7709 SyntaxKind::TerminalLiteralNumber => {
7710 Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7711 }
7712 SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7713 SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7714 SyntaxKind::TerminalShortString => {
7715 Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7716 }
7717 SyntaxKind::TerminalString => {
7718 Pattern::String(TerminalString::from_syntax_node(db, node))
7719 }
7720 SyntaxKind::PatternIdentifier => {
7721 Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7722 }
7723 SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7724 SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7725 SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7726 SyntaxKind::PatternFixedSizeArray => {
7727 Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7728 }
7729 SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7730 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7731 }
7732 }
7733 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7734 let kind = node.kind(db);
7735 match kind {
7736 SyntaxKind::TerminalUnderscore => {
7737 Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7738 }
7739 SyntaxKind::TerminalLiteralNumber => {
7740 Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7741 }
7742 SyntaxKind::TerminalFalse => {
7743 Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7744 }
7745 SyntaxKind::TerminalTrue => {
7746 Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7747 }
7748 SyntaxKind::TerminalShortString => {
7749 Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7750 }
7751 SyntaxKind::TerminalString => {
7752 Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7753 }
7754 SyntaxKind::PatternIdentifier => {
7755 Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7756 }
7757 SyntaxKind::PatternStruct => {
7758 Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7759 }
7760 SyntaxKind::PatternTuple => {
7761 Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7762 }
7763 SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7764 SyntaxKind::PatternFixedSizeArray => {
7765 Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7766 }
7767 SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7768 _ => None,
7769 }
7770 }
7771 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7772 match self {
7773 Pattern::Underscore(x) => x.as_syntax_node(),
7774 Pattern::Literal(x) => x.as_syntax_node(),
7775 Pattern::False(x) => x.as_syntax_node(),
7776 Pattern::True(x) => x.as_syntax_node(),
7777 Pattern::ShortString(x) => x.as_syntax_node(),
7778 Pattern::String(x) => x.as_syntax_node(),
7779 Pattern::Identifier(x) => x.as_syntax_node(),
7780 Pattern::Struct(x) => x.as_syntax_node(),
7781 Pattern::Tuple(x) => x.as_syntax_node(),
7782 Pattern::Enum(x) => x.as_syntax_node(),
7783 Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7784 Pattern::Path(x) => x.as_syntax_node(),
7785 }
7786 }
7787 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7788 PatternPtr(self.as_syntax_node().stable_ptr(db))
7789 }
7790}
7791impl<'db> Pattern<'db> {
7792 pub fn is_variant(kind: SyntaxKind) -> bool {
7794 matches!(
7795 kind,
7796 SyntaxKind::TerminalUnderscore
7797 | SyntaxKind::TerminalLiteralNumber
7798 | SyntaxKind::TerminalFalse
7799 | SyntaxKind::TerminalTrue
7800 | SyntaxKind::TerminalShortString
7801 | SyntaxKind::TerminalString
7802 | SyntaxKind::PatternIdentifier
7803 | SyntaxKind::PatternStruct
7804 | SyntaxKind::PatternTuple
7805 | SyntaxKind::PatternEnum
7806 | SyntaxKind::PatternFixedSizeArray
7807 | SyntaxKind::ExprPath
7808 )
7809 }
7810}
7811#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7812pub struct PatternIdentifier<'db> {
7813 node: SyntaxNode<'db>,
7814}
7815impl<'db> PatternIdentifier<'db> {
7816 pub const INDEX_MODIFIERS: usize = 0;
7817 pub const INDEX_NAME: usize = 1;
7818 pub fn new_green(
7819 db: &'db dyn Database,
7820 modifiers: ModifierListGreen<'db>,
7821 name: TerminalIdentifierGreen<'db>,
7822 ) -> PatternIdentifierGreen<'db> {
7823 let children = [modifiers.0, name.0];
7824 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7825 PatternIdentifierGreen(
7826 GreenNode {
7827 kind: SyntaxKind::PatternIdentifier,
7828 details: GreenNodeDetails::Node { children: children.into(), width },
7829 }
7830 .intern(db),
7831 )
7832 }
7833}
7834impl<'db> PatternIdentifier<'db> {
7835 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7836 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7837 }
7838 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7839 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7840 }
7841}
7842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7843pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7844impl<'db> PatternIdentifierPtr<'db> {
7845 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7846 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
7847 }
7848}
7849impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7850 type SyntaxNode = PatternIdentifier<'db>;
7851 fn untyped(self) -> SyntaxStablePtrId<'db> {
7852 self.0
7853 }
7854 fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7855 PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7856 }
7857}
7858impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7859 fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7860 ptr.untyped()
7861 }
7862}
7863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7864pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7865impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7866 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7867 type StablePtr = PatternIdentifierPtr<'db>;
7868 type Green = PatternIdentifierGreen<'db>;
7869 fn missing(db: &'db dyn Database) -> Self::Green {
7870 PatternIdentifierGreen(
7871 GreenNode {
7872 kind: SyntaxKind::PatternIdentifier,
7873 details: GreenNodeDetails::Node {
7874 children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7875 .into(),
7876 width: TextWidth::default(),
7877 },
7878 }
7879 .intern(db),
7880 )
7881 }
7882 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7883 let kind = node.kind(db);
7884 assert_eq!(
7885 kind,
7886 SyntaxKind::PatternIdentifier,
7887 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7888 kind,
7889 SyntaxKind::PatternIdentifier
7890 );
7891 Self { node }
7892 }
7893 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7894 let kind = node.kind(db);
7895 if kind == SyntaxKind::PatternIdentifier {
7896 Some(Self::from_syntax_node(db, node))
7897 } else {
7898 None
7899 }
7900 }
7901 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7902 self.node
7903 }
7904 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7905 PatternIdentifierPtr(self.node.stable_ptr(db))
7906 }
7907}
7908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7909pub struct PatternStruct<'db> {
7910 node: SyntaxNode<'db>,
7911}
7912impl<'db> PatternStruct<'db> {
7913 pub const INDEX_PATH: usize = 0;
7914 pub const INDEX_LBRACE: usize = 1;
7915 pub const INDEX_PARAMS: usize = 2;
7916 pub const INDEX_RBRACE: usize = 3;
7917 pub fn new_green(
7918 db: &'db dyn Database,
7919 path: ExprPathGreen<'db>,
7920 lbrace: TerminalLBraceGreen<'db>,
7921 params: PatternStructParamListGreen<'db>,
7922 rbrace: TerminalRBraceGreen<'db>,
7923 ) -> PatternStructGreen<'db> {
7924 let children = [path.0, lbrace.0, params.0, rbrace.0];
7925 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7926 PatternStructGreen(
7927 GreenNode {
7928 kind: SyntaxKind::PatternStruct,
7929 details: GreenNodeDetails::Node { children: children.into(), width },
7930 }
7931 .intern(db),
7932 )
7933 }
7934}
7935impl<'db> PatternStruct<'db> {
7936 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
7937 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
7938 }
7939 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7940 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
7941 }
7942 pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
7943 PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
7944 }
7945 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7946 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
7947 }
7948}
7949#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7950pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
7951impl<'db> PatternStructPtr<'db> {}
7952impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
7953 type SyntaxNode = PatternStruct<'db>;
7954 fn untyped(self) -> SyntaxStablePtrId<'db> {
7955 self.0
7956 }
7957 fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
7958 PatternStruct::from_syntax_node(db, self.0.lookup(db))
7959 }
7960}
7961impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
7962 fn from(ptr: PatternStructPtr<'db>) -> Self {
7963 ptr.untyped()
7964 }
7965}
7966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7967pub struct PatternStructGreen<'db>(pub GreenId<'db>);
7968impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
7969 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
7970 type StablePtr = PatternStructPtr<'db>;
7971 type Green = PatternStructGreen<'db>;
7972 fn missing(db: &'db dyn Database) -> Self::Green {
7973 PatternStructGreen(
7974 GreenNode {
7975 kind: SyntaxKind::PatternStruct,
7976 details: GreenNodeDetails::Node {
7977 children: [
7978 ExprPath::missing(db).0,
7979 TerminalLBrace::missing(db).0,
7980 PatternStructParamList::missing(db).0,
7981 TerminalRBrace::missing(db).0,
7982 ]
7983 .into(),
7984 width: TextWidth::default(),
7985 },
7986 }
7987 .intern(db),
7988 )
7989 }
7990 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7991 let kind = node.kind(db);
7992 assert_eq!(
7993 kind,
7994 SyntaxKind::PatternStruct,
7995 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7996 kind,
7997 SyntaxKind::PatternStruct
7998 );
7999 Self { node }
8000 }
8001 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8002 let kind = node.kind(db);
8003 if kind == SyntaxKind::PatternStruct {
8004 Some(Self::from_syntax_node(db, node))
8005 } else {
8006 None
8007 }
8008 }
8009 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8010 self.node
8011 }
8012 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8013 PatternStructPtr(self.node.stable_ptr(db))
8014 }
8015}
8016#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8017pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8018impl<'db> Deref for PatternStructParamList<'db> {
8019 type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8020 fn deref(&self) -> &Self::Target {
8021 &self.0
8022 }
8023}
8024impl<'db> PatternStructParamList<'db> {
8025 pub fn new_green(
8026 db: &'db dyn Database,
8027 children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8028 ) -> PatternStructParamListGreen<'db> {
8029 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8030 PatternStructParamListGreen(
8031 GreenNode {
8032 kind: SyntaxKind::PatternStructParamList,
8033 details: GreenNodeDetails::Node {
8034 children: children.iter().map(|x| x.id()).collect(),
8035 width,
8036 },
8037 }
8038 .intern(db),
8039 )
8040 }
8041}
8042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8043pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8044impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8045 type SyntaxNode = PatternStructParamList<'db>;
8046 fn untyped(self) -> SyntaxStablePtrId<'db> {
8047 self.0
8048 }
8049 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8050 PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8051 }
8052}
8053impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8054 fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8055 ptr.untyped()
8056 }
8057}
8058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8059pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8060 Separator(TerminalCommaGreen<'db>),
8061 Element(PatternStructParamGreen<'db>),
8062}
8063impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8064 fn from(value: TerminalCommaGreen<'db>) -> Self {
8065 PatternStructParamListElementOrSeparatorGreen::Separator(value)
8066 }
8067}
8068impl<'db> From<PatternStructParamGreen<'db>>
8069 for PatternStructParamListElementOrSeparatorGreen<'db>
8070{
8071 fn from(value: PatternStructParamGreen<'db>) -> Self {
8072 PatternStructParamListElementOrSeparatorGreen::Element(value)
8073 }
8074}
8075impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8076 fn id(&self) -> GreenId<'db> {
8077 match self {
8078 PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8079 PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8080 }
8081 }
8082}
8083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8084pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8085impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8086 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8087 type StablePtr = PatternStructParamListPtr<'db>;
8088 type Green = PatternStructParamListGreen<'db>;
8089 fn missing(db: &'db dyn Database) -> Self::Green {
8090 PatternStructParamListGreen(
8091 GreenNode {
8092 kind: SyntaxKind::PatternStructParamList,
8093 details: GreenNodeDetails::Node {
8094 children: [].into(),
8095 width: TextWidth::default(),
8096 },
8097 }
8098 .intern(db),
8099 )
8100 }
8101 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8102 Self(ElementList::new(node))
8103 }
8104 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8105 if node.kind(db) == SyntaxKind::PatternStructParamList {
8106 Some(Self(ElementList::new(node)))
8107 } else {
8108 None
8109 }
8110 }
8111 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8112 self.node
8113 }
8114 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8115 PatternStructParamListPtr(self.node.stable_ptr(db))
8116 }
8117}
8118#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8119pub struct PatternTuple<'db> {
8120 node: SyntaxNode<'db>,
8121}
8122impl<'db> PatternTuple<'db> {
8123 pub const INDEX_LPAREN: usize = 0;
8124 pub const INDEX_PATTERNS: usize = 1;
8125 pub const INDEX_RPAREN: usize = 2;
8126 pub fn new_green(
8127 db: &'db dyn Database,
8128 lparen: TerminalLParenGreen<'db>,
8129 patterns: PatternListGreen<'db>,
8130 rparen: TerminalRParenGreen<'db>,
8131 ) -> PatternTupleGreen<'db> {
8132 let children = [lparen.0, patterns.0, rparen.0];
8133 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8134 PatternTupleGreen(
8135 GreenNode {
8136 kind: SyntaxKind::PatternTuple,
8137 details: GreenNodeDetails::Node { children: children.into(), width },
8138 }
8139 .intern(db),
8140 )
8141 }
8142}
8143impl<'db> PatternTuple<'db> {
8144 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8145 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8146 }
8147 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8148 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8149 }
8150 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8151 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8152 }
8153}
8154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8155pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8156impl<'db> PatternTuplePtr<'db> {}
8157impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8158 type SyntaxNode = PatternTuple<'db>;
8159 fn untyped(self) -> SyntaxStablePtrId<'db> {
8160 self.0
8161 }
8162 fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8163 PatternTuple::from_syntax_node(db, self.0.lookup(db))
8164 }
8165}
8166impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8167 fn from(ptr: PatternTuplePtr<'db>) -> Self {
8168 ptr.untyped()
8169 }
8170}
8171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8172pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8173impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8174 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8175 type StablePtr = PatternTuplePtr<'db>;
8176 type Green = PatternTupleGreen<'db>;
8177 fn missing(db: &'db dyn Database) -> Self::Green {
8178 PatternTupleGreen(
8179 GreenNode {
8180 kind: SyntaxKind::PatternTuple,
8181 details: GreenNodeDetails::Node {
8182 children: [
8183 TerminalLParen::missing(db).0,
8184 PatternList::missing(db).0,
8185 TerminalRParen::missing(db).0,
8186 ]
8187 .into(),
8188 width: TextWidth::default(),
8189 },
8190 }
8191 .intern(db),
8192 )
8193 }
8194 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8195 let kind = node.kind(db);
8196 assert_eq!(
8197 kind,
8198 SyntaxKind::PatternTuple,
8199 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8200 kind,
8201 SyntaxKind::PatternTuple
8202 );
8203 Self { node }
8204 }
8205 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8206 let kind = node.kind(db);
8207 if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8208 }
8209 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8210 self.node
8211 }
8212 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8213 PatternTuplePtr(self.node.stable_ptr(db))
8214 }
8215}
8216#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8217pub struct PatternFixedSizeArray<'db> {
8218 node: SyntaxNode<'db>,
8219}
8220impl<'db> PatternFixedSizeArray<'db> {
8221 pub const INDEX_LBRACK: usize = 0;
8222 pub const INDEX_PATTERNS: usize = 1;
8223 pub const INDEX_RBRACK: usize = 2;
8224 pub fn new_green(
8225 db: &'db dyn Database,
8226 lbrack: TerminalLBrackGreen<'db>,
8227 patterns: PatternListGreen<'db>,
8228 rbrack: TerminalRBrackGreen<'db>,
8229 ) -> PatternFixedSizeArrayGreen<'db> {
8230 let children = [lbrack.0, patterns.0, rbrack.0];
8231 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8232 PatternFixedSizeArrayGreen(
8233 GreenNode {
8234 kind: SyntaxKind::PatternFixedSizeArray,
8235 details: GreenNodeDetails::Node { children: children.into(), width },
8236 }
8237 .intern(db),
8238 )
8239 }
8240}
8241impl<'db> PatternFixedSizeArray<'db> {
8242 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8243 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8244 }
8245 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8246 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8247 }
8248 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8249 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8250 }
8251}
8252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8253pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8254impl<'db> PatternFixedSizeArrayPtr<'db> {}
8255impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8256 type SyntaxNode = PatternFixedSizeArray<'db>;
8257 fn untyped(self) -> SyntaxStablePtrId<'db> {
8258 self.0
8259 }
8260 fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8261 PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8262 }
8263}
8264impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8265 fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8266 ptr.untyped()
8267 }
8268}
8269#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8270pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8271impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8272 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8273 type StablePtr = PatternFixedSizeArrayPtr<'db>;
8274 type Green = PatternFixedSizeArrayGreen<'db>;
8275 fn missing(db: &'db dyn Database) -> Self::Green {
8276 PatternFixedSizeArrayGreen(
8277 GreenNode {
8278 kind: SyntaxKind::PatternFixedSizeArray,
8279 details: GreenNodeDetails::Node {
8280 children: [
8281 TerminalLBrack::missing(db).0,
8282 PatternList::missing(db).0,
8283 TerminalRBrack::missing(db).0,
8284 ]
8285 .into(),
8286 width: TextWidth::default(),
8287 },
8288 }
8289 .intern(db),
8290 )
8291 }
8292 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8293 let kind = node.kind(db);
8294 assert_eq!(
8295 kind,
8296 SyntaxKind::PatternFixedSizeArray,
8297 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8298 kind,
8299 SyntaxKind::PatternFixedSizeArray
8300 );
8301 Self { node }
8302 }
8303 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8304 let kind = node.kind(db);
8305 if kind == SyntaxKind::PatternFixedSizeArray {
8306 Some(Self::from_syntax_node(db, node))
8307 } else {
8308 None
8309 }
8310 }
8311 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8312 self.node
8313 }
8314 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8315 PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8316 }
8317}
8318#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8319pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8320impl<'db> Deref for PatternList<'db> {
8321 type Target = ElementList<'db, Pattern<'db>, 2>;
8322 fn deref(&self) -> &Self::Target {
8323 &self.0
8324 }
8325}
8326impl<'db> PatternList<'db> {
8327 pub fn new_green(
8328 db: &'db dyn Database,
8329 children: &[PatternListElementOrSeparatorGreen<'db>],
8330 ) -> PatternListGreen<'db> {
8331 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8332 PatternListGreen(
8333 GreenNode {
8334 kind: SyntaxKind::PatternList,
8335 details: GreenNodeDetails::Node {
8336 children: children.iter().map(|x| x.id()).collect(),
8337 width,
8338 },
8339 }
8340 .intern(db),
8341 )
8342 }
8343}
8344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8345pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8346impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8347 type SyntaxNode = PatternList<'db>;
8348 fn untyped(self) -> SyntaxStablePtrId<'db> {
8349 self.0
8350 }
8351 fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8352 PatternList::from_syntax_node(db, self.0.lookup(db))
8353 }
8354}
8355impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8356 fn from(ptr: PatternListPtr<'db>) -> Self {
8357 ptr.untyped()
8358 }
8359}
8360#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8361pub enum PatternListElementOrSeparatorGreen<'db> {
8362 Separator(TerminalCommaGreen<'db>),
8363 Element(PatternGreen<'db>),
8364}
8365impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8366 fn from(value: TerminalCommaGreen<'db>) -> Self {
8367 PatternListElementOrSeparatorGreen::Separator(value)
8368 }
8369}
8370impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8371 fn from(value: PatternGreen<'db>) -> Self {
8372 PatternListElementOrSeparatorGreen::Element(value)
8373 }
8374}
8375impl<'db> PatternListElementOrSeparatorGreen<'db> {
8376 fn id(&self) -> GreenId<'db> {
8377 match self {
8378 PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8379 PatternListElementOrSeparatorGreen::Element(green) => green.0,
8380 }
8381 }
8382}
8383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8384pub struct PatternListGreen<'db>(pub GreenId<'db>);
8385impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8386 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8387 type StablePtr = PatternListPtr<'db>;
8388 type Green = PatternListGreen<'db>;
8389 fn missing(db: &'db dyn Database) -> Self::Green {
8390 PatternListGreen(
8391 GreenNode {
8392 kind: SyntaxKind::PatternList,
8393 details: GreenNodeDetails::Node {
8394 children: [].into(),
8395 width: TextWidth::default(),
8396 },
8397 }
8398 .intern(db),
8399 )
8400 }
8401 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8402 Self(ElementList::new(node))
8403 }
8404 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8405 if node.kind(db) == SyntaxKind::PatternList {
8406 Some(Self(ElementList::new(node)))
8407 } else {
8408 None
8409 }
8410 }
8411 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8412 self.node
8413 }
8414 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8415 PatternListPtr(self.node.stable_ptr(db))
8416 }
8417}
8418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8419pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8420impl<'db> Deref for PatternListOr<'db> {
8421 type Target = ElementList<'db, Pattern<'db>, 2>;
8422 fn deref(&self) -> &Self::Target {
8423 &self.0
8424 }
8425}
8426impl<'db> PatternListOr<'db> {
8427 pub fn new_green(
8428 db: &'db dyn Database,
8429 children: &[PatternListOrElementOrSeparatorGreen<'db>],
8430 ) -> PatternListOrGreen<'db> {
8431 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8432 PatternListOrGreen(
8433 GreenNode {
8434 kind: SyntaxKind::PatternListOr,
8435 details: GreenNodeDetails::Node {
8436 children: children.iter().map(|x| x.id()).collect(),
8437 width,
8438 },
8439 }
8440 .intern(db),
8441 )
8442 }
8443}
8444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8445pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8446impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8447 type SyntaxNode = PatternListOr<'db>;
8448 fn untyped(self) -> SyntaxStablePtrId<'db> {
8449 self.0
8450 }
8451 fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8452 PatternListOr::from_syntax_node(db, self.0.lookup(db))
8453 }
8454}
8455impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8456 fn from(ptr: PatternListOrPtr<'db>) -> Self {
8457 ptr.untyped()
8458 }
8459}
8460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8461pub enum PatternListOrElementOrSeparatorGreen<'db> {
8462 Separator(TerminalOrGreen<'db>),
8463 Element(PatternGreen<'db>),
8464}
8465impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8466 fn from(value: TerminalOrGreen<'db>) -> Self {
8467 PatternListOrElementOrSeparatorGreen::Separator(value)
8468 }
8469}
8470impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8471 fn from(value: PatternGreen<'db>) -> Self {
8472 PatternListOrElementOrSeparatorGreen::Element(value)
8473 }
8474}
8475impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8476 fn id(&self) -> GreenId<'db> {
8477 match self {
8478 PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8479 PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8480 }
8481 }
8482}
8483#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8484pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8485impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8486 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8487 type StablePtr = PatternListOrPtr<'db>;
8488 type Green = PatternListOrGreen<'db>;
8489 fn missing(db: &'db dyn Database) -> Self::Green {
8490 PatternListOrGreen(
8491 GreenNode {
8492 kind: SyntaxKind::PatternListOr,
8493 details: GreenNodeDetails::Node {
8494 children: [].into(),
8495 width: TextWidth::default(),
8496 },
8497 }
8498 .intern(db),
8499 )
8500 }
8501 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8502 Self(ElementList::new(node))
8503 }
8504 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8505 if node.kind(db) == SyntaxKind::PatternListOr {
8506 Some(Self(ElementList::new(node)))
8507 } else {
8508 None
8509 }
8510 }
8511 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8512 self.node
8513 }
8514 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8515 PatternListOrPtr(self.node.stable_ptr(db))
8516 }
8517}
8518#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8519pub enum PatternStructParam<'db> {
8520 Single(PatternIdentifier<'db>),
8521 WithExpr(PatternStructParamWithExpr<'db>),
8522 Tail(TerminalDotDot<'db>),
8523}
8524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8525pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8526impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8527 type SyntaxNode = PatternStructParam<'db>;
8528 fn untyped(self) -> SyntaxStablePtrId<'db> {
8529 self.0
8530 }
8531 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8532 PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8533 }
8534}
8535impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8536 fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8537 ptr.untyped()
8538 }
8539}
8540impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8541 fn from(value: PatternIdentifierPtr<'db>) -> Self {
8542 Self(value.0)
8543 }
8544}
8545impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8546 fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8547 Self(value.0)
8548 }
8549}
8550impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8551 fn from(value: TerminalDotDotPtr<'db>) -> Self {
8552 Self(value.0)
8553 }
8554}
8555impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8556 fn from(value: PatternIdentifierGreen<'db>) -> Self {
8557 Self(value.0)
8558 }
8559}
8560impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8561 fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8562 Self(value.0)
8563 }
8564}
8565impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8566 fn from(value: TerminalDotDotGreen<'db>) -> Self {
8567 Self(value.0)
8568 }
8569}
8570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8571pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8572impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8573 const OPTIONAL_KIND: Option<SyntaxKind> = None;
8574 type StablePtr = PatternStructParamPtr<'db>;
8575 type Green = PatternStructParamGreen<'db>;
8576 fn missing(db: &'db dyn Database) -> Self::Green {
8577 panic!("No missing variant.");
8578 }
8579 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8580 let kind = node.kind(db);
8581 match kind {
8582 SyntaxKind::PatternIdentifier => {
8583 PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8584 }
8585 SyntaxKind::PatternStructParamWithExpr => {
8586 PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8587 }
8588 SyntaxKind::TerminalDotDot => {
8589 PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8590 }
8591 _ => panic!(
8592 "Unexpected syntax kind {:?} when constructing {}.",
8593 kind, "PatternStructParam"
8594 ),
8595 }
8596 }
8597 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8598 let kind = node.kind(db);
8599 match kind {
8600 SyntaxKind::PatternIdentifier => {
8601 Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8602 }
8603 SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8604 PatternStructParamWithExpr::from_syntax_node(db, node),
8605 )),
8606 SyntaxKind::TerminalDotDot => {
8607 Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8608 }
8609 _ => None,
8610 }
8611 }
8612 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8613 match self {
8614 PatternStructParam::Single(x) => x.as_syntax_node(),
8615 PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8616 PatternStructParam::Tail(x) => x.as_syntax_node(),
8617 }
8618 }
8619 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8620 PatternStructParamPtr(self.as_syntax_node().stable_ptr(db))
8621 }
8622}
8623impl<'db> PatternStructParam<'db> {
8624 pub fn is_variant(kind: SyntaxKind) -> bool {
8626 matches!(
8627 kind,
8628 SyntaxKind::PatternIdentifier
8629 | SyntaxKind::PatternStructParamWithExpr
8630 | SyntaxKind::TerminalDotDot
8631 )
8632 }
8633}
8634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8635pub struct PatternStructParamWithExpr<'db> {
8636 node: SyntaxNode<'db>,
8637}
8638impl<'db> PatternStructParamWithExpr<'db> {
8639 pub const INDEX_MODIFIERS: usize = 0;
8640 pub const INDEX_NAME: usize = 1;
8641 pub const INDEX_COLON: usize = 2;
8642 pub const INDEX_PATTERN: usize = 3;
8643 pub fn new_green(
8644 db: &'db dyn Database,
8645 modifiers: ModifierListGreen<'db>,
8646 name: TerminalIdentifierGreen<'db>,
8647 colon: TerminalColonGreen<'db>,
8648 pattern: PatternGreen<'db>,
8649 ) -> PatternStructParamWithExprGreen<'db> {
8650 let children = [modifiers.0, name.0, colon.0, pattern.0];
8651 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8652 PatternStructParamWithExprGreen(
8653 GreenNode {
8654 kind: SyntaxKind::PatternStructParamWithExpr,
8655 details: GreenNodeDetails::Node { children: children.into(), width },
8656 }
8657 .intern(db),
8658 )
8659 }
8660}
8661impl<'db> PatternStructParamWithExpr<'db> {
8662 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8663 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8664 }
8665 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8666 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8667 }
8668 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8669 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8670 }
8671 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8672 Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8673 }
8674}
8675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8676pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8677impl<'db> PatternStructParamWithExprPtr<'db> {}
8678impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8679 type SyntaxNode = PatternStructParamWithExpr<'db>;
8680 fn untyped(self) -> SyntaxStablePtrId<'db> {
8681 self.0
8682 }
8683 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8684 PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8685 }
8686}
8687impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8688 fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8689 ptr.untyped()
8690 }
8691}
8692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8693pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8694impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8695 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8696 type StablePtr = PatternStructParamWithExprPtr<'db>;
8697 type Green = PatternStructParamWithExprGreen<'db>;
8698 fn missing(db: &'db dyn Database) -> Self::Green {
8699 PatternStructParamWithExprGreen(
8700 GreenNode {
8701 kind: SyntaxKind::PatternStructParamWithExpr,
8702 details: GreenNodeDetails::Node {
8703 children: [
8704 ModifierList::missing(db).0,
8705 TerminalIdentifier::missing(db).0,
8706 TerminalColon::missing(db).0,
8707 Pattern::missing(db).0,
8708 ]
8709 .into(),
8710 width: TextWidth::default(),
8711 },
8712 }
8713 .intern(db),
8714 )
8715 }
8716 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8717 let kind = node.kind(db);
8718 assert_eq!(
8719 kind,
8720 SyntaxKind::PatternStructParamWithExpr,
8721 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8722 kind,
8723 SyntaxKind::PatternStructParamWithExpr
8724 );
8725 Self { node }
8726 }
8727 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8728 let kind = node.kind(db);
8729 if kind == SyntaxKind::PatternStructParamWithExpr {
8730 Some(Self::from_syntax_node(db, node))
8731 } else {
8732 None
8733 }
8734 }
8735 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8736 self.node
8737 }
8738 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8739 PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8740 }
8741}
8742#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8743pub struct PatternEnum<'db> {
8744 node: SyntaxNode<'db>,
8745}
8746impl<'db> PatternEnum<'db> {
8747 pub const INDEX_PATH: usize = 0;
8748 pub const INDEX_PATTERN: usize = 1;
8749 pub fn new_green(
8750 db: &'db dyn Database,
8751 path: ExprPathGreen<'db>,
8752 pattern: OptionPatternEnumInnerPatternGreen<'db>,
8753 ) -> PatternEnumGreen<'db> {
8754 let children = [path.0, pattern.0];
8755 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8756 PatternEnumGreen(
8757 GreenNode {
8758 kind: SyntaxKind::PatternEnum,
8759 details: GreenNodeDetails::Node { children: children.into(), width },
8760 }
8761 .intern(db),
8762 )
8763 }
8764}
8765impl<'db> PatternEnum<'db> {
8766 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8767 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8768 }
8769 pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8770 OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8771 }
8772}
8773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8774pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8775impl<'db> PatternEnumPtr<'db> {}
8776impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8777 type SyntaxNode = PatternEnum<'db>;
8778 fn untyped(self) -> SyntaxStablePtrId<'db> {
8779 self.0
8780 }
8781 fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8782 PatternEnum::from_syntax_node(db, self.0.lookup(db))
8783 }
8784}
8785impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8786 fn from(ptr: PatternEnumPtr<'db>) -> Self {
8787 ptr.untyped()
8788 }
8789}
8790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8791pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8792impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8793 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8794 type StablePtr = PatternEnumPtr<'db>;
8795 type Green = PatternEnumGreen<'db>;
8796 fn missing(db: &'db dyn Database) -> Self::Green {
8797 PatternEnumGreen(
8798 GreenNode {
8799 kind: SyntaxKind::PatternEnum,
8800 details: GreenNodeDetails::Node {
8801 children: [
8802 ExprPath::missing(db).0,
8803 OptionPatternEnumInnerPattern::missing(db).0,
8804 ]
8805 .into(),
8806 width: TextWidth::default(),
8807 },
8808 }
8809 .intern(db),
8810 )
8811 }
8812 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8813 let kind = node.kind(db);
8814 assert_eq!(
8815 kind,
8816 SyntaxKind::PatternEnum,
8817 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8818 kind,
8819 SyntaxKind::PatternEnum
8820 );
8821 Self { node }
8822 }
8823 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8824 let kind = node.kind(db);
8825 if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8826 }
8827 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8828 self.node
8829 }
8830 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8831 PatternEnumPtr(self.node.stable_ptr(db))
8832 }
8833}
8834#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8835pub struct PatternEnumInnerPattern<'db> {
8836 node: SyntaxNode<'db>,
8837}
8838impl<'db> PatternEnumInnerPattern<'db> {
8839 pub const INDEX_LPAREN: usize = 0;
8840 pub const INDEX_PATTERN: usize = 1;
8841 pub const INDEX_RPAREN: usize = 2;
8842 pub fn new_green(
8843 db: &'db dyn Database,
8844 lparen: TerminalLParenGreen<'db>,
8845 pattern: PatternGreen<'db>,
8846 rparen: TerminalRParenGreen<'db>,
8847 ) -> PatternEnumInnerPatternGreen<'db> {
8848 let children = [lparen.0, pattern.0, rparen.0];
8849 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8850 PatternEnumInnerPatternGreen(
8851 GreenNode {
8852 kind: SyntaxKind::PatternEnumInnerPattern,
8853 details: GreenNodeDetails::Node { children: children.into(), width },
8854 }
8855 .intern(db),
8856 )
8857 }
8858}
8859impl<'db> PatternEnumInnerPattern<'db> {
8860 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8861 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8862 }
8863 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8864 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8865 }
8866 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8867 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8868 }
8869}
8870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8871pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8872impl<'db> PatternEnumInnerPatternPtr<'db> {}
8873impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8874 type SyntaxNode = PatternEnumInnerPattern<'db>;
8875 fn untyped(self) -> SyntaxStablePtrId<'db> {
8876 self.0
8877 }
8878 fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8879 PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8880 }
8881}
8882impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8883 fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8884 ptr.untyped()
8885 }
8886}
8887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8888pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8889impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8890 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8891 type StablePtr = PatternEnumInnerPatternPtr<'db>;
8892 type Green = PatternEnumInnerPatternGreen<'db>;
8893 fn missing(db: &'db dyn Database) -> Self::Green {
8894 PatternEnumInnerPatternGreen(
8895 GreenNode {
8896 kind: SyntaxKind::PatternEnumInnerPattern,
8897 details: GreenNodeDetails::Node {
8898 children: [
8899 TerminalLParen::missing(db).0,
8900 Pattern::missing(db).0,
8901 TerminalRParen::missing(db).0,
8902 ]
8903 .into(),
8904 width: TextWidth::default(),
8905 },
8906 }
8907 .intern(db),
8908 )
8909 }
8910 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8911 let kind = node.kind(db);
8912 assert_eq!(
8913 kind,
8914 SyntaxKind::PatternEnumInnerPattern,
8915 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8916 kind,
8917 SyntaxKind::PatternEnumInnerPattern
8918 );
8919 Self { node }
8920 }
8921 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8922 let kind = node.kind(db);
8923 if kind == SyntaxKind::PatternEnumInnerPattern {
8924 Some(Self::from_syntax_node(db, node))
8925 } else {
8926 None
8927 }
8928 }
8929 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8930 self.node
8931 }
8932 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8933 PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
8934 }
8935}
8936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8937pub enum OptionPatternEnumInnerPattern<'db> {
8938 Empty(OptionPatternEnumInnerPatternEmpty<'db>),
8939 PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
8940}
8941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8942pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8943impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
8944 type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
8945 fn untyped(self) -> SyntaxStablePtrId<'db> {
8946 self.0
8947 }
8948 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8949 OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8950 }
8951}
8952impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8953 fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
8954 ptr.untyped()
8955 }
8956}
8957impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
8958 for OptionPatternEnumInnerPatternPtr<'db>
8959{
8960 fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
8961 Self(value.0)
8962 }
8963}
8964impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
8965 fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
8966 Self(value.0)
8967 }
8968}
8969impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
8970 for OptionPatternEnumInnerPatternGreen<'db>
8971{
8972 fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
8973 Self(value.0)
8974 }
8975}
8976impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
8977 fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
8978 Self(value.0)
8979 }
8980}
8981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8982pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8983impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
8984 const OPTIONAL_KIND: Option<SyntaxKind> = None;
8985 type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
8986 type Green = OptionPatternEnumInnerPatternGreen<'db>;
8987 fn missing(db: &'db dyn Database) -> Self::Green {
8988 panic!("No missing variant.");
8989 }
8990 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8991 let kind = node.kind(db);
8992 match kind {
8993 SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
8994 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
8995 ),
8996 SyntaxKind::PatternEnumInnerPattern => {
8997 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
8998 PatternEnumInnerPattern::from_syntax_node(db, node),
8999 )
9000 }
9001 _ => panic!(
9002 "Unexpected syntax kind {:?} when constructing {}.",
9003 kind, "OptionPatternEnumInnerPattern"
9004 ),
9005 }
9006 }
9007 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9008 let kind = node.kind(db);
9009 match kind {
9010 SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9011 Some(OptionPatternEnumInnerPattern::Empty(
9012 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9013 ))
9014 }
9015 SyntaxKind::PatternEnumInnerPattern => {
9016 Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9017 PatternEnumInnerPattern::from_syntax_node(db, node),
9018 ))
9019 }
9020 _ => None,
9021 }
9022 }
9023 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9024 match self {
9025 OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9026 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9027 }
9028 }
9029 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9030 OptionPatternEnumInnerPatternPtr(self.as_syntax_node().stable_ptr(db))
9031 }
9032}
9033impl<'db> OptionPatternEnumInnerPattern<'db> {
9034 pub fn is_variant(kind: SyntaxKind) -> bool {
9036 matches!(
9037 kind,
9038 SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9039 )
9040 }
9041}
9042#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9043pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9044 node: SyntaxNode<'db>,
9045}
9046impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9047 pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9048 let children = [];
9049 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9050 OptionPatternEnumInnerPatternEmptyGreen(
9051 GreenNode {
9052 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9053 details: GreenNodeDetails::Node { children: children.into(), width },
9054 }
9055 .intern(db),
9056 )
9057 }
9058}
9059impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9060#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9061pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9062impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9063impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9064 type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9065 fn untyped(self) -> SyntaxStablePtrId<'db> {
9066 self.0
9067 }
9068 fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9069 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9070 }
9071}
9072impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9073 fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9074 ptr.untyped()
9075 }
9076}
9077#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9078pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9079impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9080 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9081 type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9082 type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9083 fn missing(db: &'db dyn Database) -> Self::Green {
9084 OptionPatternEnumInnerPatternEmptyGreen(
9085 GreenNode {
9086 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9087 details: GreenNodeDetails::Node {
9088 children: [].into(),
9089 width: TextWidth::default(),
9090 },
9091 }
9092 .intern(db),
9093 )
9094 }
9095 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9096 let kind = node.kind(db);
9097 assert_eq!(
9098 kind,
9099 SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9100 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9101 kind,
9102 SyntaxKind::OptionPatternEnumInnerPatternEmpty
9103 );
9104 Self { node }
9105 }
9106 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9107 let kind = node.kind(db);
9108 if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9109 Some(Self::from_syntax_node(db, node))
9110 } else {
9111 None
9112 }
9113 }
9114 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9115 self.node
9116 }
9117 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9118 OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9119 }
9120}
9121#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9122pub struct TypeClause<'db> {
9123 node: SyntaxNode<'db>,
9124}
9125impl<'db> TypeClause<'db> {
9126 pub const INDEX_COLON: usize = 0;
9127 pub const INDEX_TY: usize = 1;
9128 pub fn new_green(
9129 db: &'db dyn Database,
9130 colon: TerminalColonGreen<'db>,
9131 ty: ExprGreen<'db>,
9132 ) -> TypeClauseGreen<'db> {
9133 let children = [colon.0, ty.0];
9134 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9135 TypeClauseGreen(
9136 GreenNode {
9137 kind: SyntaxKind::TypeClause,
9138 details: GreenNodeDetails::Node { children: children.into(), width },
9139 }
9140 .intern(db),
9141 )
9142 }
9143}
9144impl<'db> TypeClause<'db> {
9145 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9146 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9147 }
9148 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9149 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9150 }
9151}
9152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9153pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9154impl<'db> TypeClausePtr<'db> {}
9155impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9156 type SyntaxNode = TypeClause<'db>;
9157 fn untyped(self) -> SyntaxStablePtrId<'db> {
9158 self.0
9159 }
9160 fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9161 TypeClause::from_syntax_node(db, self.0.lookup(db))
9162 }
9163}
9164impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9165 fn from(ptr: TypeClausePtr<'db>) -> Self {
9166 ptr.untyped()
9167 }
9168}
9169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9170pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9171impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9172 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9173 type StablePtr = TypeClausePtr<'db>;
9174 type Green = TypeClauseGreen<'db>;
9175 fn missing(db: &'db dyn Database) -> Self::Green {
9176 TypeClauseGreen(
9177 GreenNode {
9178 kind: SyntaxKind::TypeClause,
9179 details: GreenNodeDetails::Node {
9180 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9181 width: TextWidth::default(),
9182 },
9183 }
9184 .intern(db),
9185 )
9186 }
9187 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9188 let kind = node.kind(db);
9189 assert_eq!(
9190 kind,
9191 SyntaxKind::TypeClause,
9192 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9193 kind,
9194 SyntaxKind::TypeClause
9195 );
9196 Self { node }
9197 }
9198 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9199 let kind = node.kind(db);
9200 if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9201 }
9202 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9203 self.node
9204 }
9205 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9206 TypeClausePtr(self.node.stable_ptr(db))
9207 }
9208}
9209#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9210pub enum OptionTypeClause<'db> {
9211 Empty(OptionTypeClauseEmpty<'db>),
9212 TypeClause(TypeClause<'db>),
9213}
9214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9215pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9216impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9217 type SyntaxNode = OptionTypeClause<'db>;
9218 fn untyped(self) -> SyntaxStablePtrId<'db> {
9219 self.0
9220 }
9221 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9222 OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9223 }
9224}
9225impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9226 fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9227 ptr.untyped()
9228 }
9229}
9230impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9231 fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9232 Self(value.0)
9233 }
9234}
9235impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9236 fn from(value: TypeClausePtr<'db>) -> Self {
9237 Self(value.0)
9238 }
9239}
9240impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9241 fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9242 Self(value.0)
9243 }
9244}
9245impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9246 fn from(value: TypeClauseGreen<'db>) -> Self {
9247 Self(value.0)
9248 }
9249}
9250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9251pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9252impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9253 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9254 type StablePtr = OptionTypeClausePtr<'db>;
9255 type Green = OptionTypeClauseGreen<'db>;
9256 fn missing(db: &'db dyn Database) -> Self::Green {
9257 panic!("No missing variant.");
9258 }
9259 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9260 let kind = node.kind(db);
9261 match kind {
9262 SyntaxKind::OptionTypeClauseEmpty => {
9263 OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9264 }
9265 SyntaxKind::TypeClause => {
9266 OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9267 }
9268 _ => panic!(
9269 "Unexpected syntax kind {:?} when constructing {}.",
9270 kind, "OptionTypeClause"
9271 ),
9272 }
9273 }
9274 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9275 let kind = node.kind(db);
9276 match kind {
9277 SyntaxKind::OptionTypeClauseEmpty => {
9278 Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9279 }
9280 SyntaxKind::TypeClause => {
9281 Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9282 }
9283 _ => None,
9284 }
9285 }
9286 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9287 match self {
9288 OptionTypeClause::Empty(x) => x.as_syntax_node(),
9289 OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9290 }
9291 }
9292 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9293 OptionTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9294 }
9295}
9296impl<'db> OptionTypeClause<'db> {
9297 pub fn is_variant(kind: SyntaxKind) -> bool {
9299 matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9300 }
9301}
9302#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9303pub struct OptionTypeClauseEmpty<'db> {
9304 node: SyntaxNode<'db>,
9305}
9306impl<'db> OptionTypeClauseEmpty<'db> {
9307 pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9308 let children = [];
9309 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9310 OptionTypeClauseEmptyGreen(
9311 GreenNode {
9312 kind: SyntaxKind::OptionTypeClauseEmpty,
9313 details: GreenNodeDetails::Node { children: children.into(), width },
9314 }
9315 .intern(db),
9316 )
9317 }
9318}
9319impl<'db> OptionTypeClauseEmpty<'db> {}
9320#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9321pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9322impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9323impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9324 type SyntaxNode = OptionTypeClauseEmpty<'db>;
9325 fn untyped(self) -> SyntaxStablePtrId<'db> {
9326 self.0
9327 }
9328 fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9329 OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9330 }
9331}
9332impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9333 fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9334 ptr.untyped()
9335 }
9336}
9337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9338pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9339impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9340 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9341 type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9342 type Green = OptionTypeClauseEmptyGreen<'db>;
9343 fn missing(db: &'db dyn Database) -> Self::Green {
9344 OptionTypeClauseEmptyGreen(
9345 GreenNode {
9346 kind: SyntaxKind::OptionTypeClauseEmpty,
9347 details: GreenNodeDetails::Node {
9348 children: [].into(),
9349 width: TextWidth::default(),
9350 },
9351 }
9352 .intern(db),
9353 )
9354 }
9355 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9356 let kind = node.kind(db);
9357 assert_eq!(
9358 kind,
9359 SyntaxKind::OptionTypeClauseEmpty,
9360 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9361 kind,
9362 SyntaxKind::OptionTypeClauseEmpty
9363 );
9364 Self { node }
9365 }
9366 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9367 let kind = node.kind(db);
9368 if kind == SyntaxKind::OptionTypeClauseEmpty {
9369 Some(Self::from_syntax_node(db, node))
9370 } else {
9371 None
9372 }
9373 }
9374 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9375 self.node
9376 }
9377 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9378 OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9379 }
9380}
9381#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9382pub struct ReturnTypeClause<'db> {
9383 node: SyntaxNode<'db>,
9384}
9385impl<'db> ReturnTypeClause<'db> {
9386 pub const INDEX_ARROW: usize = 0;
9387 pub const INDEX_TY: usize = 1;
9388 pub fn new_green(
9389 db: &'db dyn Database,
9390 arrow: TerminalArrowGreen<'db>,
9391 ty: ExprGreen<'db>,
9392 ) -> ReturnTypeClauseGreen<'db> {
9393 let children = [arrow.0, ty.0];
9394 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9395 ReturnTypeClauseGreen(
9396 GreenNode {
9397 kind: SyntaxKind::ReturnTypeClause,
9398 details: GreenNodeDetails::Node { children: children.into(), width },
9399 }
9400 .intern(db),
9401 )
9402 }
9403}
9404impl<'db> ReturnTypeClause<'db> {
9405 pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9406 TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9407 }
9408 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9409 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9410 }
9411}
9412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9413pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9414impl<'db> ReturnTypeClausePtr<'db> {}
9415impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9416 type SyntaxNode = ReturnTypeClause<'db>;
9417 fn untyped(self) -> SyntaxStablePtrId<'db> {
9418 self.0
9419 }
9420 fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9421 ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9422 }
9423}
9424impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9425 fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9426 ptr.untyped()
9427 }
9428}
9429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9430pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9431impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9432 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9433 type StablePtr = ReturnTypeClausePtr<'db>;
9434 type Green = ReturnTypeClauseGreen<'db>;
9435 fn missing(db: &'db dyn Database) -> Self::Green {
9436 ReturnTypeClauseGreen(
9437 GreenNode {
9438 kind: SyntaxKind::ReturnTypeClause,
9439 details: GreenNodeDetails::Node {
9440 children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9441 width: TextWidth::default(),
9442 },
9443 }
9444 .intern(db),
9445 )
9446 }
9447 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9448 let kind = node.kind(db);
9449 assert_eq!(
9450 kind,
9451 SyntaxKind::ReturnTypeClause,
9452 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9453 kind,
9454 SyntaxKind::ReturnTypeClause
9455 );
9456 Self { node }
9457 }
9458 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9459 let kind = node.kind(db);
9460 if kind == SyntaxKind::ReturnTypeClause {
9461 Some(Self::from_syntax_node(db, node))
9462 } else {
9463 None
9464 }
9465 }
9466 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9467 self.node
9468 }
9469 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9470 ReturnTypeClausePtr(self.node.stable_ptr(db))
9471 }
9472}
9473#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9474pub enum OptionReturnTypeClause<'db> {
9475 Empty(OptionReturnTypeClauseEmpty<'db>),
9476 ReturnTypeClause(ReturnTypeClause<'db>),
9477}
9478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9479pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9480impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9481 type SyntaxNode = OptionReturnTypeClause<'db>;
9482 fn untyped(self) -> SyntaxStablePtrId<'db> {
9483 self.0
9484 }
9485 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9486 OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9487 }
9488}
9489impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9490 fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9491 ptr.untyped()
9492 }
9493}
9494impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9495 fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9496 Self(value.0)
9497 }
9498}
9499impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9500 fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9501 Self(value.0)
9502 }
9503}
9504impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9505 fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9506 Self(value.0)
9507 }
9508}
9509impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9510 fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9511 Self(value.0)
9512 }
9513}
9514#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9515pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9516impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9517 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9518 type StablePtr = OptionReturnTypeClausePtr<'db>;
9519 type Green = OptionReturnTypeClauseGreen<'db>;
9520 fn missing(db: &'db dyn Database) -> Self::Green {
9521 panic!("No missing variant.");
9522 }
9523 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9524 let kind = node.kind(db);
9525 match kind {
9526 SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9527 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9528 ),
9529 SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9530 ReturnTypeClause::from_syntax_node(db, node),
9531 ),
9532 _ => panic!(
9533 "Unexpected syntax kind {:?} when constructing {}.",
9534 kind, "OptionReturnTypeClause"
9535 ),
9536 }
9537 }
9538 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9539 let kind = node.kind(db);
9540 match kind {
9541 SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9542 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9543 )),
9544 SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9545 ReturnTypeClause::from_syntax_node(db, node),
9546 )),
9547 _ => None,
9548 }
9549 }
9550 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9551 match self {
9552 OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9553 OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9554 }
9555 }
9556 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9557 OptionReturnTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9558 }
9559}
9560impl<'db> OptionReturnTypeClause<'db> {
9561 pub fn is_variant(kind: SyntaxKind) -> bool {
9563 matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9564 }
9565}
9566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9567pub struct OptionReturnTypeClauseEmpty<'db> {
9568 node: SyntaxNode<'db>,
9569}
9570impl<'db> OptionReturnTypeClauseEmpty<'db> {
9571 pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9572 let children = [];
9573 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9574 OptionReturnTypeClauseEmptyGreen(
9575 GreenNode {
9576 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9577 details: GreenNodeDetails::Node { children: children.into(), width },
9578 }
9579 .intern(db),
9580 )
9581 }
9582}
9583impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9585pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9586impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9587impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9588 type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9589 fn untyped(self) -> SyntaxStablePtrId<'db> {
9590 self.0
9591 }
9592 fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9593 OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9594 }
9595}
9596impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9597 fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9598 ptr.untyped()
9599 }
9600}
9601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9602pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9603impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9604 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9605 type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9606 type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9607 fn missing(db: &'db dyn Database) -> Self::Green {
9608 OptionReturnTypeClauseEmptyGreen(
9609 GreenNode {
9610 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9611 details: GreenNodeDetails::Node {
9612 children: [].into(),
9613 width: TextWidth::default(),
9614 },
9615 }
9616 .intern(db),
9617 )
9618 }
9619 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9620 let kind = node.kind(db);
9621 assert_eq!(
9622 kind,
9623 SyntaxKind::OptionReturnTypeClauseEmpty,
9624 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9625 kind,
9626 SyntaxKind::OptionReturnTypeClauseEmpty
9627 );
9628 Self { node }
9629 }
9630 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9631 let kind = node.kind(db);
9632 if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9633 Some(Self::from_syntax_node(db, node))
9634 } else {
9635 None
9636 }
9637 }
9638 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9639 self.node
9640 }
9641 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9642 OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9643 }
9644}
9645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9646pub enum Statement<'db> {
9647 Let(StatementLet<'db>),
9648 Expr(StatementExpr<'db>),
9649 Continue(StatementContinue<'db>),
9650 Return(StatementReturn<'db>),
9651 Break(StatementBreak<'db>),
9652 Item(StatementItem<'db>),
9653 Missing(StatementMissing<'db>),
9654}
9655#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9656pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9657impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9658 type SyntaxNode = Statement<'db>;
9659 fn untyped(self) -> SyntaxStablePtrId<'db> {
9660 self.0
9661 }
9662 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9663 Statement::from_syntax_node(db, self.0.lookup(db))
9664 }
9665}
9666impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9667 fn from(ptr: StatementPtr<'db>) -> Self {
9668 ptr.untyped()
9669 }
9670}
9671impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9672 fn from(value: StatementLetPtr<'db>) -> Self {
9673 Self(value.0)
9674 }
9675}
9676impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9677 fn from(value: StatementExprPtr<'db>) -> Self {
9678 Self(value.0)
9679 }
9680}
9681impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9682 fn from(value: StatementContinuePtr<'db>) -> Self {
9683 Self(value.0)
9684 }
9685}
9686impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9687 fn from(value: StatementReturnPtr<'db>) -> Self {
9688 Self(value.0)
9689 }
9690}
9691impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9692 fn from(value: StatementBreakPtr<'db>) -> Self {
9693 Self(value.0)
9694 }
9695}
9696impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9697 fn from(value: StatementItemPtr<'db>) -> Self {
9698 Self(value.0)
9699 }
9700}
9701impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9702 fn from(value: StatementMissingPtr<'db>) -> Self {
9703 Self(value.0)
9704 }
9705}
9706impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9707 fn from(value: StatementLetGreen<'db>) -> Self {
9708 Self(value.0)
9709 }
9710}
9711impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9712 fn from(value: StatementExprGreen<'db>) -> Self {
9713 Self(value.0)
9714 }
9715}
9716impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9717 fn from(value: StatementContinueGreen<'db>) -> Self {
9718 Self(value.0)
9719 }
9720}
9721impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9722 fn from(value: StatementReturnGreen<'db>) -> Self {
9723 Self(value.0)
9724 }
9725}
9726impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9727 fn from(value: StatementBreakGreen<'db>) -> Self {
9728 Self(value.0)
9729 }
9730}
9731impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9732 fn from(value: StatementItemGreen<'db>) -> Self {
9733 Self(value.0)
9734 }
9735}
9736impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9737 fn from(value: StatementMissingGreen<'db>) -> Self {
9738 Self(value.0)
9739 }
9740}
9741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9742pub struct StatementGreen<'db>(pub GreenId<'db>);
9743impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9744 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9745 type StablePtr = StatementPtr<'db>;
9746 type Green = StatementGreen<'db>;
9747 fn missing(db: &'db dyn Database) -> Self::Green {
9748 StatementGreen(StatementMissing::missing(db).0)
9749 }
9750 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9751 let kind = node.kind(db);
9752 match kind {
9753 SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9754 SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9755 SyntaxKind::StatementContinue => {
9756 Statement::Continue(StatementContinue::from_syntax_node(db, node))
9757 }
9758 SyntaxKind::StatementReturn => {
9759 Statement::Return(StatementReturn::from_syntax_node(db, node))
9760 }
9761 SyntaxKind::StatementBreak => {
9762 Statement::Break(StatementBreak::from_syntax_node(db, node))
9763 }
9764 SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9765 SyntaxKind::StatementMissing => {
9766 Statement::Missing(StatementMissing::from_syntax_node(db, node))
9767 }
9768 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9769 }
9770 }
9771 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9772 let kind = node.kind(db);
9773 match kind {
9774 SyntaxKind::StatementLet => {
9775 Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9776 }
9777 SyntaxKind::StatementExpr => {
9778 Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9779 }
9780 SyntaxKind::StatementContinue => {
9781 Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9782 }
9783 SyntaxKind::StatementReturn => {
9784 Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9785 }
9786 SyntaxKind::StatementBreak => {
9787 Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9788 }
9789 SyntaxKind::StatementItem => {
9790 Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9791 }
9792 SyntaxKind::StatementMissing => {
9793 Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9794 }
9795 _ => None,
9796 }
9797 }
9798 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9799 match self {
9800 Statement::Let(x) => x.as_syntax_node(),
9801 Statement::Expr(x) => x.as_syntax_node(),
9802 Statement::Continue(x) => x.as_syntax_node(),
9803 Statement::Return(x) => x.as_syntax_node(),
9804 Statement::Break(x) => x.as_syntax_node(),
9805 Statement::Item(x) => x.as_syntax_node(),
9806 Statement::Missing(x) => x.as_syntax_node(),
9807 }
9808 }
9809 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9810 StatementPtr(self.as_syntax_node().stable_ptr(db))
9811 }
9812}
9813impl<'db> Statement<'db> {
9814 pub fn is_variant(kind: SyntaxKind) -> bool {
9816 matches!(
9817 kind,
9818 SyntaxKind::StatementLet
9819 | SyntaxKind::StatementExpr
9820 | SyntaxKind::StatementContinue
9821 | SyntaxKind::StatementReturn
9822 | SyntaxKind::StatementBreak
9823 | SyntaxKind::StatementItem
9824 | SyntaxKind::StatementMissing
9825 )
9826 }
9827}
9828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9829pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9830impl<'db> Deref for StatementList<'db> {
9831 type Target = ElementList<'db, Statement<'db>, 1>;
9832 fn deref(&self) -> &Self::Target {
9833 &self.0
9834 }
9835}
9836impl<'db> StatementList<'db> {
9837 pub fn new_green(
9838 db: &'db dyn Database,
9839 children: &[StatementGreen<'db>],
9840 ) -> StatementListGreen<'db> {
9841 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9842 StatementListGreen(
9843 GreenNode {
9844 kind: SyntaxKind::StatementList,
9845 details: GreenNodeDetails::Node {
9846 children: children.iter().map(|x| x.0).collect(),
9847 width,
9848 },
9849 }
9850 .intern(db),
9851 )
9852 }
9853}
9854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9855pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9856impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9857 type SyntaxNode = StatementList<'db>;
9858 fn untyped(self) -> SyntaxStablePtrId<'db> {
9859 self.0
9860 }
9861 fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9862 StatementList::from_syntax_node(db, self.0.lookup(db))
9863 }
9864}
9865impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9866 fn from(ptr: StatementListPtr<'db>) -> Self {
9867 ptr.untyped()
9868 }
9869}
9870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9871pub struct StatementListGreen<'db>(pub GreenId<'db>);
9872impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9873 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9874 type StablePtr = StatementListPtr<'db>;
9875 type Green = StatementListGreen<'db>;
9876 fn missing(db: &'db dyn Database) -> Self::Green {
9877 StatementListGreen(
9878 GreenNode {
9879 kind: SyntaxKind::StatementList,
9880 details: GreenNodeDetails::Node {
9881 children: [].into(),
9882 width: TextWidth::default(),
9883 },
9884 }
9885 .intern(db),
9886 )
9887 }
9888 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9889 Self(ElementList::new(node))
9890 }
9891 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9892 if node.kind(db) == SyntaxKind::StatementList {
9893 Some(Self(ElementList::new(node)))
9894 } else {
9895 None
9896 }
9897 }
9898 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9899 self.node
9900 }
9901 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9902 StatementListPtr(self.node.stable_ptr(db))
9903 }
9904}
9905#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9906pub struct StatementMissing<'db> {
9907 node: SyntaxNode<'db>,
9908}
9909impl<'db> StatementMissing<'db> {
9910 pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9911 let children = [];
9912 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9913 StatementMissingGreen(
9914 GreenNode {
9915 kind: SyntaxKind::StatementMissing,
9916 details: GreenNodeDetails::Node { children: children.into(), width },
9917 }
9918 .intern(db),
9919 )
9920 }
9921}
9922impl<'db> StatementMissing<'db> {}
9923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9924pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9925impl<'db> StatementMissingPtr<'db> {}
9926impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
9927 type SyntaxNode = StatementMissing<'db>;
9928 fn untyped(self) -> SyntaxStablePtrId<'db> {
9929 self.0
9930 }
9931 fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
9932 StatementMissing::from_syntax_node(db, self.0.lookup(db))
9933 }
9934}
9935impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
9936 fn from(ptr: StatementMissingPtr<'db>) -> Self {
9937 ptr.untyped()
9938 }
9939}
9940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9941pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
9942impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
9943 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
9944 type StablePtr = StatementMissingPtr<'db>;
9945 type Green = StatementMissingGreen<'db>;
9946 fn missing(db: &'db dyn Database) -> Self::Green {
9947 StatementMissingGreen(
9948 GreenNode {
9949 kind: SyntaxKind::StatementMissing,
9950 details: GreenNodeDetails::Node {
9951 children: [].into(),
9952 width: TextWidth::default(),
9953 },
9954 }
9955 .intern(db),
9956 )
9957 }
9958 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9959 let kind = node.kind(db);
9960 assert_eq!(
9961 kind,
9962 SyntaxKind::StatementMissing,
9963 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9964 kind,
9965 SyntaxKind::StatementMissing
9966 );
9967 Self { node }
9968 }
9969 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9970 let kind = node.kind(db);
9971 if kind == SyntaxKind::StatementMissing {
9972 Some(Self::from_syntax_node(db, node))
9973 } else {
9974 None
9975 }
9976 }
9977 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9978 self.node
9979 }
9980 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9981 StatementMissingPtr(self.node.stable_ptr(db))
9982 }
9983}
9984#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9985pub struct StatementLet<'db> {
9986 node: SyntaxNode<'db>,
9987}
9988impl<'db> StatementLet<'db> {
9989 pub const INDEX_ATTRIBUTES: usize = 0;
9990 pub const INDEX_LET_KW: usize = 1;
9991 pub const INDEX_PATTERN: usize = 2;
9992 pub const INDEX_TYPE_CLAUSE: usize = 3;
9993 pub const INDEX_EQ: usize = 4;
9994 pub const INDEX_RHS: usize = 5;
9995 pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
9996 pub const INDEX_SEMICOLON: usize = 7;
9997 pub fn new_green(
9998 db: &'db dyn Database,
9999 attributes: AttributeListGreen<'db>,
10000 let_kw: TerminalLetGreen<'db>,
10001 pattern: PatternGreen<'db>,
10002 type_clause: OptionTypeClauseGreen<'db>,
10003 eq: TerminalEqGreen<'db>,
10004 rhs: ExprGreen<'db>,
10005 let_else_clause: OptionLetElseClauseGreen<'db>,
10006 semicolon: TerminalSemicolonGreen<'db>,
10007 ) -> StatementLetGreen<'db> {
10008 let children = [
10009 attributes.0,
10010 let_kw.0,
10011 pattern.0,
10012 type_clause.0,
10013 eq.0,
10014 rhs.0,
10015 let_else_clause.0,
10016 semicolon.0,
10017 ];
10018 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10019 StatementLetGreen(
10020 GreenNode {
10021 kind: SyntaxKind::StatementLet,
10022 details: GreenNodeDetails::Node { children: children.into(), width },
10023 }
10024 .intern(db),
10025 )
10026 }
10027}
10028impl<'db> StatementLet<'db> {
10029 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10030 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10031 }
10032 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10033 TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10034 }
10035 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10036 Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10037 }
10038 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10039 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10040 }
10041 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10042 TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10043 }
10044 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10045 Expr::from_syntax_node(db, self.node.get_children(db)[5])
10046 }
10047 pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10048 OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10049 }
10050 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10051 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10052 }
10053}
10054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10055pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10056impl<'db> StatementLetPtr<'db> {
10057 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10058 PatternGreen(self.0.0.key_fields(db)[0])
10059 }
10060}
10061impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10062 type SyntaxNode = StatementLet<'db>;
10063 fn untyped(self) -> SyntaxStablePtrId<'db> {
10064 self.0
10065 }
10066 fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10067 StatementLet::from_syntax_node(db, self.0.lookup(db))
10068 }
10069}
10070impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10071 fn from(ptr: StatementLetPtr<'db>) -> Self {
10072 ptr.untyped()
10073 }
10074}
10075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10076pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10077impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10078 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10079 type StablePtr = StatementLetPtr<'db>;
10080 type Green = StatementLetGreen<'db>;
10081 fn missing(db: &'db dyn Database) -> Self::Green {
10082 StatementLetGreen(
10083 GreenNode {
10084 kind: SyntaxKind::StatementLet,
10085 details: GreenNodeDetails::Node {
10086 children: [
10087 AttributeList::missing(db).0,
10088 TerminalLet::missing(db).0,
10089 Pattern::missing(db).0,
10090 OptionTypeClause::missing(db).0,
10091 TerminalEq::missing(db).0,
10092 Expr::missing(db).0,
10093 OptionLetElseClause::missing(db).0,
10094 TerminalSemicolon::missing(db).0,
10095 ]
10096 .into(),
10097 width: TextWidth::default(),
10098 },
10099 }
10100 .intern(db),
10101 )
10102 }
10103 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10104 let kind = node.kind(db);
10105 assert_eq!(
10106 kind,
10107 SyntaxKind::StatementLet,
10108 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10109 kind,
10110 SyntaxKind::StatementLet
10111 );
10112 Self { node }
10113 }
10114 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10115 let kind = node.kind(db);
10116 if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10117 }
10118 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10119 self.node
10120 }
10121 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10122 StatementLetPtr(self.node.stable_ptr(db))
10123 }
10124}
10125#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10126pub struct LetElseClause<'db> {
10127 node: SyntaxNode<'db>,
10128}
10129impl<'db> LetElseClause<'db> {
10130 pub const INDEX_ELSE_KW: usize = 0;
10131 pub const INDEX_ELSE_BLOCK: usize = 1;
10132 pub fn new_green(
10133 db: &'db dyn Database,
10134 else_kw: TerminalElseGreen<'db>,
10135 else_block: ExprBlockGreen<'db>,
10136 ) -> LetElseClauseGreen<'db> {
10137 let children = [else_kw.0, else_block.0];
10138 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10139 LetElseClauseGreen(
10140 GreenNode {
10141 kind: SyntaxKind::LetElseClause,
10142 details: GreenNodeDetails::Node { children: children.into(), width },
10143 }
10144 .intern(db),
10145 )
10146 }
10147}
10148impl<'db> LetElseClause<'db> {
10149 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10150 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10151 }
10152 pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10153 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10154 }
10155}
10156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10157pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10158impl<'db> LetElseClausePtr<'db> {}
10159impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10160 type SyntaxNode = LetElseClause<'db>;
10161 fn untyped(self) -> SyntaxStablePtrId<'db> {
10162 self.0
10163 }
10164 fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10165 LetElseClause::from_syntax_node(db, self.0.lookup(db))
10166 }
10167}
10168impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10169 fn from(ptr: LetElseClausePtr<'db>) -> Self {
10170 ptr.untyped()
10171 }
10172}
10173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10174pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10175impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10176 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10177 type StablePtr = LetElseClausePtr<'db>;
10178 type Green = LetElseClauseGreen<'db>;
10179 fn missing(db: &'db dyn Database) -> Self::Green {
10180 LetElseClauseGreen(
10181 GreenNode {
10182 kind: SyntaxKind::LetElseClause,
10183 details: GreenNodeDetails::Node {
10184 children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10185 width: TextWidth::default(),
10186 },
10187 }
10188 .intern(db),
10189 )
10190 }
10191 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10192 let kind = node.kind(db);
10193 assert_eq!(
10194 kind,
10195 SyntaxKind::LetElseClause,
10196 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10197 kind,
10198 SyntaxKind::LetElseClause
10199 );
10200 Self { node }
10201 }
10202 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10203 let kind = node.kind(db);
10204 if kind == SyntaxKind::LetElseClause {
10205 Some(Self::from_syntax_node(db, node))
10206 } else {
10207 None
10208 }
10209 }
10210 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10211 self.node
10212 }
10213 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10214 LetElseClausePtr(self.node.stable_ptr(db))
10215 }
10216}
10217#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10218pub enum OptionLetElseClause<'db> {
10219 Empty(OptionLetElseClauseEmpty<'db>),
10220 LetElseClause(LetElseClause<'db>),
10221}
10222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10223pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10224impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10225 type SyntaxNode = OptionLetElseClause<'db>;
10226 fn untyped(self) -> SyntaxStablePtrId<'db> {
10227 self.0
10228 }
10229 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10230 OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10231 }
10232}
10233impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10234 fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10235 ptr.untyped()
10236 }
10237}
10238impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10239 fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10240 Self(value.0)
10241 }
10242}
10243impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10244 fn from(value: LetElseClausePtr<'db>) -> Self {
10245 Self(value.0)
10246 }
10247}
10248impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10249 fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10250 Self(value.0)
10251 }
10252}
10253impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10254 fn from(value: LetElseClauseGreen<'db>) -> Self {
10255 Self(value.0)
10256 }
10257}
10258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10259pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10260impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10261 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10262 type StablePtr = OptionLetElseClausePtr<'db>;
10263 type Green = OptionLetElseClauseGreen<'db>;
10264 fn missing(db: &'db dyn Database) -> Self::Green {
10265 panic!("No missing variant.");
10266 }
10267 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10268 let kind = node.kind(db);
10269 match kind {
10270 SyntaxKind::OptionLetElseClauseEmpty => {
10271 OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10272 }
10273 SyntaxKind::LetElseClause => {
10274 OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10275 }
10276 _ => panic!(
10277 "Unexpected syntax kind {:?} when constructing {}.",
10278 kind, "OptionLetElseClause"
10279 ),
10280 }
10281 }
10282 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10283 let kind = node.kind(db);
10284 match kind {
10285 SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10286 OptionLetElseClauseEmpty::from_syntax_node(db, node),
10287 )),
10288 SyntaxKind::LetElseClause => {
10289 Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10290 }
10291 _ => None,
10292 }
10293 }
10294 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10295 match self {
10296 OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10297 OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10298 }
10299 }
10300 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10301 OptionLetElseClausePtr(self.as_syntax_node().stable_ptr(db))
10302 }
10303}
10304impl<'db> OptionLetElseClause<'db> {
10305 pub fn is_variant(kind: SyntaxKind) -> bool {
10307 matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10308 }
10309}
10310#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10311pub struct OptionLetElseClauseEmpty<'db> {
10312 node: SyntaxNode<'db>,
10313}
10314impl<'db> OptionLetElseClauseEmpty<'db> {
10315 pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10316 let children = [];
10317 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10318 OptionLetElseClauseEmptyGreen(
10319 GreenNode {
10320 kind: SyntaxKind::OptionLetElseClauseEmpty,
10321 details: GreenNodeDetails::Node { children: children.into(), width },
10322 }
10323 .intern(db),
10324 )
10325 }
10326}
10327impl<'db> OptionLetElseClauseEmpty<'db> {}
10328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10329pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10330impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10331impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10332 type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10333 fn untyped(self) -> SyntaxStablePtrId<'db> {
10334 self.0
10335 }
10336 fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10337 OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10338 }
10339}
10340impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10341 fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10342 ptr.untyped()
10343 }
10344}
10345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10346pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10347impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10348 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10349 type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10350 type Green = OptionLetElseClauseEmptyGreen<'db>;
10351 fn missing(db: &'db dyn Database) -> Self::Green {
10352 OptionLetElseClauseEmptyGreen(
10353 GreenNode {
10354 kind: SyntaxKind::OptionLetElseClauseEmpty,
10355 details: GreenNodeDetails::Node {
10356 children: [].into(),
10357 width: TextWidth::default(),
10358 },
10359 }
10360 .intern(db),
10361 )
10362 }
10363 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10364 let kind = node.kind(db);
10365 assert_eq!(
10366 kind,
10367 SyntaxKind::OptionLetElseClauseEmpty,
10368 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10369 kind,
10370 SyntaxKind::OptionLetElseClauseEmpty
10371 );
10372 Self { node }
10373 }
10374 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10375 let kind = node.kind(db);
10376 if kind == SyntaxKind::OptionLetElseClauseEmpty {
10377 Some(Self::from_syntax_node(db, node))
10378 } else {
10379 None
10380 }
10381 }
10382 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10383 self.node
10384 }
10385 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10386 OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10387 }
10388}
10389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10390pub enum OptionTerminalSemicolon<'db> {
10391 Empty(OptionTerminalSemicolonEmpty<'db>),
10392 TerminalSemicolon(TerminalSemicolon<'db>),
10393}
10394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10395pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10396impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10397 type SyntaxNode = OptionTerminalSemicolon<'db>;
10398 fn untyped(self) -> SyntaxStablePtrId<'db> {
10399 self.0
10400 }
10401 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10402 OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10403 }
10404}
10405impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10406 fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10407 ptr.untyped()
10408 }
10409}
10410impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10411 fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10412 Self(value.0)
10413 }
10414}
10415impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10416 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10417 Self(value.0)
10418 }
10419}
10420impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10421 fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10422 Self(value.0)
10423 }
10424}
10425impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10426 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10427 Self(value.0)
10428 }
10429}
10430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10431pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10432impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10433 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10434 type StablePtr = OptionTerminalSemicolonPtr<'db>;
10435 type Green = OptionTerminalSemicolonGreen<'db>;
10436 fn missing(db: &'db dyn Database) -> Self::Green {
10437 panic!("No missing variant.");
10438 }
10439 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10440 let kind = node.kind(db);
10441 match kind {
10442 SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10443 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10444 ),
10445 SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10446 TerminalSemicolon::from_syntax_node(db, node),
10447 ),
10448 _ => panic!(
10449 "Unexpected syntax kind {:?} when constructing {}.",
10450 kind, "OptionTerminalSemicolon"
10451 ),
10452 }
10453 }
10454 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10455 let kind = node.kind(db);
10456 match kind {
10457 SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10458 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10459 )),
10460 SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10461 TerminalSemicolon::from_syntax_node(db, node),
10462 )),
10463 _ => None,
10464 }
10465 }
10466 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10467 match self {
10468 OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10469 OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10470 }
10471 }
10472 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10473 OptionTerminalSemicolonPtr(self.as_syntax_node().stable_ptr(db))
10474 }
10475}
10476impl<'db> OptionTerminalSemicolon<'db> {
10477 pub fn is_variant(kind: SyntaxKind) -> bool {
10479 matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10480 }
10481}
10482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10483pub struct OptionTerminalSemicolonEmpty<'db> {
10484 node: SyntaxNode<'db>,
10485}
10486impl<'db> OptionTerminalSemicolonEmpty<'db> {
10487 pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10488 let children = [];
10489 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10490 OptionTerminalSemicolonEmptyGreen(
10491 GreenNode {
10492 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10493 details: GreenNodeDetails::Node { children: children.into(), width },
10494 }
10495 .intern(db),
10496 )
10497 }
10498}
10499impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10501pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10502impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10503impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10504 type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10505 fn untyped(self) -> SyntaxStablePtrId<'db> {
10506 self.0
10507 }
10508 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10509 OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10510 }
10511}
10512impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10513 fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10514 ptr.untyped()
10515 }
10516}
10517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10518pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10519impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10520 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10521 type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10522 type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10523 fn missing(db: &'db dyn Database) -> Self::Green {
10524 OptionTerminalSemicolonEmptyGreen(
10525 GreenNode {
10526 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10527 details: GreenNodeDetails::Node {
10528 children: [].into(),
10529 width: TextWidth::default(),
10530 },
10531 }
10532 .intern(db),
10533 )
10534 }
10535 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10536 let kind = node.kind(db);
10537 assert_eq!(
10538 kind,
10539 SyntaxKind::OptionTerminalSemicolonEmpty,
10540 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10541 kind,
10542 SyntaxKind::OptionTerminalSemicolonEmpty
10543 );
10544 Self { node }
10545 }
10546 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10547 let kind = node.kind(db);
10548 if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10549 Some(Self::from_syntax_node(db, node))
10550 } else {
10551 None
10552 }
10553 }
10554 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10555 self.node
10556 }
10557 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10558 OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10559 }
10560}
10561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10562pub struct StatementExpr<'db> {
10563 node: SyntaxNode<'db>,
10564}
10565impl<'db> StatementExpr<'db> {
10566 pub const INDEX_ATTRIBUTES: usize = 0;
10567 pub const INDEX_EXPR: usize = 1;
10568 pub const INDEX_SEMICOLON: usize = 2;
10569 pub fn new_green(
10570 db: &'db dyn Database,
10571 attributes: AttributeListGreen<'db>,
10572 expr: ExprGreen<'db>,
10573 semicolon: OptionTerminalSemicolonGreen<'db>,
10574 ) -> StatementExprGreen<'db> {
10575 let children = [attributes.0, expr.0, semicolon.0];
10576 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10577 StatementExprGreen(
10578 GreenNode {
10579 kind: SyntaxKind::StatementExpr,
10580 details: GreenNodeDetails::Node { children: children.into(), width },
10581 }
10582 .intern(db),
10583 )
10584 }
10585}
10586impl<'db> StatementExpr<'db> {
10587 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10588 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10589 }
10590 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10591 Expr::from_syntax_node(db, self.node.get_children(db)[1])
10592 }
10593 pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10594 OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10595 }
10596}
10597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10598pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10599impl<'db> StatementExprPtr<'db> {}
10600impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10601 type SyntaxNode = StatementExpr<'db>;
10602 fn untyped(self) -> SyntaxStablePtrId<'db> {
10603 self.0
10604 }
10605 fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10606 StatementExpr::from_syntax_node(db, self.0.lookup(db))
10607 }
10608}
10609impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10610 fn from(ptr: StatementExprPtr<'db>) -> Self {
10611 ptr.untyped()
10612 }
10613}
10614#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10615pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10616impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10617 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10618 type StablePtr = StatementExprPtr<'db>;
10619 type Green = StatementExprGreen<'db>;
10620 fn missing(db: &'db dyn Database) -> Self::Green {
10621 StatementExprGreen(
10622 GreenNode {
10623 kind: SyntaxKind::StatementExpr,
10624 details: GreenNodeDetails::Node {
10625 children: [
10626 AttributeList::missing(db).0,
10627 Expr::missing(db).0,
10628 OptionTerminalSemicolon::missing(db).0,
10629 ]
10630 .into(),
10631 width: TextWidth::default(),
10632 },
10633 }
10634 .intern(db),
10635 )
10636 }
10637 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10638 let kind = node.kind(db);
10639 assert_eq!(
10640 kind,
10641 SyntaxKind::StatementExpr,
10642 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10643 kind,
10644 SyntaxKind::StatementExpr
10645 );
10646 Self { node }
10647 }
10648 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10649 let kind = node.kind(db);
10650 if kind == SyntaxKind::StatementExpr {
10651 Some(Self::from_syntax_node(db, node))
10652 } else {
10653 None
10654 }
10655 }
10656 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10657 self.node
10658 }
10659 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10660 StatementExprPtr(self.node.stable_ptr(db))
10661 }
10662}
10663#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10664pub struct StatementContinue<'db> {
10665 node: SyntaxNode<'db>,
10666}
10667impl<'db> StatementContinue<'db> {
10668 pub const INDEX_ATTRIBUTES: usize = 0;
10669 pub const INDEX_CONTINUE_KW: usize = 1;
10670 pub const INDEX_SEMICOLON: usize = 2;
10671 pub fn new_green(
10672 db: &'db dyn Database,
10673 attributes: AttributeListGreen<'db>,
10674 continue_kw: TerminalContinueGreen<'db>,
10675 semicolon: TerminalSemicolonGreen<'db>,
10676 ) -> StatementContinueGreen<'db> {
10677 let children = [attributes.0, continue_kw.0, semicolon.0];
10678 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10679 StatementContinueGreen(
10680 GreenNode {
10681 kind: SyntaxKind::StatementContinue,
10682 details: GreenNodeDetails::Node { children: children.into(), width },
10683 }
10684 .intern(db),
10685 )
10686 }
10687}
10688impl<'db> StatementContinue<'db> {
10689 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10690 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10691 }
10692 pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10693 TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10694 }
10695 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10696 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10697 }
10698}
10699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10700pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10701impl<'db> StatementContinuePtr<'db> {}
10702impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10703 type SyntaxNode = StatementContinue<'db>;
10704 fn untyped(self) -> SyntaxStablePtrId<'db> {
10705 self.0
10706 }
10707 fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10708 StatementContinue::from_syntax_node(db, self.0.lookup(db))
10709 }
10710}
10711impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10712 fn from(ptr: StatementContinuePtr<'db>) -> Self {
10713 ptr.untyped()
10714 }
10715}
10716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10717pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10718impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10719 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10720 type StablePtr = StatementContinuePtr<'db>;
10721 type Green = StatementContinueGreen<'db>;
10722 fn missing(db: &'db dyn Database) -> Self::Green {
10723 StatementContinueGreen(
10724 GreenNode {
10725 kind: SyntaxKind::StatementContinue,
10726 details: GreenNodeDetails::Node {
10727 children: [
10728 AttributeList::missing(db).0,
10729 TerminalContinue::missing(db).0,
10730 TerminalSemicolon::missing(db).0,
10731 ]
10732 .into(),
10733 width: TextWidth::default(),
10734 },
10735 }
10736 .intern(db),
10737 )
10738 }
10739 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10740 let kind = node.kind(db);
10741 assert_eq!(
10742 kind,
10743 SyntaxKind::StatementContinue,
10744 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10745 kind,
10746 SyntaxKind::StatementContinue
10747 );
10748 Self { node }
10749 }
10750 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10751 let kind = node.kind(db);
10752 if kind == SyntaxKind::StatementContinue {
10753 Some(Self::from_syntax_node(db, node))
10754 } else {
10755 None
10756 }
10757 }
10758 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10759 self.node
10760 }
10761 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10762 StatementContinuePtr(self.node.stable_ptr(db))
10763 }
10764}
10765#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10766pub struct ExprClause<'db> {
10767 node: SyntaxNode<'db>,
10768}
10769impl<'db> ExprClause<'db> {
10770 pub const INDEX_EXPR: usize = 0;
10771 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10772 let children = [expr.0];
10773 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10774 ExprClauseGreen(
10775 GreenNode {
10776 kind: SyntaxKind::ExprClause,
10777 details: GreenNodeDetails::Node { children: children.into(), width },
10778 }
10779 .intern(db),
10780 )
10781 }
10782}
10783impl<'db> ExprClause<'db> {
10784 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10785 Expr::from_syntax_node(db, self.node.get_children(db)[0])
10786 }
10787}
10788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10789pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10790impl<'db> ExprClausePtr<'db> {}
10791impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10792 type SyntaxNode = ExprClause<'db>;
10793 fn untyped(self) -> SyntaxStablePtrId<'db> {
10794 self.0
10795 }
10796 fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10797 ExprClause::from_syntax_node(db, self.0.lookup(db))
10798 }
10799}
10800impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10801 fn from(ptr: ExprClausePtr<'db>) -> Self {
10802 ptr.untyped()
10803 }
10804}
10805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10806pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10807impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10808 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10809 type StablePtr = ExprClausePtr<'db>;
10810 type Green = ExprClauseGreen<'db>;
10811 fn missing(db: &'db dyn Database) -> Self::Green {
10812 ExprClauseGreen(
10813 GreenNode {
10814 kind: SyntaxKind::ExprClause,
10815 details: GreenNodeDetails::Node {
10816 children: [Expr::missing(db).0].into(),
10817 width: TextWidth::default(),
10818 },
10819 }
10820 .intern(db),
10821 )
10822 }
10823 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10824 let kind = node.kind(db);
10825 assert_eq!(
10826 kind,
10827 SyntaxKind::ExprClause,
10828 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10829 kind,
10830 SyntaxKind::ExprClause
10831 );
10832 Self { node }
10833 }
10834 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10835 let kind = node.kind(db);
10836 if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10837 }
10838 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10839 self.node
10840 }
10841 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10842 ExprClausePtr(self.node.stable_ptr(db))
10843 }
10844}
10845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10846pub enum OptionExprClause<'db> {
10847 Empty(OptionExprClauseEmpty<'db>),
10848 ExprClause(ExprClause<'db>),
10849}
10850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10851pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10852impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10853 type SyntaxNode = OptionExprClause<'db>;
10854 fn untyped(self) -> SyntaxStablePtrId<'db> {
10855 self.0
10856 }
10857 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10858 OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10859 }
10860}
10861impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10862 fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10863 ptr.untyped()
10864 }
10865}
10866impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10867 fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10868 Self(value.0)
10869 }
10870}
10871impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10872 fn from(value: ExprClausePtr<'db>) -> Self {
10873 Self(value.0)
10874 }
10875}
10876impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10877 fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10878 Self(value.0)
10879 }
10880}
10881impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10882 fn from(value: ExprClauseGreen<'db>) -> Self {
10883 Self(value.0)
10884 }
10885}
10886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10887pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10888impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10889 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10890 type StablePtr = OptionExprClausePtr<'db>;
10891 type Green = OptionExprClauseGreen<'db>;
10892 fn missing(db: &'db dyn Database) -> Self::Green {
10893 panic!("No missing variant.");
10894 }
10895 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10896 let kind = node.kind(db);
10897 match kind {
10898 SyntaxKind::OptionExprClauseEmpty => {
10899 OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10900 }
10901 SyntaxKind::ExprClause => {
10902 OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10903 }
10904 _ => panic!(
10905 "Unexpected syntax kind {:?} when constructing {}.",
10906 kind, "OptionExprClause"
10907 ),
10908 }
10909 }
10910 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10911 let kind = node.kind(db);
10912 match kind {
10913 SyntaxKind::OptionExprClauseEmpty => {
10914 Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10915 }
10916 SyntaxKind::ExprClause => {
10917 Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10918 }
10919 _ => None,
10920 }
10921 }
10922 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10923 match self {
10924 OptionExprClause::Empty(x) => x.as_syntax_node(),
10925 OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10926 }
10927 }
10928 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10929 OptionExprClausePtr(self.as_syntax_node().stable_ptr(db))
10930 }
10931}
10932impl<'db> OptionExprClause<'db> {
10933 pub fn is_variant(kind: SyntaxKind) -> bool {
10935 matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
10936 }
10937}
10938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10939pub struct OptionExprClauseEmpty<'db> {
10940 node: SyntaxNode<'db>,
10941}
10942impl<'db> OptionExprClauseEmpty<'db> {
10943 pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
10944 let children = [];
10945 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10946 OptionExprClauseEmptyGreen(
10947 GreenNode {
10948 kind: SyntaxKind::OptionExprClauseEmpty,
10949 details: GreenNodeDetails::Node { children: children.into(), width },
10950 }
10951 .intern(db),
10952 )
10953 }
10954}
10955impl<'db> OptionExprClauseEmpty<'db> {}
10956#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10957pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10958impl<'db> OptionExprClauseEmptyPtr<'db> {}
10959impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
10960 type SyntaxNode = OptionExprClauseEmpty<'db>;
10961 fn untyped(self) -> SyntaxStablePtrId<'db> {
10962 self.0
10963 }
10964 fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
10965 OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10966 }
10967}
10968impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10969 fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
10970 ptr.untyped()
10971 }
10972}
10973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10974pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
10975impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
10976 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
10977 type StablePtr = OptionExprClauseEmptyPtr<'db>;
10978 type Green = OptionExprClauseEmptyGreen<'db>;
10979 fn missing(db: &'db dyn Database) -> Self::Green {
10980 OptionExprClauseEmptyGreen(
10981 GreenNode {
10982 kind: SyntaxKind::OptionExprClauseEmpty,
10983 details: GreenNodeDetails::Node {
10984 children: [].into(),
10985 width: TextWidth::default(),
10986 },
10987 }
10988 .intern(db),
10989 )
10990 }
10991 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10992 let kind = node.kind(db);
10993 assert_eq!(
10994 kind,
10995 SyntaxKind::OptionExprClauseEmpty,
10996 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10997 kind,
10998 SyntaxKind::OptionExprClauseEmpty
10999 );
11000 Self { node }
11001 }
11002 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11003 let kind = node.kind(db);
11004 if kind == SyntaxKind::OptionExprClauseEmpty {
11005 Some(Self::from_syntax_node(db, node))
11006 } else {
11007 None
11008 }
11009 }
11010 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11011 self.node
11012 }
11013 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11014 OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11015 }
11016}
11017#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11018pub struct StatementReturn<'db> {
11019 node: SyntaxNode<'db>,
11020}
11021impl<'db> StatementReturn<'db> {
11022 pub const INDEX_ATTRIBUTES: usize = 0;
11023 pub const INDEX_RETURN_KW: usize = 1;
11024 pub const INDEX_EXPR_CLAUSE: usize = 2;
11025 pub const INDEX_SEMICOLON: usize = 3;
11026 pub fn new_green(
11027 db: &'db dyn Database,
11028 attributes: AttributeListGreen<'db>,
11029 return_kw: TerminalReturnGreen<'db>,
11030 expr_clause: OptionExprClauseGreen<'db>,
11031 semicolon: TerminalSemicolonGreen<'db>,
11032 ) -> StatementReturnGreen<'db> {
11033 let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11034 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11035 StatementReturnGreen(
11036 GreenNode {
11037 kind: SyntaxKind::StatementReturn,
11038 details: GreenNodeDetails::Node { children: children.into(), width },
11039 }
11040 .intern(db),
11041 )
11042 }
11043}
11044impl<'db> StatementReturn<'db> {
11045 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11046 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11047 }
11048 pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11049 TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11050 }
11051 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11052 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11053 }
11054 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11055 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11056 }
11057}
11058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11059pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11060impl<'db> StatementReturnPtr<'db> {}
11061impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11062 type SyntaxNode = StatementReturn<'db>;
11063 fn untyped(self) -> SyntaxStablePtrId<'db> {
11064 self.0
11065 }
11066 fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11067 StatementReturn::from_syntax_node(db, self.0.lookup(db))
11068 }
11069}
11070impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11071 fn from(ptr: StatementReturnPtr<'db>) -> Self {
11072 ptr.untyped()
11073 }
11074}
11075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11076pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11077impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11078 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11079 type StablePtr = StatementReturnPtr<'db>;
11080 type Green = StatementReturnGreen<'db>;
11081 fn missing(db: &'db dyn Database) -> Self::Green {
11082 StatementReturnGreen(
11083 GreenNode {
11084 kind: SyntaxKind::StatementReturn,
11085 details: GreenNodeDetails::Node {
11086 children: [
11087 AttributeList::missing(db).0,
11088 TerminalReturn::missing(db).0,
11089 OptionExprClause::missing(db).0,
11090 TerminalSemicolon::missing(db).0,
11091 ]
11092 .into(),
11093 width: TextWidth::default(),
11094 },
11095 }
11096 .intern(db),
11097 )
11098 }
11099 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11100 let kind = node.kind(db);
11101 assert_eq!(
11102 kind,
11103 SyntaxKind::StatementReturn,
11104 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11105 kind,
11106 SyntaxKind::StatementReturn
11107 );
11108 Self { node }
11109 }
11110 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11111 let kind = node.kind(db);
11112 if kind == SyntaxKind::StatementReturn {
11113 Some(Self::from_syntax_node(db, node))
11114 } else {
11115 None
11116 }
11117 }
11118 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11119 self.node
11120 }
11121 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11122 StatementReturnPtr(self.node.stable_ptr(db))
11123 }
11124}
11125#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11126pub struct StatementBreak<'db> {
11127 node: SyntaxNode<'db>,
11128}
11129impl<'db> StatementBreak<'db> {
11130 pub const INDEX_ATTRIBUTES: usize = 0;
11131 pub const INDEX_BREAK_KW: usize = 1;
11132 pub const INDEX_EXPR_CLAUSE: usize = 2;
11133 pub const INDEX_SEMICOLON: usize = 3;
11134 pub fn new_green(
11135 db: &'db dyn Database,
11136 attributes: AttributeListGreen<'db>,
11137 break_kw: TerminalBreakGreen<'db>,
11138 expr_clause: OptionExprClauseGreen<'db>,
11139 semicolon: TerminalSemicolonGreen<'db>,
11140 ) -> StatementBreakGreen<'db> {
11141 let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11142 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11143 StatementBreakGreen(
11144 GreenNode {
11145 kind: SyntaxKind::StatementBreak,
11146 details: GreenNodeDetails::Node { children: children.into(), width },
11147 }
11148 .intern(db),
11149 )
11150 }
11151}
11152impl<'db> StatementBreak<'db> {
11153 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11154 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11155 }
11156 pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11157 TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11158 }
11159 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11160 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11161 }
11162 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11163 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11164 }
11165}
11166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11167pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11168impl<'db> StatementBreakPtr<'db> {}
11169impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11170 type SyntaxNode = StatementBreak<'db>;
11171 fn untyped(self) -> SyntaxStablePtrId<'db> {
11172 self.0
11173 }
11174 fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11175 StatementBreak::from_syntax_node(db, self.0.lookup(db))
11176 }
11177}
11178impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11179 fn from(ptr: StatementBreakPtr<'db>) -> Self {
11180 ptr.untyped()
11181 }
11182}
11183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11184pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11185impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11186 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11187 type StablePtr = StatementBreakPtr<'db>;
11188 type Green = StatementBreakGreen<'db>;
11189 fn missing(db: &'db dyn Database) -> Self::Green {
11190 StatementBreakGreen(
11191 GreenNode {
11192 kind: SyntaxKind::StatementBreak,
11193 details: GreenNodeDetails::Node {
11194 children: [
11195 AttributeList::missing(db).0,
11196 TerminalBreak::missing(db).0,
11197 OptionExprClause::missing(db).0,
11198 TerminalSemicolon::missing(db).0,
11199 ]
11200 .into(),
11201 width: TextWidth::default(),
11202 },
11203 }
11204 .intern(db),
11205 )
11206 }
11207 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11208 let kind = node.kind(db);
11209 assert_eq!(
11210 kind,
11211 SyntaxKind::StatementBreak,
11212 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11213 kind,
11214 SyntaxKind::StatementBreak
11215 );
11216 Self { node }
11217 }
11218 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11219 let kind = node.kind(db);
11220 if kind == SyntaxKind::StatementBreak {
11221 Some(Self::from_syntax_node(db, node))
11222 } else {
11223 None
11224 }
11225 }
11226 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11227 self.node
11228 }
11229 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11230 StatementBreakPtr(self.node.stable_ptr(db))
11231 }
11232}
11233#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11234pub struct StatementItem<'db> {
11235 node: SyntaxNode<'db>,
11236}
11237impl<'db> StatementItem<'db> {
11238 pub const INDEX_ITEM: usize = 0;
11239 pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11240 let children = [item.0];
11241 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11242 StatementItemGreen(
11243 GreenNode {
11244 kind: SyntaxKind::StatementItem,
11245 details: GreenNodeDetails::Node { children: children.into(), width },
11246 }
11247 .intern(db),
11248 )
11249 }
11250}
11251impl<'db> StatementItem<'db> {
11252 pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11253 ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11254 }
11255}
11256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11257pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11258impl<'db> StatementItemPtr<'db> {}
11259impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11260 type SyntaxNode = StatementItem<'db>;
11261 fn untyped(self) -> SyntaxStablePtrId<'db> {
11262 self.0
11263 }
11264 fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11265 StatementItem::from_syntax_node(db, self.0.lookup(db))
11266 }
11267}
11268impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11269 fn from(ptr: StatementItemPtr<'db>) -> Self {
11270 ptr.untyped()
11271 }
11272}
11273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11274pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11275impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11276 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11277 type StablePtr = StatementItemPtr<'db>;
11278 type Green = StatementItemGreen<'db>;
11279 fn missing(db: &'db dyn Database) -> Self::Green {
11280 StatementItemGreen(
11281 GreenNode {
11282 kind: SyntaxKind::StatementItem,
11283 details: GreenNodeDetails::Node {
11284 children: [ModuleItem::missing(db).0].into(),
11285 width: TextWidth::default(),
11286 },
11287 }
11288 .intern(db),
11289 )
11290 }
11291 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11292 let kind = node.kind(db);
11293 assert_eq!(
11294 kind,
11295 SyntaxKind::StatementItem,
11296 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11297 kind,
11298 SyntaxKind::StatementItem
11299 );
11300 Self { node }
11301 }
11302 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11303 let kind = node.kind(db);
11304 if kind == SyntaxKind::StatementItem {
11305 Some(Self::from_syntax_node(db, node))
11306 } else {
11307 None
11308 }
11309 }
11310 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11311 self.node
11312 }
11313 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11314 StatementItemPtr(self.node.stable_ptr(db))
11315 }
11316}
11317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11318pub struct Param<'db> {
11319 node: SyntaxNode<'db>,
11320}
11321impl<'db> Param<'db> {
11322 pub const INDEX_MODIFIERS: usize = 0;
11323 pub const INDEX_NAME: usize = 1;
11324 pub const INDEX_TYPE_CLAUSE: usize = 2;
11325 pub fn new_green(
11326 db: &'db dyn Database,
11327 modifiers: ModifierListGreen<'db>,
11328 name: TerminalIdentifierGreen<'db>,
11329 type_clause: OptionTypeClauseGreen<'db>,
11330 ) -> ParamGreen<'db> {
11331 let children = [modifiers.0, name.0, type_clause.0];
11332 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11333 ParamGreen(
11334 GreenNode {
11335 kind: SyntaxKind::Param,
11336 details: GreenNodeDetails::Node { children: children.into(), width },
11337 }
11338 .intern(db),
11339 )
11340 }
11341}
11342impl<'db> Param<'db> {
11343 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11344 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11345 }
11346 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11347 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11348 }
11349 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11350 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11351 }
11352}
11353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11354pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11355impl<'db> ParamPtr<'db> {
11356 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11357 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
11358 }
11359}
11360impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11361 type SyntaxNode = Param<'db>;
11362 fn untyped(self) -> SyntaxStablePtrId<'db> {
11363 self.0
11364 }
11365 fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11366 Param::from_syntax_node(db, self.0.lookup(db))
11367 }
11368}
11369impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11370 fn from(ptr: ParamPtr<'db>) -> Self {
11371 ptr.untyped()
11372 }
11373}
11374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11375pub struct ParamGreen<'db>(pub GreenId<'db>);
11376impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11377 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11378 type StablePtr = ParamPtr<'db>;
11379 type Green = ParamGreen<'db>;
11380 fn missing(db: &'db dyn Database) -> Self::Green {
11381 ParamGreen(
11382 GreenNode {
11383 kind: SyntaxKind::Param,
11384 details: GreenNodeDetails::Node {
11385 children: [
11386 ModifierList::missing(db).0,
11387 TerminalIdentifier::missing(db).0,
11388 OptionTypeClause::missing(db).0,
11389 ]
11390 .into(),
11391 width: TextWidth::default(),
11392 },
11393 }
11394 .intern(db),
11395 )
11396 }
11397 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11398 let kind = node.kind(db);
11399 assert_eq!(
11400 kind,
11401 SyntaxKind::Param,
11402 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11403 kind,
11404 SyntaxKind::Param
11405 );
11406 Self { node }
11407 }
11408 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11409 let kind = node.kind(db);
11410 if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11411 }
11412 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11413 self.node
11414 }
11415 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11416 ParamPtr(self.node.stable_ptr(db))
11417 }
11418}
11419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11420pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11421impl<'db> Deref for ModifierList<'db> {
11422 type Target = ElementList<'db, Modifier<'db>, 1>;
11423 fn deref(&self) -> &Self::Target {
11424 &self.0
11425 }
11426}
11427impl<'db> ModifierList<'db> {
11428 pub fn new_green(
11429 db: &'db dyn Database,
11430 children: &[ModifierGreen<'db>],
11431 ) -> ModifierListGreen<'db> {
11432 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11433 ModifierListGreen(
11434 GreenNode {
11435 kind: SyntaxKind::ModifierList,
11436 details: GreenNodeDetails::Node {
11437 children: children.iter().map(|x| x.0).collect(),
11438 width,
11439 },
11440 }
11441 .intern(db),
11442 )
11443 }
11444}
11445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11446pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11447impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11448 type SyntaxNode = ModifierList<'db>;
11449 fn untyped(self) -> SyntaxStablePtrId<'db> {
11450 self.0
11451 }
11452 fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11453 ModifierList::from_syntax_node(db, self.0.lookup(db))
11454 }
11455}
11456impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11457 fn from(ptr: ModifierListPtr<'db>) -> Self {
11458 ptr.untyped()
11459 }
11460}
11461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11462pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11463impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11464 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11465 type StablePtr = ModifierListPtr<'db>;
11466 type Green = ModifierListGreen<'db>;
11467 fn missing(db: &'db dyn Database) -> Self::Green {
11468 ModifierListGreen(
11469 GreenNode {
11470 kind: SyntaxKind::ModifierList,
11471 details: GreenNodeDetails::Node {
11472 children: [].into(),
11473 width: TextWidth::default(),
11474 },
11475 }
11476 .intern(db),
11477 )
11478 }
11479 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11480 Self(ElementList::new(node))
11481 }
11482 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11483 if node.kind(db) == SyntaxKind::ModifierList {
11484 Some(Self(ElementList::new(node)))
11485 } else {
11486 None
11487 }
11488 }
11489 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11490 self.node
11491 }
11492 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11493 ModifierListPtr(self.node.stable_ptr(db))
11494 }
11495}
11496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11497pub enum Modifier<'db> {
11498 Ref(TerminalRef<'db>),
11499 Mut(TerminalMut<'db>),
11500}
11501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11502pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11503impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11504 type SyntaxNode = Modifier<'db>;
11505 fn untyped(self) -> SyntaxStablePtrId<'db> {
11506 self.0
11507 }
11508 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11509 Modifier::from_syntax_node(db, self.0.lookup(db))
11510 }
11511}
11512impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11513 fn from(ptr: ModifierPtr<'db>) -> Self {
11514 ptr.untyped()
11515 }
11516}
11517impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11518 fn from(value: TerminalRefPtr<'db>) -> Self {
11519 Self(value.0)
11520 }
11521}
11522impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11523 fn from(value: TerminalMutPtr<'db>) -> Self {
11524 Self(value.0)
11525 }
11526}
11527impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11528 fn from(value: TerminalRefGreen<'db>) -> Self {
11529 Self(value.0)
11530 }
11531}
11532impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11533 fn from(value: TerminalMutGreen<'db>) -> Self {
11534 Self(value.0)
11535 }
11536}
11537#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11538pub struct ModifierGreen<'db>(pub GreenId<'db>);
11539impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11540 const OPTIONAL_KIND: Option<SyntaxKind> = None;
11541 type StablePtr = ModifierPtr<'db>;
11542 type Green = ModifierGreen<'db>;
11543 fn missing(db: &'db dyn Database) -> Self::Green {
11544 panic!("No missing variant.");
11545 }
11546 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11547 let kind = node.kind(db);
11548 match kind {
11549 SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11550 SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11551 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11552 }
11553 }
11554 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11555 let kind = node.kind(db);
11556 match kind {
11557 SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11558 SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11559 _ => None,
11560 }
11561 }
11562 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11563 match self {
11564 Modifier::Ref(x) => x.as_syntax_node(),
11565 Modifier::Mut(x) => x.as_syntax_node(),
11566 }
11567 }
11568 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11569 ModifierPtr(self.as_syntax_node().stable_ptr(db))
11570 }
11571}
11572impl<'db> Modifier<'db> {
11573 pub fn is_variant(kind: SyntaxKind) -> bool {
11575 matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11576 }
11577}
11578#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11579pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11580impl<'db> Deref for ParamList<'db> {
11581 type Target = ElementList<'db, Param<'db>, 2>;
11582 fn deref(&self) -> &Self::Target {
11583 &self.0
11584 }
11585}
11586impl<'db> ParamList<'db> {
11587 pub fn new_green(
11588 db: &'db dyn Database,
11589 children: &[ParamListElementOrSeparatorGreen<'db>],
11590 ) -> ParamListGreen<'db> {
11591 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11592 ParamListGreen(
11593 GreenNode {
11594 kind: SyntaxKind::ParamList,
11595 details: GreenNodeDetails::Node {
11596 children: children.iter().map(|x| x.id()).collect(),
11597 width,
11598 },
11599 }
11600 .intern(db),
11601 )
11602 }
11603}
11604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11605pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11606impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11607 type SyntaxNode = ParamList<'db>;
11608 fn untyped(self) -> SyntaxStablePtrId<'db> {
11609 self.0
11610 }
11611 fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11612 ParamList::from_syntax_node(db, self.0.lookup(db))
11613 }
11614}
11615impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11616 fn from(ptr: ParamListPtr<'db>) -> Self {
11617 ptr.untyped()
11618 }
11619}
11620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11621pub enum ParamListElementOrSeparatorGreen<'db> {
11622 Separator(TerminalCommaGreen<'db>),
11623 Element(ParamGreen<'db>),
11624}
11625impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11626 fn from(value: TerminalCommaGreen<'db>) -> Self {
11627 ParamListElementOrSeparatorGreen::Separator(value)
11628 }
11629}
11630impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11631 fn from(value: ParamGreen<'db>) -> Self {
11632 ParamListElementOrSeparatorGreen::Element(value)
11633 }
11634}
11635impl<'db> ParamListElementOrSeparatorGreen<'db> {
11636 fn id(&self) -> GreenId<'db> {
11637 match self {
11638 ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11639 ParamListElementOrSeparatorGreen::Element(green) => green.0,
11640 }
11641 }
11642}
11643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11644pub struct ParamListGreen<'db>(pub GreenId<'db>);
11645impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11646 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11647 type StablePtr = ParamListPtr<'db>;
11648 type Green = ParamListGreen<'db>;
11649 fn missing(db: &'db dyn Database) -> Self::Green {
11650 ParamListGreen(
11651 GreenNode {
11652 kind: SyntaxKind::ParamList,
11653 details: GreenNodeDetails::Node {
11654 children: [].into(),
11655 width: TextWidth::default(),
11656 },
11657 }
11658 .intern(db),
11659 )
11660 }
11661 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11662 Self(ElementList::new(node))
11663 }
11664 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11665 if node.kind(db) == SyntaxKind::ParamList {
11666 Some(Self(ElementList::new(node)))
11667 } else {
11668 None
11669 }
11670 }
11671 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11672 self.node
11673 }
11674 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11675 ParamListPtr(self.node.stable_ptr(db))
11676 }
11677}
11678#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11679pub struct ImplicitsClause<'db> {
11680 node: SyntaxNode<'db>,
11681}
11682impl<'db> ImplicitsClause<'db> {
11683 pub const INDEX_IMPLICITS_KW: usize = 0;
11684 pub const INDEX_LPAREN: usize = 1;
11685 pub const INDEX_IMPLICITS: usize = 2;
11686 pub const INDEX_RPAREN: usize = 3;
11687 pub fn new_green(
11688 db: &'db dyn Database,
11689 implicits_kw: TerminalImplicitsGreen<'db>,
11690 lparen: TerminalLParenGreen<'db>,
11691 implicits: ImplicitsListGreen<'db>,
11692 rparen: TerminalRParenGreen<'db>,
11693 ) -> ImplicitsClauseGreen<'db> {
11694 let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11695 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11696 ImplicitsClauseGreen(
11697 GreenNode {
11698 kind: SyntaxKind::ImplicitsClause,
11699 details: GreenNodeDetails::Node { children: children.into(), width },
11700 }
11701 .intern(db),
11702 )
11703 }
11704}
11705impl<'db> ImplicitsClause<'db> {
11706 pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11707 TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11708 }
11709 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11710 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11711 }
11712 pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11713 ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11714 }
11715 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11716 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11717 }
11718}
11719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11720pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11721impl<'db> ImplicitsClausePtr<'db> {}
11722impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11723 type SyntaxNode = ImplicitsClause<'db>;
11724 fn untyped(self) -> SyntaxStablePtrId<'db> {
11725 self.0
11726 }
11727 fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11728 ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11729 }
11730}
11731impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11732 fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11733 ptr.untyped()
11734 }
11735}
11736#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11737pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11738impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11739 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11740 type StablePtr = ImplicitsClausePtr<'db>;
11741 type Green = ImplicitsClauseGreen<'db>;
11742 fn missing(db: &'db dyn Database) -> Self::Green {
11743 ImplicitsClauseGreen(
11744 GreenNode {
11745 kind: SyntaxKind::ImplicitsClause,
11746 details: GreenNodeDetails::Node {
11747 children: [
11748 TerminalImplicits::missing(db).0,
11749 TerminalLParen::missing(db).0,
11750 ImplicitsList::missing(db).0,
11751 TerminalRParen::missing(db).0,
11752 ]
11753 .into(),
11754 width: TextWidth::default(),
11755 },
11756 }
11757 .intern(db),
11758 )
11759 }
11760 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11761 let kind = node.kind(db);
11762 assert_eq!(
11763 kind,
11764 SyntaxKind::ImplicitsClause,
11765 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11766 kind,
11767 SyntaxKind::ImplicitsClause
11768 );
11769 Self { node }
11770 }
11771 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11772 let kind = node.kind(db);
11773 if kind == SyntaxKind::ImplicitsClause {
11774 Some(Self::from_syntax_node(db, node))
11775 } else {
11776 None
11777 }
11778 }
11779 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11780 self.node
11781 }
11782 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11783 ImplicitsClausePtr(self.node.stable_ptr(db))
11784 }
11785}
11786#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11787pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11788impl<'db> Deref for ImplicitsList<'db> {
11789 type Target = ElementList<'db, ExprPath<'db>, 2>;
11790 fn deref(&self) -> &Self::Target {
11791 &self.0
11792 }
11793}
11794impl<'db> ImplicitsList<'db> {
11795 pub fn new_green(
11796 db: &'db dyn Database,
11797 children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11798 ) -> ImplicitsListGreen<'db> {
11799 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11800 ImplicitsListGreen(
11801 GreenNode {
11802 kind: SyntaxKind::ImplicitsList,
11803 details: GreenNodeDetails::Node {
11804 children: children.iter().map(|x| x.id()).collect(),
11805 width,
11806 },
11807 }
11808 .intern(db),
11809 )
11810 }
11811}
11812#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11813pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11814impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11815 type SyntaxNode = ImplicitsList<'db>;
11816 fn untyped(self) -> SyntaxStablePtrId<'db> {
11817 self.0
11818 }
11819 fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11820 ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11821 }
11822}
11823impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11824 fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11825 ptr.untyped()
11826 }
11827}
11828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11829pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11830 Separator(TerminalCommaGreen<'db>),
11831 Element(ExprPathGreen<'db>),
11832}
11833impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11834 fn from(value: TerminalCommaGreen<'db>) -> Self {
11835 ImplicitsListElementOrSeparatorGreen::Separator(value)
11836 }
11837}
11838impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11839 fn from(value: ExprPathGreen<'db>) -> Self {
11840 ImplicitsListElementOrSeparatorGreen::Element(value)
11841 }
11842}
11843impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11844 fn id(&self) -> GreenId<'db> {
11845 match self {
11846 ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11847 ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11848 }
11849 }
11850}
11851#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11852pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11853impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11854 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11855 type StablePtr = ImplicitsListPtr<'db>;
11856 type Green = ImplicitsListGreen<'db>;
11857 fn missing(db: &'db dyn Database) -> Self::Green {
11858 ImplicitsListGreen(
11859 GreenNode {
11860 kind: SyntaxKind::ImplicitsList,
11861 details: GreenNodeDetails::Node {
11862 children: [].into(),
11863 width: TextWidth::default(),
11864 },
11865 }
11866 .intern(db),
11867 )
11868 }
11869 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11870 Self(ElementList::new(node))
11871 }
11872 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11873 if node.kind(db) == SyntaxKind::ImplicitsList {
11874 Some(Self(ElementList::new(node)))
11875 } else {
11876 None
11877 }
11878 }
11879 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11880 self.node
11881 }
11882 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11883 ImplicitsListPtr(self.node.stable_ptr(db))
11884 }
11885}
11886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11887pub enum OptionImplicitsClause<'db> {
11888 Empty(OptionImplicitsClauseEmpty<'db>),
11889 ImplicitsClause(ImplicitsClause<'db>),
11890}
11891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11892pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11893impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11894 type SyntaxNode = OptionImplicitsClause<'db>;
11895 fn untyped(self) -> SyntaxStablePtrId<'db> {
11896 self.0
11897 }
11898 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11899 OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11900 }
11901}
11902impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11903 fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11904 ptr.untyped()
11905 }
11906}
11907impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11908 fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11909 Self(value.0)
11910 }
11911}
11912impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11913 fn from(value: ImplicitsClausePtr<'db>) -> Self {
11914 Self(value.0)
11915 }
11916}
11917impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11918 fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
11919 Self(value.0)
11920 }
11921}
11922impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11923 fn from(value: ImplicitsClauseGreen<'db>) -> Self {
11924 Self(value.0)
11925 }
11926}
11927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11928pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
11929impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
11930 const OPTIONAL_KIND: Option<SyntaxKind> = None;
11931 type StablePtr = OptionImplicitsClausePtr<'db>;
11932 type Green = OptionImplicitsClauseGreen<'db>;
11933 fn missing(db: &'db dyn Database) -> Self::Green {
11934 panic!("No missing variant.");
11935 }
11936 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11937 let kind = node.kind(db);
11938 match kind {
11939 SyntaxKind::OptionImplicitsClauseEmpty => {
11940 OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
11941 }
11942 SyntaxKind::ImplicitsClause => {
11943 OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
11944 }
11945 _ => panic!(
11946 "Unexpected syntax kind {:?} when constructing {}.",
11947 kind, "OptionImplicitsClause"
11948 ),
11949 }
11950 }
11951 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11952 let kind = node.kind(db);
11953 match kind {
11954 SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
11955 OptionImplicitsClauseEmpty::from_syntax_node(db, node),
11956 )),
11957 SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
11958 ImplicitsClause::from_syntax_node(db, node),
11959 )),
11960 _ => None,
11961 }
11962 }
11963 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11964 match self {
11965 OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
11966 OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
11967 }
11968 }
11969 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11970 OptionImplicitsClausePtr(self.as_syntax_node().stable_ptr(db))
11971 }
11972}
11973impl<'db> OptionImplicitsClause<'db> {
11974 pub fn is_variant(kind: SyntaxKind) -> bool {
11976 matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
11977 }
11978}
11979#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11980pub struct OptionImplicitsClauseEmpty<'db> {
11981 node: SyntaxNode<'db>,
11982}
11983impl<'db> OptionImplicitsClauseEmpty<'db> {
11984 pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
11985 let children = [];
11986 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11987 OptionImplicitsClauseEmptyGreen(
11988 GreenNode {
11989 kind: SyntaxKind::OptionImplicitsClauseEmpty,
11990 details: GreenNodeDetails::Node { children: children.into(), width },
11991 }
11992 .intern(db),
11993 )
11994 }
11995}
11996impl<'db> OptionImplicitsClauseEmpty<'db> {}
11997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11998pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11999impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12000impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12001 type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12002 fn untyped(self) -> SyntaxStablePtrId<'db> {
12003 self.0
12004 }
12005 fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12006 OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12007 }
12008}
12009impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12010 fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12011 ptr.untyped()
12012 }
12013}
12014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12015pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12016impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12017 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12018 type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12019 type Green = OptionImplicitsClauseEmptyGreen<'db>;
12020 fn missing(db: &'db dyn Database) -> Self::Green {
12021 OptionImplicitsClauseEmptyGreen(
12022 GreenNode {
12023 kind: SyntaxKind::OptionImplicitsClauseEmpty,
12024 details: GreenNodeDetails::Node {
12025 children: [].into(),
12026 width: TextWidth::default(),
12027 },
12028 }
12029 .intern(db),
12030 )
12031 }
12032 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12033 let kind = node.kind(db);
12034 assert_eq!(
12035 kind,
12036 SyntaxKind::OptionImplicitsClauseEmpty,
12037 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12038 kind,
12039 SyntaxKind::OptionImplicitsClauseEmpty
12040 );
12041 Self { node }
12042 }
12043 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12044 let kind = node.kind(db);
12045 if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12046 Some(Self::from_syntax_node(db, node))
12047 } else {
12048 None
12049 }
12050 }
12051 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12052 self.node
12053 }
12054 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12055 OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12056 }
12057}
12058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12059pub enum OptionTerminalNoPanic<'db> {
12060 Empty(OptionTerminalNoPanicEmpty<'db>),
12061 TerminalNoPanic(TerminalNoPanic<'db>),
12062}
12063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12064pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12065impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12066 type SyntaxNode = OptionTerminalNoPanic<'db>;
12067 fn untyped(self) -> SyntaxStablePtrId<'db> {
12068 self.0
12069 }
12070 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12071 OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12072 }
12073}
12074impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12075 fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12076 ptr.untyped()
12077 }
12078}
12079impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12080 fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12081 Self(value.0)
12082 }
12083}
12084impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12085 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12086 Self(value.0)
12087 }
12088}
12089impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12090 fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12091 Self(value.0)
12092 }
12093}
12094impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12095 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12096 Self(value.0)
12097 }
12098}
12099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12100pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12101impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12102 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12103 type StablePtr = OptionTerminalNoPanicPtr<'db>;
12104 type Green = OptionTerminalNoPanicGreen<'db>;
12105 fn missing(db: &'db dyn Database) -> Self::Green {
12106 panic!("No missing variant.");
12107 }
12108 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12109 let kind = node.kind(db);
12110 match kind {
12111 SyntaxKind::OptionTerminalNoPanicEmpty => {
12112 OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12113 }
12114 SyntaxKind::TerminalNoPanic => {
12115 OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12116 }
12117 _ => panic!(
12118 "Unexpected syntax kind {:?} when constructing {}.",
12119 kind, "OptionTerminalNoPanic"
12120 ),
12121 }
12122 }
12123 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12124 let kind = node.kind(db);
12125 match kind {
12126 SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12127 OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12128 )),
12129 SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12130 TerminalNoPanic::from_syntax_node(db, node),
12131 )),
12132 _ => None,
12133 }
12134 }
12135 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12136 match self {
12137 OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12138 OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12139 }
12140 }
12141 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12142 OptionTerminalNoPanicPtr(self.as_syntax_node().stable_ptr(db))
12143 }
12144}
12145impl<'db> OptionTerminalNoPanic<'db> {
12146 pub fn is_variant(kind: SyntaxKind) -> bool {
12148 matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12149 }
12150}
12151#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12152pub struct OptionTerminalNoPanicEmpty<'db> {
12153 node: SyntaxNode<'db>,
12154}
12155impl<'db> OptionTerminalNoPanicEmpty<'db> {
12156 pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12157 let children = [];
12158 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12159 OptionTerminalNoPanicEmptyGreen(
12160 GreenNode {
12161 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12162 details: GreenNodeDetails::Node { children: children.into(), width },
12163 }
12164 .intern(db),
12165 )
12166 }
12167}
12168impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12170pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12171impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12172impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12173 type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12174 fn untyped(self) -> SyntaxStablePtrId<'db> {
12175 self.0
12176 }
12177 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12178 OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12179 }
12180}
12181impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12182 fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12183 ptr.untyped()
12184 }
12185}
12186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12187pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12188impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12189 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12190 type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12191 type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12192 fn missing(db: &'db dyn Database) -> Self::Green {
12193 OptionTerminalNoPanicEmptyGreen(
12194 GreenNode {
12195 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12196 details: GreenNodeDetails::Node {
12197 children: [].into(),
12198 width: TextWidth::default(),
12199 },
12200 }
12201 .intern(db),
12202 )
12203 }
12204 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12205 let kind = node.kind(db);
12206 assert_eq!(
12207 kind,
12208 SyntaxKind::OptionTerminalNoPanicEmpty,
12209 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12210 kind,
12211 SyntaxKind::OptionTerminalNoPanicEmpty
12212 );
12213 Self { node }
12214 }
12215 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12216 let kind = node.kind(db);
12217 if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12218 Some(Self::from_syntax_node(db, node))
12219 } else {
12220 None
12221 }
12222 }
12223 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12224 self.node
12225 }
12226 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12227 OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12228 }
12229}
12230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12231pub enum OptionTerminalConst<'db> {
12232 Empty(OptionTerminalConstEmpty<'db>),
12233 TerminalConst(TerminalConst<'db>),
12234}
12235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12236pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12237impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12238 type SyntaxNode = OptionTerminalConst<'db>;
12239 fn untyped(self) -> SyntaxStablePtrId<'db> {
12240 self.0
12241 }
12242 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12243 OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12244 }
12245}
12246impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12247 fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12248 ptr.untyped()
12249 }
12250}
12251impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12252 fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12253 Self(value.0)
12254 }
12255}
12256impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12257 fn from(value: TerminalConstPtr<'db>) -> Self {
12258 Self(value.0)
12259 }
12260}
12261impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12262 fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12263 Self(value.0)
12264 }
12265}
12266impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12267 fn from(value: TerminalConstGreen<'db>) -> Self {
12268 Self(value.0)
12269 }
12270}
12271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12272pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12273impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12274 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12275 type StablePtr = OptionTerminalConstPtr<'db>;
12276 type Green = OptionTerminalConstGreen<'db>;
12277 fn missing(db: &'db dyn Database) -> Self::Green {
12278 panic!("No missing variant.");
12279 }
12280 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12281 let kind = node.kind(db);
12282 match kind {
12283 SyntaxKind::OptionTerminalConstEmpty => {
12284 OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12285 }
12286 SyntaxKind::TerminalConst => {
12287 OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12288 }
12289 _ => panic!(
12290 "Unexpected syntax kind {:?} when constructing {}.",
12291 kind, "OptionTerminalConst"
12292 ),
12293 }
12294 }
12295 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12296 let kind = node.kind(db);
12297 match kind {
12298 SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12299 OptionTerminalConstEmpty::from_syntax_node(db, node),
12300 )),
12301 SyntaxKind::TerminalConst => {
12302 Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12303 }
12304 _ => None,
12305 }
12306 }
12307 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12308 match self {
12309 OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12310 OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12311 }
12312 }
12313 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12314 OptionTerminalConstPtr(self.as_syntax_node().stable_ptr(db))
12315 }
12316}
12317impl<'db> OptionTerminalConst<'db> {
12318 pub fn is_variant(kind: SyntaxKind) -> bool {
12320 matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12321 }
12322}
12323#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12324pub struct OptionTerminalConstEmpty<'db> {
12325 node: SyntaxNode<'db>,
12326}
12327impl<'db> OptionTerminalConstEmpty<'db> {
12328 pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12329 let children = [];
12330 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12331 OptionTerminalConstEmptyGreen(
12332 GreenNode {
12333 kind: SyntaxKind::OptionTerminalConstEmpty,
12334 details: GreenNodeDetails::Node { children: children.into(), width },
12335 }
12336 .intern(db),
12337 )
12338 }
12339}
12340impl<'db> OptionTerminalConstEmpty<'db> {}
12341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12342pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12343impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12344impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12345 type SyntaxNode = OptionTerminalConstEmpty<'db>;
12346 fn untyped(self) -> SyntaxStablePtrId<'db> {
12347 self.0
12348 }
12349 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12350 OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12351 }
12352}
12353impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12354 fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12355 ptr.untyped()
12356 }
12357}
12358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12359pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12360impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12361 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12362 type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12363 type Green = OptionTerminalConstEmptyGreen<'db>;
12364 fn missing(db: &'db dyn Database) -> Self::Green {
12365 OptionTerminalConstEmptyGreen(
12366 GreenNode {
12367 kind: SyntaxKind::OptionTerminalConstEmpty,
12368 details: GreenNodeDetails::Node {
12369 children: [].into(),
12370 width: TextWidth::default(),
12371 },
12372 }
12373 .intern(db),
12374 )
12375 }
12376 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12377 let kind = node.kind(db);
12378 assert_eq!(
12379 kind,
12380 SyntaxKind::OptionTerminalConstEmpty,
12381 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12382 kind,
12383 SyntaxKind::OptionTerminalConstEmpty
12384 );
12385 Self { node }
12386 }
12387 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12388 let kind = node.kind(db);
12389 if kind == SyntaxKind::OptionTerminalConstEmpty {
12390 Some(Self::from_syntax_node(db, node))
12391 } else {
12392 None
12393 }
12394 }
12395 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12396 self.node
12397 }
12398 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12399 OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12400 }
12401}
12402#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12403pub struct FunctionSignature<'db> {
12404 node: SyntaxNode<'db>,
12405}
12406impl<'db> FunctionSignature<'db> {
12407 pub const INDEX_LPAREN: usize = 0;
12408 pub const INDEX_PARAMETERS: usize = 1;
12409 pub const INDEX_RPAREN: usize = 2;
12410 pub const INDEX_RET_TY: usize = 3;
12411 pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12412 pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12413 pub fn new_green(
12414 db: &'db dyn Database,
12415 lparen: TerminalLParenGreen<'db>,
12416 parameters: ParamListGreen<'db>,
12417 rparen: TerminalRParenGreen<'db>,
12418 ret_ty: OptionReturnTypeClauseGreen<'db>,
12419 implicits_clause: OptionImplicitsClauseGreen<'db>,
12420 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12421 ) -> FunctionSignatureGreen<'db> {
12422 let children =
12423 [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12424 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12425 FunctionSignatureGreen(
12426 GreenNode {
12427 kind: SyntaxKind::FunctionSignature,
12428 details: GreenNodeDetails::Node { children: children.into(), width },
12429 }
12430 .intern(db),
12431 )
12432 }
12433}
12434impl<'db> FunctionSignature<'db> {
12435 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12436 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12437 }
12438 pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12439 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12440 }
12441 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12442 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12443 }
12444 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12445 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12446 }
12447 pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12448 OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12449 }
12450 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12451 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12452 }
12453}
12454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12455pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12456impl<'db> FunctionSignaturePtr<'db> {}
12457impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12458 type SyntaxNode = FunctionSignature<'db>;
12459 fn untyped(self) -> SyntaxStablePtrId<'db> {
12460 self.0
12461 }
12462 fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12463 FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12464 }
12465}
12466impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12467 fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12468 ptr.untyped()
12469 }
12470}
12471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12472pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12473impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12474 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12475 type StablePtr = FunctionSignaturePtr<'db>;
12476 type Green = FunctionSignatureGreen<'db>;
12477 fn missing(db: &'db dyn Database) -> Self::Green {
12478 FunctionSignatureGreen(
12479 GreenNode {
12480 kind: SyntaxKind::FunctionSignature,
12481 details: GreenNodeDetails::Node {
12482 children: [
12483 TerminalLParen::missing(db).0,
12484 ParamList::missing(db).0,
12485 TerminalRParen::missing(db).0,
12486 OptionReturnTypeClause::missing(db).0,
12487 OptionImplicitsClause::missing(db).0,
12488 OptionTerminalNoPanic::missing(db).0,
12489 ]
12490 .into(),
12491 width: TextWidth::default(),
12492 },
12493 }
12494 .intern(db),
12495 )
12496 }
12497 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12498 let kind = node.kind(db);
12499 assert_eq!(
12500 kind,
12501 SyntaxKind::FunctionSignature,
12502 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12503 kind,
12504 SyntaxKind::FunctionSignature
12505 );
12506 Self { node }
12507 }
12508 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12509 let kind = node.kind(db);
12510 if kind == SyntaxKind::FunctionSignature {
12511 Some(Self::from_syntax_node(db, node))
12512 } else {
12513 None
12514 }
12515 }
12516 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12517 self.node
12518 }
12519 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12520 FunctionSignaturePtr(self.node.stable_ptr(db))
12521 }
12522}
12523#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12524pub struct Member<'db> {
12525 node: SyntaxNode<'db>,
12526}
12527impl<'db> Member<'db> {
12528 pub const INDEX_ATTRIBUTES: usize = 0;
12529 pub const INDEX_VISIBILITY: usize = 1;
12530 pub const INDEX_NAME: usize = 2;
12531 pub const INDEX_TYPE_CLAUSE: usize = 3;
12532 pub fn new_green(
12533 db: &'db dyn Database,
12534 attributes: AttributeListGreen<'db>,
12535 visibility: VisibilityGreen<'db>,
12536 name: TerminalIdentifierGreen<'db>,
12537 type_clause: TypeClauseGreen<'db>,
12538 ) -> MemberGreen<'db> {
12539 let children = [attributes.0, visibility.0, name.0, type_clause.0];
12540 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12541 MemberGreen(
12542 GreenNode {
12543 kind: SyntaxKind::Member,
12544 details: GreenNodeDetails::Node { children: children.into(), width },
12545 }
12546 .intern(db),
12547 )
12548 }
12549}
12550impl<'db> Member<'db> {
12551 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12552 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12553 }
12554 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12555 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12556 }
12557 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12558 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12559 }
12560 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12561 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12562 }
12563}
12564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12565pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12566impl<'db> MemberPtr<'db> {
12567 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12568 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12569 }
12570}
12571impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12572 type SyntaxNode = Member<'db>;
12573 fn untyped(self) -> SyntaxStablePtrId<'db> {
12574 self.0
12575 }
12576 fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12577 Member::from_syntax_node(db, self.0.lookup(db))
12578 }
12579}
12580impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12581 fn from(ptr: MemberPtr<'db>) -> Self {
12582 ptr.untyped()
12583 }
12584}
12585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12586pub struct MemberGreen<'db>(pub GreenId<'db>);
12587impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12588 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12589 type StablePtr = MemberPtr<'db>;
12590 type Green = MemberGreen<'db>;
12591 fn missing(db: &'db dyn Database) -> Self::Green {
12592 MemberGreen(
12593 GreenNode {
12594 kind: SyntaxKind::Member,
12595 details: GreenNodeDetails::Node {
12596 children: [
12597 AttributeList::missing(db).0,
12598 Visibility::missing(db).0,
12599 TerminalIdentifier::missing(db).0,
12600 TypeClause::missing(db).0,
12601 ]
12602 .into(),
12603 width: TextWidth::default(),
12604 },
12605 }
12606 .intern(db),
12607 )
12608 }
12609 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12610 let kind = node.kind(db);
12611 assert_eq!(
12612 kind,
12613 SyntaxKind::Member,
12614 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12615 kind,
12616 SyntaxKind::Member
12617 );
12618 Self { node }
12619 }
12620 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12621 let kind = node.kind(db);
12622 if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12623 }
12624 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12625 self.node
12626 }
12627 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12628 MemberPtr(self.node.stable_ptr(db))
12629 }
12630}
12631#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12632pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12633impl<'db> Deref for MemberList<'db> {
12634 type Target = ElementList<'db, Member<'db>, 2>;
12635 fn deref(&self) -> &Self::Target {
12636 &self.0
12637 }
12638}
12639impl<'db> MemberList<'db> {
12640 pub fn new_green(
12641 db: &'db dyn Database,
12642 children: &[MemberListElementOrSeparatorGreen<'db>],
12643 ) -> MemberListGreen<'db> {
12644 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12645 MemberListGreen(
12646 GreenNode {
12647 kind: SyntaxKind::MemberList,
12648 details: GreenNodeDetails::Node {
12649 children: children.iter().map(|x| x.id()).collect(),
12650 width,
12651 },
12652 }
12653 .intern(db),
12654 )
12655 }
12656}
12657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12658pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12659impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12660 type SyntaxNode = MemberList<'db>;
12661 fn untyped(self) -> SyntaxStablePtrId<'db> {
12662 self.0
12663 }
12664 fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12665 MemberList::from_syntax_node(db, self.0.lookup(db))
12666 }
12667}
12668impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12669 fn from(ptr: MemberListPtr<'db>) -> Self {
12670 ptr.untyped()
12671 }
12672}
12673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12674pub enum MemberListElementOrSeparatorGreen<'db> {
12675 Separator(TerminalCommaGreen<'db>),
12676 Element(MemberGreen<'db>),
12677}
12678impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12679 fn from(value: TerminalCommaGreen<'db>) -> Self {
12680 MemberListElementOrSeparatorGreen::Separator(value)
12681 }
12682}
12683impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12684 fn from(value: MemberGreen<'db>) -> Self {
12685 MemberListElementOrSeparatorGreen::Element(value)
12686 }
12687}
12688impl<'db> MemberListElementOrSeparatorGreen<'db> {
12689 fn id(&self) -> GreenId<'db> {
12690 match self {
12691 MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12692 MemberListElementOrSeparatorGreen::Element(green) => green.0,
12693 }
12694 }
12695}
12696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12697pub struct MemberListGreen<'db>(pub GreenId<'db>);
12698impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12699 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12700 type StablePtr = MemberListPtr<'db>;
12701 type Green = MemberListGreen<'db>;
12702 fn missing(db: &'db dyn Database) -> Self::Green {
12703 MemberListGreen(
12704 GreenNode {
12705 kind: SyntaxKind::MemberList,
12706 details: GreenNodeDetails::Node {
12707 children: [].into(),
12708 width: TextWidth::default(),
12709 },
12710 }
12711 .intern(db),
12712 )
12713 }
12714 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12715 Self(ElementList::new(node))
12716 }
12717 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12718 if node.kind(db) == SyntaxKind::MemberList {
12719 Some(Self(ElementList::new(node)))
12720 } else {
12721 None
12722 }
12723 }
12724 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12725 self.node
12726 }
12727 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12728 MemberListPtr(self.node.stable_ptr(db))
12729 }
12730}
12731#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12732pub struct Variant<'db> {
12733 node: SyntaxNode<'db>,
12734}
12735impl<'db> Variant<'db> {
12736 pub const INDEX_ATTRIBUTES: usize = 0;
12737 pub const INDEX_NAME: usize = 1;
12738 pub const INDEX_TYPE_CLAUSE: usize = 2;
12739 pub fn new_green(
12740 db: &'db dyn Database,
12741 attributes: AttributeListGreen<'db>,
12742 name: TerminalIdentifierGreen<'db>,
12743 type_clause: OptionTypeClauseGreen<'db>,
12744 ) -> VariantGreen<'db> {
12745 let children = [attributes.0, name.0, type_clause.0];
12746 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12747 VariantGreen(
12748 GreenNode {
12749 kind: SyntaxKind::Variant,
12750 details: GreenNodeDetails::Node { children: children.into(), width },
12751 }
12752 .intern(db),
12753 )
12754 }
12755}
12756impl<'db> Variant<'db> {
12757 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12758 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12759 }
12760 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12761 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12762 }
12763 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12764 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12765 }
12766}
12767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12768pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12769impl<'db> VariantPtr<'db> {
12770 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12771 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12772 }
12773}
12774impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12775 type SyntaxNode = Variant<'db>;
12776 fn untyped(self) -> SyntaxStablePtrId<'db> {
12777 self.0
12778 }
12779 fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12780 Variant::from_syntax_node(db, self.0.lookup(db))
12781 }
12782}
12783impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12784 fn from(ptr: VariantPtr<'db>) -> Self {
12785 ptr.untyped()
12786 }
12787}
12788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12789pub struct VariantGreen<'db>(pub GreenId<'db>);
12790impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12791 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12792 type StablePtr = VariantPtr<'db>;
12793 type Green = VariantGreen<'db>;
12794 fn missing(db: &'db dyn Database) -> Self::Green {
12795 VariantGreen(
12796 GreenNode {
12797 kind: SyntaxKind::Variant,
12798 details: GreenNodeDetails::Node {
12799 children: [
12800 AttributeList::missing(db).0,
12801 TerminalIdentifier::missing(db).0,
12802 OptionTypeClause::missing(db).0,
12803 ]
12804 .into(),
12805 width: TextWidth::default(),
12806 },
12807 }
12808 .intern(db),
12809 )
12810 }
12811 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12812 let kind = node.kind(db);
12813 assert_eq!(
12814 kind,
12815 SyntaxKind::Variant,
12816 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12817 kind,
12818 SyntaxKind::Variant
12819 );
12820 Self { node }
12821 }
12822 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12823 let kind = node.kind(db);
12824 if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12825 }
12826 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12827 self.node
12828 }
12829 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12830 VariantPtr(self.node.stable_ptr(db))
12831 }
12832}
12833#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12834pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12835impl<'db> Deref for VariantList<'db> {
12836 type Target = ElementList<'db, Variant<'db>, 2>;
12837 fn deref(&self) -> &Self::Target {
12838 &self.0
12839 }
12840}
12841impl<'db> VariantList<'db> {
12842 pub fn new_green(
12843 db: &'db dyn Database,
12844 children: &[VariantListElementOrSeparatorGreen<'db>],
12845 ) -> VariantListGreen<'db> {
12846 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12847 VariantListGreen(
12848 GreenNode {
12849 kind: SyntaxKind::VariantList,
12850 details: GreenNodeDetails::Node {
12851 children: children.iter().map(|x| x.id()).collect(),
12852 width,
12853 },
12854 }
12855 .intern(db),
12856 )
12857 }
12858}
12859#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12860pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12861impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12862 type SyntaxNode = VariantList<'db>;
12863 fn untyped(self) -> SyntaxStablePtrId<'db> {
12864 self.0
12865 }
12866 fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12867 VariantList::from_syntax_node(db, self.0.lookup(db))
12868 }
12869}
12870impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12871 fn from(ptr: VariantListPtr<'db>) -> Self {
12872 ptr.untyped()
12873 }
12874}
12875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12876pub enum VariantListElementOrSeparatorGreen<'db> {
12877 Separator(TerminalCommaGreen<'db>),
12878 Element(VariantGreen<'db>),
12879}
12880impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12881 fn from(value: TerminalCommaGreen<'db>) -> Self {
12882 VariantListElementOrSeparatorGreen::Separator(value)
12883 }
12884}
12885impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12886 fn from(value: VariantGreen<'db>) -> Self {
12887 VariantListElementOrSeparatorGreen::Element(value)
12888 }
12889}
12890impl<'db> VariantListElementOrSeparatorGreen<'db> {
12891 fn id(&self) -> GreenId<'db> {
12892 match self {
12893 VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12894 VariantListElementOrSeparatorGreen::Element(green) => green.0,
12895 }
12896 }
12897}
12898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12899pub struct VariantListGreen<'db>(pub GreenId<'db>);
12900impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12901 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12902 type StablePtr = VariantListPtr<'db>;
12903 type Green = VariantListGreen<'db>;
12904 fn missing(db: &'db dyn Database) -> Self::Green {
12905 VariantListGreen(
12906 GreenNode {
12907 kind: SyntaxKind::VariantList,
12908 details: GreenNodeDetails::Node {
12909 children: [].into(),
12910 width: TextWidth::default(),
12911 },
12912 }
12913 .intern(db),
12914 )
12915 }
12916 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12917 Self(ElementList::new(node))
12918 }
12919 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12920 if node.kind(db) == SyntaxKind::VariantList {
12921 Some(Self(ElementList::new(node)))
12922 } else {
12923 None
12924 }
12925 }
12926 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12927 self.node
12928 }
12929 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12930 VariantListPtr(self.node.stable_ptr(db))
12931 }
12932}
12933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12934pub enum ModuleItem<'db> {
12935 Constant(ItemConstant<'db>),
12936 Module(ItemModule<'db>),
12937 Use(ItemUse<'db>),
12938 FreeFunction(FunctionWithBody<'db>),
12939 ExternFunction(ItemExternFunction<'db>),
12940 ExternType(ItemExternType<'db>),
12941 Trait(ItemTrait<'db>),
12942 Impl(ItemImpl<'db>),
12943 ImplAlias(ItemImplAlias<'db>),
12944 Struct(ItemStruct<'db>),
12945 Enum(ItemEnum<'db>),
12946 TypeAlias(ItemTypeAlias<'db>),
12947 InlineMacro(ItemInlineMacro<'db>),
12948 MacroDeclaration(ItemMacroDeclaration<'db>),
12949 HeaderDoc(ItemHeaderDoc<'db>),
12950 Missing(ModuleItemMissing<'db>),
12951}
12952#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12953pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
12954impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
12955 type SyntaxNode = ModuleItem<'db>;
12956 fn untyped(self) -> SyntaxStablePtrId<'db> {
12957 self.0
12958 }
12959 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12960 ModuleItem::from_syntax_node(db, self.0.lookup(db))
12961 }
12962}
12963impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
12964 fn from(ptr: ModuleItemPtr<'db>) -> Self {
12965 ptr.untyped()
12966 }
12967}
12968impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
12969 fn from(value: ItemConstantPtr<'db>) -> Self {
12970 Self(value.0)
12971 }
12972}
12973impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
12974 fn from(value: ItemModulePtr<'db>) -> Self {
12975 Self(value.0)
12976 }
12977}
12978impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
12979 fn from(value: ItemUsePtr<'db>) -> Self {
12980 Self(value.0)
12981 }
12982}
12983impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
12984 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
12985 Self(value.0)
12986 }
12987}
12988impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
12989 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
12990 Self(value.0)
12991 }
12992}
12993impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
12994 fn from(value: ItemExternTypePtr<'db>) -> Self {
12995 Self(value.0)
12996 }
12997}
12998impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
12999 fn from(value: ItemTraitPtr<'db>) -> Self {
13000 Self(value.0)
13001 }
13002}
13003impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13004 fn from(value: ItemImplPtr<'db>) -> Self {
13005 Self(value.0)
13006 }
13007}
13008impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13009 fn from(value: ItemImplAliasPtr<'db>) -> Self {
13010 Self(value.0)
13011 }
13012}
13013impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13014 fn from(value: ItemStructPtr<'db>) -> Self {
13015 Self(value.0)
13016 }
13017}
13018impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13019 fn from(value: ItemEnumPtr<'db>) -> Self {
13020 Self(value.0)
13021 }
13022}
13023impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13024 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13025 Self(value.0)
13026 }
13027}
13028impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13029 fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13030 Self(value.0)
13031 }
13032}
13033impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13034 fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13035 Self(value.0)
13036 }
13037}
13038impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13039 fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13040 Self(value.0)
13041 }
13042}
13043impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13044 fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13045 Self(value.0)
13046 }
13047}
13048impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13049 fn from(value: ItemConstantGreen<'db>) -> Self {
13050 Self(value.0)
13051 }
13052}
13053impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13054 fn from(value: ItemModuleGreen<'db>) -> Self {
13055 Self(value.0)
13056 }
13057}
13058impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13059 fn from(value: ItemUseGreen<'db>) -> Self {
13060 Self(value.0)
13061 }
13062}
13063impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13064 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13065 Self(value.0)
13066 }
13067}
13068impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13069 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13070 Self(value.0)
13071 }
13072}
13073impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13074 fn from(value: ItemExternTypeGreen<'db>) -> Self {
13075 Self(value.0)
13076 }
13077}
13078impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13079 fn from(value: ItemTraitGreen<'db>) -> Self {
13080 Self(value.0)
13081 }
13082}
13083impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13084 fn from(value: ItemImplGreen<'db>) -> Self {
13085 Self(value.0)
13086 }
13087}
13088impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13089 fn from(value: ItemImplAliasGreen<'db>) -> Self {
13090 Self(value.0)
13091 }
13092}
13093impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13094 fn from(value: ItemStructGreen<'db>) -> Self {
13095 Self(value.0)
13096 }
13097}
13098impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13099 fn from(value: ItemEnumGreen<'db>) -> Self {
13100 Self(value.0)
13101 }
13102}
13103impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13104 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13105 Self(value.0)
13106 }
13107}
13108impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13109 fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13110 Self(value.0)
13111 }
13112}
13113impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13114 fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13115 Self(value.0)
13116 }
13117}
13118impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13119 fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13120 Self(value.0)
13121 }
13122}
13123impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13124 fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13125 Self(value.0)
13126 }
13127}
13128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13129pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13130impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13131 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13132 type StablePtr = ModuleItemPtr<'db>;
13133 type Green = ModuleItemGreen<'db>;
13134 fn missing(db: &'db dyn Database) -> Self::Green {
13135 ModuleItemGreen(ModuleItemMissing::missing(db).0)
13136 }
13137 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13138 let kind = node.kind(db);
13139 match kind {
13140 SyntaxKind::ItemConstant => {
13141 ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13142 }
13143 SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13144 SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13145 SyntaxKind::FunctionWithBody => {
13146 ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13147 }
13148 SyntaxKind::ItemExternFunction => {
13149 ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13150 }
13151 SyntaxKind::ItemExternType => {
13152 ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13153 }
13154 SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13155 SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13156 SyntaxKind::ItemImplAlias => {
13157 ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13158 }
13159 SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13160 SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13161 SyntaxKind::ItemTypeAlias => {
13162 ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13163 }
13164 SyntaxKind::ItemInlineMacro => {
13165 ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13166 }
13167 SyntaxKind::ItemMacroDeclaration => {
13168 ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13169 }
13170 SyntaxKind::ItemHeaderDoc => {
13171 ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13172 }
13173 SyntaxKind::ModuleItemMissing => {
13174 ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13175 }
13176 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13177 }
13178 }
13179 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13180 let kind = node.kind(db);
13181 match kind {
13182 SyntaxKind::ItemConstant => {
13183 Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13184 }
13185 SyntaxKind::ItemModule => {
13186 Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13187 }
13188 SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13189 SyntaxKind::FunctionWithBody => {
13190 Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13191 }
13192 SyntaxKind::ItemExternFunction => {
13193 Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13194 }
13195 SyntaxKind::ItemExternType => {
13196 Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13197 }
13198 SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13199 SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13200 SyntaxKind::ItemImplAlias => {
13201 Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13202 }
13203 SyntaxKind::ItemStruct => {
13204 Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13205 }
13206 SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13207 SyntaxKind::ItemTypeAlias => {
13208 Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13209 }
13210 SyntaxKind::ItemInlineMacro => {
13211 Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13212 }
13213 SyntaxKind::ItemMacroDeclaration => {
13214 Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13215 }
13216 SyntaxKind::ItemHeaderDoc => {
13217 Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13218 }
13219 SyntaxKind::ModuleItemMissing => {
13220 Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13221 }
13222 _ => None,
13223 }
13224 }
13225 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13226 match self {
13227 ModuleItem::Constant(x) => x.as_syntax_node(),
13228 ModuleItem::Module(x) => x.as_syntax_node(),
13229 ModuleItem::Use(x) => x.as_syntax_node(),
13230 ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13231 ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13232 ModuleItem::ExternType(x) => x.as_syntax_node(),
13233 ModuleItem::Trait(x) => x.as_syntax_node(),
13234 ModuleItem::Impl(x) => x.as_syntax_node(),
13235 ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13236 ModuleItem::Struct(x) => x.as_syntax_node(),
13237 ModuleItem::Enum(x) => x.as_syntax_node(),
13238 ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13239 ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13240 ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13241 ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13242 ModuleItem::Missing(x) => x.as_syntax_node(),
13243 }
13244 }
13245 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13246 ModuleItemPtr(self.as_syntax_node().stable_ptr(db))
13247 }
13248}
13249impl<'db> ModuleItem<'db> {
13250 pub fn is_variant(kind: SyntaxKind) -> bool {
13252 matches!(
13253 kind,
13254 SyntaxKind::ItemConstant
13255 | SyntaxKind::ItemModule
13256 | SyntaxKind::ItemUse
13257 | SyntaxKind::FunctionWithBody
13258 | SyntaxKind::ItemExternFunction
13259 | SyntaxKind::ItemExternType
13260 | SyntaxKind::ItemTrait
13261 | SyntaxKind::ItemImpl
13262 | SyntaxKind::ItemImplAlias
13263 | SyntaxKind::ItemStruct
13264 | SyntaxKind::ItemEnum
13265 | SyntaxKind::ItemTypeAlias
13266 | SyntaxKind::ItemInlineMacro
13267 | SyntaxKind::ItemMacroDeclaration
13268 | SyntaxKind::ItemHeaderDoc
13269 | SyntaxKind::ModuleItemMissing
13270 )
13271 }
13272}
13273#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13274pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13275impl<'db> Deref for ModuleItemList<'db> {
13276 type Target = ElementList<'db, ModuleItem<'db>, 1>;
13277 fn deref(&self) -> &Self::Target {
13278 &self.0
13279 }
13280}
13281impl<'db> ModuleItemList<'db> {
13282 pub fn new_green(
13283 db: &'db dyn Database,
13284 children: &[ModuleItemGreen<'db>],
13285 ) -> ModuleItemListGreen<'db> {
13286 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13287 ModuleItemListGreen(
13288 GreenNode {
13289 kind: SyntaxKind::ModuleItemList,
13290 details: GreenNodeDetails::Node {
13291 children: children.iter().map(|x| x.0).collect(),
13292 width,
13293 },
13294 }
13295 .intern(db),
13296 )
13297 }
13298}
13299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13300pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13301impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13302 type SyntaxNode = ModuleItemList<'db>;
13303 fn untyped(self) -> SyntaxStablePtrId<'db> {
13304 self.0
13305 }
13306 fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13307 ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13308 }
13309}
13310impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13311 fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13312 ptr.untyped()
13313 }
13314}
13315#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13316pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13317impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13318 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13319 type StablePtr = ModuleItemListPtr<'db>;
13320 type Green = ModuleItemListGreen<'db>;
13321 fn missing(db: &'db dyn Database) -> Self::Green {
13322 ModuleItemListGreen(
13323 GreenNode {
13324 kind: SyntaxKind::ModuleItemList,
13325 details: GreenNodeDetails::Node {
13326 children: [].into(),
13327 width: TextWidth::default(),
13328 },
13329 }
13330 .intern(db),
13331 )
13332 }
13333 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13334 Self(ElementList::new(node))
13335 }
13336 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13337 if node.kind(db) == SyntaxKind::ModuleItemList {
13338 Some(Self(ElementList::new(node)))
13339 } else {
13340 None
13341 }
13342 }
13343 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13344 self.node
13345 }
13346 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13347 ModuleItemListPtr(self.node.stable_ptr(db))
13348 }
13349}
13350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13351pub struct ModuleItemMissing<'db> {
13352 node: SyntaxNode<'db>,
13353}
13354impl<'db> ModuleItemMissing<'db> {
13355 pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13356 let children = [];
13357 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13358 ModuleItemMissingGreen(
13359 GreenNode {
13360 kind: SyntaxKind::ModuleItemMissing,
13361 details: GreenNodeDetails::Node { children: children.into(), width },
13362 }
13363 .intern(db),
13364 )
13365 }
13366}
13367impl<'db> ModuleItemMissing<'db> {}
13368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13369pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13370impl<'db> ModuleItemMissingPtr<'db> {}
13371impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13372 type SyntaxNode = ModuleItemMissing<'db>;
13373 fn untyped(self) -> SyntaxStablePtrId<'db> {
13374 self.0
13375 }
13376 fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13377 ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13378 }
13379}
13380impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13381 fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13382 ptr.untyped()
13383 }
13384}
13385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13386pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13387impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13388 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13389 type StablePtr = ModuleItemMissingPtr<'db>;
13390 type Green = ModuleItemMissingGreen<'db>;
13391 fn missing(db: &'db dyn Database) -> Self::Green {
13392 ModuleItemMissingGreen(
13393 GreenNode {
13394 kind: SyntaxKind::ModuleItemMissing,
13395 details: GreenNodeDetails::Node {
13396 children: [].into(),
13397 width: TextWidth::default(),
13398 },
13399 }
13400 .intern(db),
13401 )
13402 }
13403 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13404 let kind = node.kind(db);
13405 assert_eq!(
13406 kind,
13407 SyntaxKind::ModuleItemMissing,
13408 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13409 kind,
13410 SyntaxKind::ModuleItemMissing
13411 );
13412 Self { node }
13413 }
13414 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13415 let kind = node.kind(db);
13416 if kind == SyntaxKind::ModuleItemMissing {
13417 Some(Self::from_syntax_node(db, node))
13418 } else {
13419 None
13420 }
13421 }
13422 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13423 self.node
13424 }
13425 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13426 ModuleItemMissingPtr(self.node.stable_ptr(db))
13427 }
13428}
13429#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13430pub struct Attribute<'db> {
13431 node: SyntaxNode<'db>,
13432}
13433impl<'db> Attribute<'db> {
13434 pub const INDEX_HASH: usize = 0;
13435 pub const INDEX_LBRACK: usize = 1;
13436 pub const INDEX_ATTR: usize = 2;
13437 pub const INDEX_ARGUMENTS: usize = 3;
13438 pub const INDEX_RBRACK: usize = 4;
13439 pub fn new_green(
13440 db: &'db dyn Database,
13441 hash: TerminalHashGreen<'db>,
13442 lbrack: TerminalLBrackGreen<'db>,
13443 attr: ExprPathGreen<'db>,
13444 arguments: OptionArgListParenthesizedGreen<'db>,
13445 rbrack: TerminalRBrackGreen<'db>,
13446 ) -> AttributeGreen<'db> {
13447 let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13448 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13449 AttributeGreen(
13450 GreenNode {
13451 kind: SyntaxKind::Attribute,
13452 details: GreenNodeDetails::Node { children: children.into(), width },
13453 }
13454 .intern(db),
13455 )
13456 }
13457}
13458impl<'db> Attribute<'db> {
13459 pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13460 TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13461 }
13462 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13463 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13464 }
13465 pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13466 ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13467 }
13468 pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13469 OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13470 }
13471 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13472 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13473 }
13474}
13475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13476pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13477impl<'db> AttributePtr<'db> {}
13478impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13479 type SyntaxNode = Attribute<'db>;
13480 fn untyped(self) -> SyntaxStablePtrId<'db> {
13481 self.0
13482 }
13483 fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13484 Attribute::from_syntax_node(db, self.0.lookup(db))
13485 }
13486}
13487impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13488 fn from(ptr: AttributePtr<'db>) -> Self {
13489 ptr.untyped()
13490 }
13491}
13492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13493pub struct AttributeGreen<'db>(pub GreenId<'db>);
13494impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13495 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13496 type StablePtr = AttributePtr<'db>;
13497 type Green = AttributeGreen<'db>;
13498 fn missing(db: &'db dyn Database) -> Self::Green {
13499 AttributeGreen(
13500 GreenNode {
13501 kind: SyntaxKind::Attribute,
13502 details: GreenNodeDetails::Node {
13503 children: [
13504 TerminalHash::missing(db).0,
13505 TerminalLBrack::missing(db).0,
13506 ExprPath::missing(db).0,
13507 OptionArgListParenthesized::missing(db).0,
13508 TerminalRBrack::missing(db).0,
13509 ]
13510 .into(),
13511 width: TextWidth::default(),
13512 },
13513 }
13514 .intern(db),
13515 )
13516 }
13517 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13518 let kind = node.kind(db);
13519 assert_eq!(
13520 kind,
13521 SyntaxKind::Attribute,
13522 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13523 kind,
13524 SyntaxKind::Attribute
13525 );
13526 Self { node }
13527 }
13528 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13529 let kind = node.kind(db);
13530 if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13531 }
13532 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13533 self.node
13534 }
13535 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13536 AttributePtr(self.node.stable_ptr(db))
13537 }
13538}
13539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13540pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13541impl<'db> Deref for AttributeList<'db> {
13542 type Target = ElementList<'db, Attribute<'db>, 1>;
13543 fn deref(&self) -> &Self::Target {
13544 &self.0
13545 }
13546}
13547impl<'db> AttributeList<'db> {
13548 pub fn new_green(
13549 db: &'db dyn Database,
13550 children: &[AttributeGreen<'db>],
13551 ) -> AttributeListGreen<'db> {
13552 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13553 AttributeListGreen(
13554 GreenNode {
13555 kind: SyntaxKind::AttributeList,
13556 details: GreenNodeDetails::Node {
13557 children: children.iter().map(|x| x.0).collect(),
13558 width,
13559 },
13560 }
13561 .intern(db),
13562 )
13563 }
13564}
13565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13566pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13567impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13568 type SyntaxNode = AttributeList<'db>;
13569 fn untyped(self) -> SyntaxStablePtrId<'db> {
13570 self.0
13571 }
13572 fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13573 AttributeList::from_syntax_node(db, self.0.lookup(db))
13574 }
13575}
13576impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13577 fn from(ptr: AttributeListPtr<'db>) -> Self {
13578 ptr.untyped()
13579 }
13580}
13581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13582pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13583impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13584 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13585 type StablePtr = AttributeListPtr<'db>;
13586 type Green = AttributeListGreen<'db>;
13587 fn missing(db: &'db dyn Database) -> Self::Green {
13588 AttributeListGreen(
13589 GreenNode {
13590 kind: SyntaxKind::AttributeList,
13591 details: GreenNodeDetails::Node {
13592 children: [].into(),
13593 width: TextWidth::default(),
13594 },
13595 }
13596 .intern(db),
13597 )
13598 }
13599 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13600 Self(ElementList::new(node))
13601 }
13602 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13603 if node.kind(db) == SyntaxKind::AttributeList {
13604 Some(Self(ElementList::new(node)))
13605 } else {
13606 None
13607 }
13608 }
13609 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13610 self.node
13611 }
13612 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13613 AttributeListPtr(self.node.stable_ptr(db))
13614 }
13615}
13616#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13617pub struct VisibilityDefault<'db> {
13618 node: SyntaxNode<'db>,
13619}
13620impl<'db> VisibilityDefault<'db> {
13621 pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13622 let children = [];
13623 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13624 VisibilityDefaultGreen(
13625 GreenNode {
13626 kind: SyntaxKind::VisibilityDefault,
13627 details: GreenNodeDetails::Node { children: children.into(), width },
13628 }
13629 .intern(db),
13630 )
13631 }
13632}
13633impl<'db> VisibilityDefault<'db> {}
13634#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13635pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13636impl<'db> VisibilityDefaultPtr<'db> {}
13637impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13638 type SyntaxNode = VisibilityDefault<'db>;
13639 fn untyped(self) -> SyntaxStablePtrId<'db> {
13640 self.0
13641 }
13642 fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13643 VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13644 }
13645}
13646impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13647 fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13648 ptr.untyped()
13649 }
13650}
13651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13652pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13653impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13654 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13655 type StablePtr = VisibilityDefaultPtr<'db>;
13656 type Green = VisibilityDefaultGreen<'db>;
13657 fn missing(db: &'db dyn Database) -> Self::Green {
13658 VisibilityDefaultGreen(
13659 GreenNode {
13660 kind: SyntaxKind::VisibilityDefault,
13661 details: GreenNodeDetails::Node {
13662 children: [].into(),
13663 width: TextWidth::default(),
13664 },
13665 }
13666 .intern(db),
13667 )
13668 }
13669 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13670 let kind = node.kind(db);
13671 assert_eq!(
13672 kind,
13673 SyntaxKind::VisibilityDefault,
13674 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13675 kind,
13676 SyntaxKind::VisibilityDefault
13677 );
13678 Self { node }
13679 }
13680 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13681 let kind = node.kind(db);
13682 if kind == SyntaxKind::VisibilityDefault {
13683 Some(Self::from_syntax_node(db, node))
13684 } else {
13685 None
13686 }
13687 }
13688 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13689 self.node
13690 }
13691 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13692 VisibilityDefaultPtr(self.node.stable_ptr(db))
13693 }
13694}
13695#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13696pub struct VisibilityPubArgumentClause<'db> {
13697 node: SyntaxNode<'db>,
13698}
13699impl<'db> VisibilityPubArgumentClause<'db> {
13700 pub const INDEX_LPAREN: usize = 0;
13701 pub const INDEX_ARGUMENT: usize = 1;
13702 pub const INDEX_RPAREN: usize = 2;
13703 pub fn new_green(
13704 db: &'db dyn Database,
13705 lparen: TerminalLParenGreen<'db>,
13706 argument: TerminalIdentifierGreen<'db>,
13707 rparen: TerminalRParenGreen<'db>,
13708 ) -> VisibilityPubArgumentClauseGreen<'db> {
13709 let children = [lparen.0, argument.0, rparen.0];
13710 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13711 VisibilityPubArgumentClauseGreen(
13712 GreenNode {
13713 kind: SyntaxKind::VisibilityPubArgumentClause,
13714 details: GreenNodeDetails::Node { children: children.into(), width },
13715 }
13716 .intern(db),
13717 )
13718 }
13719}
13720impl<'db> VisibilityPubArgumentClause<'db> {
13721 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13722 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13723 }
13724 pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13725 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13726 }
13727 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13728 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13729 }
13730}
13731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13732pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13733impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13734impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13735 type SyntaxNode = VisibilityPubArgumentClause<'db>;
13736 fn untyped(self) -> SyntaxStablePtrId<'db> {
13737 self.0
13738 }
13739 fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13740 VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13741 }
13742}
13743impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13744 fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13745 ptr.untyped()
13746 }
13747}
13748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13749pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13750impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13751 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13752 type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13753 type Green = VisibilityPubArgumentClauseGreen<'db>;
13754 fn missing(db: &'db dyn Database) -> Self::Green {
13755 VisibilityPubArgumentClauseGreen(
13756 GreenNode {
13757 kind: SyntaxKind::VisibilityPubArgumentClause,
13758 details: GreenNodeDetails::Node {
13759 children: [
13760 TerminalLParen::missing(db).0,
13761 TerminalIdentifier::missing(db).0,
13762 TerminalRParen::missing(db).0,
13763 ]
13764 .into(),
13765 width: TextWidth::default(),
13766 },
13767 }
13768 .intern(db),
13769 )
13770 }
13771 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13772 let kind = node.kind(db);
13773 assert_eq!(
13774 kind,
13775 SyntaxKind::VisibilityPubArgumentClause,
13776 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13777 kind,
13778 SyntaxKind::VisibilityPubArgumentClause
13779 );
13780 Self { node }
13781 }
13782 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13783 let kind = node.kind(db);
13784 if kind == SyntaxKind::VisibilityPubArgumentClause {
13785 Some(Self::from_syntax_node(db, node))
13786 } else {
13787 None
13788 }
13789 }
13790 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13791 self.node
13792 }
13793 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13794 VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13795 }
13796}
13797#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13798pub enum OptionVisibilityPubArgumentClause<'db> {
13799 Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13800 VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13801}
13802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13803pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13804impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13805 type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13806 fn untyped(self) -> SyntaxStablePtrId<'db> {
13807 self.0
13808 }
13809 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13810 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13811 }
13812}
13813impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13814 fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13815 ptr.untyped()
13816 }
13817}
13818impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13819 for OptionVisibilityPubArgumentClausePtr<'db>
13820{
13821 fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13822 Self(value.0)
13823 }
13824}
13825impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13826 fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13827 Self(value.0)
13828 }
13829}
13830impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13831 for OptionVisibilityPubArgumentClauseGreen<'db>
13832{
13833 fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13834 Self(value.0)
13835 }
13836}
13837impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13838 for OptionVisibilityPubArgumentClauseGreen<'db>
13839{
13840 fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13841 Self(value.0)
13842 }
13843}
13844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13845pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13846impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13847 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13848 type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13849 type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13850 fn missing(db: &'db dyn Database) -> Self::Green {
13851 panic!("No missing variant.");
13852 }
13853 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13854 let kind = node.kind(db);
13855 match kind {
13856 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13857 OptionVisibilityPubArgumentClause::Empty(
13858 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13859 )
13860 }
13861 SyntaxKind::VisibilityPubArgumentClause => {
13862 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13863 VisibilityPubArgumentClause::from_syntax_node(db, node),
13864 )
13865 }
13866 _ => panic!(
13867 "Unexpected syntax kind {:?} when constructing {}.",
13868 kind, "OptionVisibilityPubArgumentClause"
13869 ),
13870 }
13871 }
13872 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13873 let kind = node.kind(db);
13874 match kind {
13875 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13876 Some(OptionVisibilityPubArgumentClause::Empty(
13877 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13878 ))
13879 }
13880 SyntaxKind::VisibilityPubArgumentClause => {
13881 Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13882 VisibilityPubArgumentClause::from_syntax_node(db, node),
13883 ))
13884 }
13885 _ => None,
13886 }
13887 }
13888 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13889 match self {
13890 OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13891 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13892 }
13893 }
13894 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13895 OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().stable_ptr(db))
13896 }
13897}
13898impl<'db> OptionVisibilityPubArgumentClause<'db> {
13899 pub fn is_variant(kind: SyntaxKind) -> bool {
13901 matches!(
13902 kind,
13903 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13904 | SyntaxKind::VisibilityPubArgumentClause
13905 )
13906 }
13907}
13908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13909pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
13910 node: SyntaxNode<'db>,
13911}
13912impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
13913 pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
13914 let children = [];
13915 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13916 OptionVisibilityPubArgumentClauseEmptyGreen(
13917 GreenNode {
13918 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13919 details: GreenNodeDetails::Node { children: children.into(), width },
13920 }
13921 .intern(db),
13922 )
13923 }
13924}
13925impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
13926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13927pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
13928impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
13929impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
13930 type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
13931 fn untyped(self) -> SyntaxStablePtrId<'db> {
13932 self.0
13933 }
13934 fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
13935 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
13936 }
13937}
13938impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
13939 fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13940 ptr.untyped()
13941 }
13942}
13943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13944pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
13945impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
13946 const OPTIONAL_KIND: Option<SyntaxKind> =
13947 Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
13948 type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
13949 type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
13950 fn missing(db: &'db dyn Database) -> Self::Green {
13951 OptionVisibilityPubArgumentClauseEmptyGreen(
13952 GreenNode {
13953 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13954 details: GreenNodeDetails::Node {
13955 children: [].into(),
13956 width: TextWidth::default(),
13957 },
13958 }
13959 .intern(db),
13960 )
13961 }
13962 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13963 let kind = node.kind(db);
13964 assert_eq!(
13965 kind,
13966 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13967 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13968 kind,
13969 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13970 );
13971 Self { node }
13972 }
13973 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13974 let kind = node.kind(db);
13975 if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
13976 Some(Self::from_syntax_node(db, node))
13977 } else {
13978 None
13979 }
13980 }
13981 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13982 self.node
13983 }
13984 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13985 OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
13986 }
13987}
13988#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13989pub struct VisibilityPub<'db> {
13990 node: SyntaxNode<'db>,
13991}
13992impl<'db> VisibilityPub<'db> {
13993 pub const INDEX_PUB_KW: usize = 0;
13994 pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
13995 pub fn new_green(
13996 db: &'db dyn Database,
13997 pub_kw: TerminalPubGreen<'db>,
13998 argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
13999 ) -> VisibilityPubGreen<'db> {
14000 let children = [pub_kw.0, argument_clause.0];
14001 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14002 VisibilityPubGreen(
14003 GreenNode {
14004 kind: SyntaxKind::VisibilityPub,
14005 details: GreenNodeDetails::Node { children: children.into(), width },
14006 }
14007 .intern(db),
14008 )
14009 }
14010}
14011impl<'db> VisibilityPub<'db> {
14012 pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14013 TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14014 }
14015 pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14016 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14017 }
14018}
14019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14020pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14021impl<'db> VisibilityPubPtr<'db> {}
14022impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14023 type SyntaxNode = VisibilityPub<'db>;
14024 fn untyped(self) -> SyntaxStablePtrId<'db> {
14025 self.0
14026 }
14027 fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14028 VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14029 }
14030}
14031impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14032 fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14033 ptr.untyped()
14034 }
14035}
14036#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14037pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14038impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14039 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14040 type StablePtr = VisibilityPubPtr<'db>;
14041 type Green = VisibilityPubGreen<'db>;
14042 fn missing(db: &'db dyn Database) -> Self::Green {
14043 VisibilityPubGreen(
14044 GreenNode {
14045 kind: SyntaxKind::VisibilityPub,
14046 details: GreenNodeDetails::Node {
14047 children: [
14048 TerminalPub::missing(db).0,
14049 OptionVisibilityPubArgumentClause::missing(db).0,
14050 ]
14051 .into(),
14052 width: TextWidth::default(),
14053 },
14054 }
14055 .intern(db),
14056 )
14057 }
14058 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14059 let kind = node.kind(db);
14060 assert_eq!(
14061 kind,
14062 SyntaxKind::VisibilityPub,
14063 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14064 kind,
14065 SyntaxKind::VisibilityPub
14066 );
14067 Self { node }
14068 }
14069 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14070 let kind = node.kind(db);
14071 if kind == SyntaxKind::VisibilityPub {
14072 Some(Self::from_syntax_node(db, node))
14073 } else {
14074 None
14075 }
14076 }
14077 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14078 self.node
14079 }
14080 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14081 VisibilityPubPtr(self.node.stable_ptr(db))
14082 }
14083}
14084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14085pub enum Visibility<'db> {
14086 Default(VisibilityDefault<'db>),
14087 Pub(VisibilityPub<'db>),
14088}
14089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14090pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14091impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14092 type SyntaxNode = Visibility<'db>;
14093 fn untyped(self) -> SyntaxStablePtrId<'db> {
14094 self.0
14095 }
14096 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14097 Visibility::from_syntax_node(db, self.0.lookup(db))
14098 }
14099}
14100impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14101 fn from(ptr: VisibilityPtr<'db>) -> Self {
14102 ptr.untyped()
14103 }
14104}
14105impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14106 fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14107 Self(value.0)
14108 }
14109}
14110impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14111 fn from(value: VisibilityPubPtr<'db>) -> Self {
14112 Self(value.0)
14113 }
14114}
14115impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14116 fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14117 Self(value.0)
14118 }
14119}
14120impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14121 fn from(value: VisibilityPubGreen<'db>) -> Self {
14122 Self(value.0)
14123 }
14124}
14125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14126pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14127impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14128 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14129 type StablePtr = VisibilityPtr<'db>;
14130 type Green = VisibilityGreen<'db>;
14131 fn missing(db: &'db dyn Database) -> Self::Green {
14132 panic!("No missing variant.");
14133 }
14134 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14135 let kind = node.kind(db);
14136 match kind {
14137 SyntaxKind::VisibilityDefault => {
14138 Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14139 }
14140 SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14141 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14142 }
14143 }
14144 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14145 let kind = node.kind(db);
14146 match kind {
14147 SyntaxKind::VisibilityDefault => {
14148 Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14149 }
14150 SyntaxKind::VisibilityPub => {
14151 Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14152 }
14153 _ => None,
14154 }
14155 }
14156 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14157 match self {
14158 Visibility::Default(x) => x.as_syntax_node(),
14159 Visibility::Pub(x) => x.as_syntax_node(),
14160 }
14161 }
14162 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14163 VisibilityPtr(self.as_syntax_node().stable_ptr(db))
14164 }
14165}
14166impl<'db> Visibility<'db> {
14167 pub fn is_variant(kind: SyntaxKind) -> bool {
14169 matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14170 }
14171}
14172#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14173pub struct ItemModule<'db> {
14174 node: SyntaxNode<'db>,
14175}
14176impl<'db> ItemModule<'db> {
14177 pub const INDEX_ATTRIBUTES: usize = 0;
14178 pub const INDEX_VISIBILITY: usize = 1;
14179 pub const INDEX_MODULE_KW: usize = 2;
14180 pub const INDEX_NAME: usize = 3;
14181 pub const INDEX_BODY: usize = 4;
14182 pub fn new_green(
14183 db: &'db dyn Database,
14184 attributes: AttributeListGreen<'db>,
14185 visibility: VisibilityGreen<'db>,
14186 module_kw: TerminalModuleGreen<'db>,
14187 name: TerminalIdentifierGreen<'db>,
14188 body: MaybeModuleBodyGreen<'db>,
14189 ) -> ItemModuleGreen<'db> {
14190 let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14191 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14192 ItemModuleGreen(
14193 GreenNode {
14194 kind: SyntaxKind::ItemModule,
14195 details: GreenNodeDetails::Node { children: children.into(), width },
14196 }
14197 .intern(db),
14198 )
14199 }
14200}
14201impl<'db> ItemModule<'db> {
14202 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14203 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14204 }
14205 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14206 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14207 }
14208 pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14209 TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14210 }
14211 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14212 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14213 }
14214 pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14215 MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14216 }
14217}
14218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14219pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14220impl<'db> ItemModulePtr<'db> {
14221 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14222 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14223 }
14224}
14225impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14226 type SyntaxNode = ItemModule<'db>;
14227 fn untyped(self) -> SyntaxStablePtrId<'db> {
14228 self.0
14229 }
14230 fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14231 ItemModule::from_syntax_node(db, self.0.lookup(db))
14232 }
14233}
14234impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14235 fn from(ptr: ItemModulePtr<'db>) -> Self {
14236 ptr.untyped()
14237 }
14238}
14239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14240pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14241impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14242 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14243 type StablePtr = ItemModulePtr<'db>;
14244 type Green = ItemModuleGreen<'db>;
14245 fn missing(db: &'db dyn Database) -> Self::Green {
14246 ItemModuleGreen(
14247 GreenNode {
14248 kind: SyntaxKind::ItemModule,
14249 details: GreenNodeDetails::Node {
14250 children: [
14251 AttributeList::missing(db).0,
14252 Visibility::missing(db).0,
14253 TerminalModule::missing(db).0,
14254 TerminalIdentifier::missing(db).0,
14255 MaybeModuleBody::missing(db).0,
14256 ]
14257 .into(),
14258 width: TextWidth::default(),
14259 },
14260 }
14261 .intern(db),
14262 )
14263 }
14264 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14265 let kind = node.kind(db);
14266 assert_eq!(
14267 kind,
14268 SyntaxKind::ItemModule,
14269 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14270 kind,
14271 SyntaxKind::ItemModule
14272 );
14273 Self { node }
14274 }
14275 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14276 let kind = node.kind(db);
14277 if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14278 }
14279 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14280 self.node
14281 }
14282 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14283 ItemModulePtr(self.node.stable_ptr(db))
14284 }
14285}
14286#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14287pub enum MaybeModuleBody<'db> {
14288 Some(ModuleBody<'db>),
14289 None(TerminalSemicolon<'db>),
14290}
14291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14292pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14293impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14294 type SyntaxNode = MaybeModuleBody<'db>;
14295 fn untyped(self) -> SyntaxStablePtrId<'db> {
14296 self.0
14297 }
14298 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14299 MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14300 }
14301}
14302impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14303 fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14304 ptr.untyped()
14305 }
14306}
14307impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14308 fn from(value: ModuleBodyPtr<'db>) -> Self {
14309 Self(value.0)
14310 }
14311}
14312impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14313 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14314 Self(value.0)
14315 }
14316}
14317impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14318 fn from(value: ModuleBodyGreen<'db>) -> Self {
14319 Self(value.0)
14320 }
14321}
14322impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14323 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14324 Self(value.0)
14325 }
14326}
14327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14328pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14329impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14330 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14331 type StablePtr = MaybeModuleBodyPtr<'db>;
14332 type Green = MaybeModuleBodyGreen<'db>;
14333 fn missing(db: &'db dyn Database) -> Self::Green {
14334 panic!("No missing variant.");
14335 }
14336 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14337 let kind = node.kind(db);
14338 match kind {
14339 SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14340 SyntaxKind::TerminalSemicolon => {
14341 MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14342 }
14343 _ => {
14344 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14345 }
14346 }
14347 }
14348 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14349 let kind = node.kind(db);
14350 match kind {
14351 SyntaxKind::ModuleBody => {
14352 Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14353 }
14354 SyntaxKind::TerminalSemicolon => {
14355 Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14356 }
14357 _ => None,
14358 }
14359 }
14360 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14361 match self {
14362 MaybeModuleBody::Some(x) => x.as_syntax_node(),
14363 MaybeModuleBody::None(x) => x.as_syntax_node(),
14364 }
14365 }
14366 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14367 MaybeModuleBodyPtr(self.as_syntax_node().stable_ptr(db))
14368 }
14369}
14370impl<'db> MaybeModuleBody<'db> {
14371 pub fn is_variant(kind: SyntaxKind) -> bool {
14373 matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14374 }
14375}
14376#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14377pub struct ModuleBody<'db> {
14378 node: SyntaxNode<'db>,
14379}
14380impl<'db> ModuleBody<'db> {
14381 pub const INDEX_LBRACE: usize = 0;
14382 pub const INDEX_ITEMS: usize = 1;
14383 pub const INDEX_RBRACE: usize = 2;
14384 pub fn new_green(
14385 db: &'db dyn Database,
14386 lbrace: TerminalLBraceGreen<'db>,
14387 items: ModuleItemListGreen<'db>,
14388 rbrace: TerminalRBraceGreen<'db>,
14389 ) -> ModuleBodyGreen<'db> {
14390 let children = [lbrace.0, items.0, rbrace.0];
14391 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14392 ModuleBodyGreen(
14393 GreenNode {
14394 kind: SyntaxKind::ModuleBody,
14395 details: GreenNodeDetails::Node { children: children.into(), width },
14396 }
14397 .intern(db),
14398 )
14399 }
14400}
14401impl<'db> ModuleBody<'db> {
14402 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14403 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14404 }
14405 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14406 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14407 }
14408 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14409 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14410 }
14411}
14412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14413pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14414impl<'db> ModuleBodyPtr<'db> {}
14415impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14416 type SyntaxNode = ModuleBody<'db>;
14417 fn untyped(self) -> SyntaxStablePtrId<'db> {
14418 self.0
14419 }
14420 fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14421 ModuleBody::from_syntax_node(db, self.0.lookup(db))
14422 }
14423}
14424impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14425 fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14426 ptr.untyped()
14427 }
14428}
14429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14430pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14431impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14432 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14433 type StablePtr = ModuleBodyPtr<'db>;
14434 type Green = ModuleBodyGreen<'db>;
14435 fn missing(db: &'db dyn Database) -> Self::Green {
14436 ModuleBodyGreen(
14437 GreenNode {
14438 kind: SyntaxKind::ModuleBody,
14439 details: GreenNodeDetails::Node {
14440 children: [
14441 TerminalLBrace::missing(db).0,
14442 ModuleItemList::missing(db).0,
14443 TerminalRBrace::missing(db).0,
14444 ]
14445 .into(),
14446 width: TextWidth::default(),
14447 },
14448 }
14449 .intern(db),
14450 )
14451 }
14452 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14453 let kind = node.kind(db);
14454 assert_eq!(
14455 kind,
14456 SyntaxKind::ModuleBody,
14457 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14458 kind,
14459 SyntaxKind::ModuleBody
14460 );
14461 Self { node }
14462 }
14463 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14464 let kind = node.kind(db);
14465 if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14466 }
14467 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14468 self.node
14469 }
14470 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14471 ModuleBodyPtr(self.node.stable_ptr(db))
14472 }
14473}
14474#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14475pub struct FunctionDeclaration<'db> {
14476 node: SyntaxNode<'db>,
14477}
14478impl<'db> FunctionDeclaration<'db> {
14479 pub const INDEX_OPTIONAL_CONST: usize = 0;
14480 pub const INDEX_FUNCTION_KW: usize = 1;
14481 pub const INDEX_NAME: usize = 2;
14482 pub const INDEX_GENERIC_PARAMS: usize = 3;
14483 pub const INDEX_SIGNATURE: usize = 4;
14484 pub fn new_green(
14485 db: &'db dyn Database,
14486 optional_const: OptionTerminalConstGreen<'db>,
14487 function_kw: TerminalFunctionGreen<'db>,
14488 name: TerminalIdentifierGreen<'db>,
14489 generic_params: OptionWrappedGenericParamListGreen<'db>,
14490 signature: FunctionSignatureGreen<'db>,
14491 ) -> FunctionDeclarationGreen<'db> {
14492 let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14493 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14494 FunctionDeclarationGreen(
14495 GreenNode {
14496 kind: SyntaxKind::FunctionDeclaration,
14497 details: GreenNodeDetails::Node { children: children.into(), width },
14498 }
14499 .intern(db),
14500 )
14501 }
14502}
14503impl<'db> FunctionDeclaration<'db> {
14504 pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14505 OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14506 }
14507 pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14508 TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14509 }
14510 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14511 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14512 }
14513 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14514 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14515 }
14516 pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14517 FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14518 }
14519}
14520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14521pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14522impl<'db> FunctionDeclarationPtr<'db> {
14523 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14524 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14525 }
14526}
14527impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14528 type SyntaxNode = FunctionDeclaration<'db>;
14529 fn untyped(self) -> SyntaxStablePtrId<'db> {
14530 self.0
14531 }
14532 fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14533 FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14534 }
14535}
14536impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14537 fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14538 ptr.untyped()
14539 }
14540}
14541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14542pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14543impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14544 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14545 type StablePtr = FunctionDeclarationPtr<'db>;
14546 type Green = FunctionDeclarationGreen<'db>;
14547 fn missing(db: &'db dyn Database) -> Self::Green {
14548 FunctionDeclarationGreen(
14549 GreenNode {
14550 kind: SyntaxKind::FunctionDeclaration,
14551 details: GreenNodeDetails::Node {
14552 children: [
14553 OptionTerminalConst::missing(db).0,
14554 TerminalFunction::missing(db).0,
14555 TerminalIdentifier::missing(db).0,
14556 OptionWrappedGenericParamList::missing(db).0,
14557 FunctionSignature::missing(db).0,
14558 ]
14559 .into(),
14560 width: TextWidth::default(),
14561 },
14562 }
14563 .intern(db),
14564 )
14565 }
14566 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14567 let kind = node.kind(db);
14568 assert_eq!(
14569 kind,
14570 SyntaxKind::FunctionDeclaration,
14571 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14572 kind,
14573 SyntaxKind::FunctionDeclaration
14574 );
14575 Self { node }
14576 }
14577 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14578 let kind = node.kind(db);
14579 if kind == SyntaxKind::FunctionDeclaration {
14580 Some(Self::from_syntax_node(db, node))
14581 } else {
14582 None
14583 }
14584 }
14585 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14586 self.node
14587 }
14588 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14589 FunctionDeclarationPtr(self.node.stable_ptr(db))
14590 }
14591}
14592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14593pub struct ItemConstant<'db> {
14594 node: SyntaxNode<'db>,
14595}
14596impl<'db> ItemConstant<'db> {
14597 pub const INDEX_ATTRIBUTES: usize = 0;
14598 pub const INDEX_VISIBILITY: usize = 1;
14599 pub const INDEX_CONST_KW: usize = 2;
14600 pub const INDEX_NAME: usize = 3;
14601 pub const INDEX_TYPE_CLAUSE: usize = 4;
14602 pub const INDEX_EQ: usize = 5;
14603 pub const INDEX_VALUE: usize = 6;
14604 pub const INDEX_SEMICOLON: usize = 7;
14605 pub fn new_green(
14606 db: &'db dyn Database,
14607 attributes: AttributeListGreen<'db>,
14608 visibility: VisibilityGreen<'db>,
14609 const_kw: TerminalConstGreen<'db>,
14610 name: TerminalIdentifierGreen<'db>,
14611 type_clause: TypeClauseGreen<'db>,
14612 eq: TerminalEqGreen<'db>,
14613 value: ExprGreen<'db>,
14614 semicolon: TerminalSemicolonGreen<'db>,
14615 ) -> ItemConstantGreen<'db> {
14616 let children = [
14617 attributes.0,
14618 visibility.0,
14619 const_kw.0,
14620 name.0,
14621 type_clause.0,
14622 eq.0,
14623 value.0,
14624 semicolon.0,
14625 ];
14626 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14627 ItemConstantGreen(
14628 GreenNode {
14629 kind: SyntaxKind::ItemConstant,
14630 details: GreenNodeDetails::Node { children: children.into(), width },
14631 }
14632 .intern(db),
14633 )
14634 }
14635}
14636impl<'db> ItemConstant<'db> {
14637 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14638 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14639 }
14640 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14641 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14642 }
14643 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14644 TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14645 }
14646 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14647 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14648 }
14649 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14650 TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14651 }
14652 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14653 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14654 }
14655 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14656 Expr::from_syntax_node(db, self.node.get_children(db)[6])
14657 }
14658 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14659 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14660 }
14661}
14662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14663pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14664impl<'db> ItemConstantPtr<'db> {
14665 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14666 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14667 }
14668}
14669impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14670 type SyntaxNode = ItemConstant<'db>;
14671 fn untyped(self) -> SyntaxStablePtrId<'db> {
14672 self.0
14673 }
14674 fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14675 ItemConstant::from_syntax_node(db, self.0.lookup(db))
14676 }
14677}
14678impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14679 fn from(ptr: ItemConstantPtr<'db>) -> Self {
14680 ptr.untyped()
14681 }
14682}
14683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14684pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14685impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14686 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14687 type StablePtr = ItemConstantPtr<'db>;
14688 type Green = ItemConstantGreen<'db>;
14689 fn missing(db: &'db dyn Database) -> Self::Green {
14690 ItemConstantGreen(
14691 GreenNode {
14692 kind: SyntaxKind::ItemConstant,
14693 details: GreenNodeDetails::Node {
14694 children: [
14695 AttributeList::missing(db).0,
14696 Visibility::missing(db).0,
14697 TerminalConst::missing(db).0,
14698 TerminalIdentifier::missing(db).0,
14699 TypeClause::missing(db).0,
14700 TerminalEq::missing(db).0,
14701 Expr::missing(db).0,
14702 TerminalSemicolon::missing(db).0,
14703 ]
14704 .into(),
14705 width: TextWidth::default(),
14706 },
14707 }
14708 .intern(db),
14709 )
14710 }
14711 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14712 let kind = node.kind(db);
14713 assert_eq!(
14714 kind,
14715 SyntaxKind::ItemConstant,
14716 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14717 kind,
14718 SyntaxKind::ItemConstant
14719 );
14720 Self { node }
14721 }
14722 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14723 let kind = node.kind(db);
14724 if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14725 }
14726 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14727 self.node
14728 }
14729 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14730 ItemConstantPtr(self.node.stable_ptr(db))
14731 }
14732}
14733#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14734pub struct FunctionWithBody<'db> {
14735 node: SyntaxNode<'db>,
14736}
14737impl<'db> FunctionWithBody<'db> {
14738 pub const INDEX_ATTRIBUTES: usize = 0;
14739 pub const INDEX_VISIBILITY: usize = 1;
14740 pub const INDEX_DECLARATION: usize = 2;
14741 pub const INDEX_BODY: usize = 3;
14742 pub fn new_green(
14743 db: &'db dyn Database,
14744 attributes: AttributeListGreen<'db>,
14745 visibility: VisibilityGreen<'db>,
14746 declaration: FunctionDeclarationGreen<'db>,
14747 body: ExprBlockGreen<'db>,
14748 ) -> FunctionWithBodyGreen<'db> {
14749 let children = [attributes.0, visibility.0, declaration.0, body.0];
14750 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14751 FunctionWithBodyGreen(
14752 GreenNode {
14753 kind: SyntaxKind::FunctionWithBody,
14754 details: GreenNodeDetails::Node { children: children.into(), width },
14755 }
14756 .intern(db),
14757 )
14758 }
14759}
14760impl<'db> FunctionWithBody<'db> {
14761 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14762 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14763 }
14764 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14765 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14766 }
14767 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14768 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14769 }
14770 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14771 ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14772 }
14773}
14774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14775pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14776impl<'db> FunctionWithBodyPtr<'db> {
14777 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14778 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14779 }
14780}
14781impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14782 type SyntaxNode = FunctionWithBody<'db>;
14783 fn untyped(self) -> SyntaxStablePtrId<'db> {
14784 self.0
14785 }
14786 fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14787 FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14788 }
14789}
14790impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14791 fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14792 ptr.untyped()
14793 }
14794}
14795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14796pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14797impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14798 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14799 type StablePtr = FunctionWithBodyPtr<'db>;
14800 type Green = FunctionWithBodyGreen<'db>;
14801 fn missing(db: &'db dyn Database) -> Self::Green {
14802 FunctionWithBodyGreen(
14803 GreenNode {
14804 kind: SyntaxKind::FunctionWithBody,
14805 details: GreenNodeDetails::Node {
14806 children: [
14807 AttributeList::missing(db).0,
14808 Visibility::missing(db).0,
14809 FunctionDeclaration::missing(db).0,
14810 ExprBlock::missing(db).0,
14811 ]
14812 .into(),
14813 width: TextWidth::default(),
14814 },
14815 }
14816 .intern(db),
14817 )
14818 }
14819 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14820 let kind = node.kind(db);
14821 assert_eq!(
14822 kind,
14823 SyntaxKind::FunctionWithBody,
14824 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14825 kind,
14826 SyntaxKind::FunctionWithBody
14827 );
14828 Self { node }
14829 }
14830 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14831 let kind = node.kind(db);
14832 if kind == SyntaxKind::FunctionWithBody {
14833 Some(Self::from_syntax_node(db, node))
14834 } else {
14835 None
14836 }
14837 }
14838 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14839 self.node
14840 }
14841 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14842 FunctionWithBodyPtr(self.node.stable_ptr(db))
14843 }
14844}
14845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14846pub struct ItemExternFunction<'db> {
14847 node: SyntaxNode<'db>,
14848}
14849impl<'db> ItemExternFunction<'db> {
14850 pub const INDEX_ATTRIBUTES: usize = 0;
14851 pub const INDEX_VISIBILITY: usize = 1;
14852 pub const INDEX_EXTERN_KW: usize = 2;
14853 pub const INDEX_DECLARATION: usize = 3;
14854 pub const INDEX_SEMICOLON: usize = 4;
14855 pub fn new_green(
14856 db: &'db dyn Database,
14857 attributes: AttributeListGreen<'db>,
14858 visibility: VisibilityGreen<'db>,
14859 extern_kw: TerminalExternGreen<'db>,
14860 declaration: FunctionDeclarationGreen<'db>,
14861 semicolon: TerminalSemicolonGreen<'db>,
14862 ) -> ItemExternFunctionGreen<'db> {
14863 let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14864 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14865 ItemExternFunctionGreen(
14866 GreenNode {
14867 kind: SyntaxKind::ItemExternFunction,
14868 details: GreenNodeDetails::Node { children: children.into(), width },
14869 }
14870 .intern(db),
14871 )
14872 }
14873}
14874impl<'db> ItemExternFunction<'db> {
14875 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14876 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14877 }
14878 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14879 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14880 }
14881 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14882 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14883 }
14884 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14885 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
14886 }
14887 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14888 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
14889 }
14890}
14891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14892pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
14893impl<'db> ItemExternFunctionPtr<'db> {
14894 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14895 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14896 }
14897}
14898impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
14899 type SyntaxNode = ItemExternFunction<'db>;
14900 fn untyped(self) -> SyntaxStablePtrId<'db> {
14901 self.0
14902 }
14903 fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
14904 ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
14905 }
14906}
14907impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
14908 fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
14909 ptr.untyped()
14910 }
14911}
14912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14913pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
14914impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
14915 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
14916 type StablePtr = ItemExternFunctionPtr<'db>;
14917 type Green = ItemExternFunctionGreen<'db>;
14918 fn missing(db: &'db dyn Database) -> Self::Green {
14919 ItemExternFunctionGreen(
14920 GreenNode {
14921 kind: SyntaxKind::ItemExternFunction,
14922 details: GreenNodeDetails::Node {
14923 children: [
14924 AttributeList::missing(db).0,
14925 Visibility::missing(db).0,
14926 TerminalExtern::missing(db).0,
14927 FunctionDeclaration::missing(db).0,
14928 TerminalSemicolon::missing(db).0,
14929 ]
14930 .into(),
14931 width: TextWidth::default(),
14932 },
14933 }
14934 .intern(db),
14935 )
14936 }
14937 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14938 let kind = node.kind(db);
14939 assert_eq!(
14940 kind,
14941 SyntaxKind::ItemExternFunction,
14942 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14943 kind,
14944 SyntaxKind::ItemExternFunction
14945 );
14946 Self { node }
14947 }
14948 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14949 let kind = node.kind(db);
14950 if kind == SyntaxKind::ItemExternFunction {
14951 Some(Self::from_syntax_node(db, node))
14952 } else {
14953 None
14954 }
14955 }
14956 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14957 self.node
14958 }
14959 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14960 ItemExternFunctionPtr(self.node.stable_ptr(db))
14961 }
14962}
14963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14964pub struct ItemExternType<'db> {
14965 node: SyntaxNode<'db>,
14966}
14967impl<'db> ItemExternType<'db> {
14968 pub const INDEX_ATTRIBUTES: usize = 0;
14969 pub const INDEX_VISIBILITY: usize = 1;
14970 pub const INDEX_EXTERN_KW: usize = 2;
14971 pub const INDEX_TYPE_KW: usize = 3;
14972 pub const INDEX_NAME: usize = 4;
14973 pub const INDEX_GENERIC_PARAMS: usize = 5;
14974 pub const INDEX_SEMICOLON: usize = 6;
14975 pub fn new_green(
14976 db: &'db dyn Database,
14977 attributes: AttributeListGreen<'db>,
14978 visibility: VisibilityGreen<'db>,
14979 extern_kw: TerminalExternGreen<'db>,
14980 type_kw: TerminalTypeGreen<'db>,
14981 name: TerminalIdentifierGreen<'db>,
14982 generic_params: OptionWrappedGenericParamListGreen<'db>,
14983 semicolon: TerminalSemicolonGreen<'db>,
14984 ) -> ItemExternTypeGreen<'db> {
14985 let children = [
14986 attributes.0,
14987 visibility.0,
14988 extern_kw.0,
14989 type_kw.0,
14990 name.0,
14991 generic_params.0,
14992 semicolon.0,
14993 ];
14994 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14995 ItemExternTypeGreen(
14996 GreenNode {
14997 kind: SyntaxKind::ItemExternType,
14998 details: GreenNodeDetails::Node { children: children.into(), width },
14999 }
15000 .intern(db),
15001 )
15002 }
15003}
15004impl<'db> ItemExternType<'db> {
15005 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15006 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15007 }
15008 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15009 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15010 }
15011 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15012 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15013 }
15014 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15015 TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15016 }
15017 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15018 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15019 }
15020 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15021 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15022 }
15023 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15024 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15025 }
15026}
15027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15028pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15029impl<'db> ItemExternTypePtr<'db> {
15030 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15031 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15032 }
15033}
15034impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15035 type SyntaxNode = ItemExternType<'db>;
15036 fn untyped(self) -> SyntaxStablePtrId<'db> {
15037 self.0
15038 }
15039 fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15040 ItemExternType::from_syntax_node(db, self.0.lookup(db))
15041 }
15042}
15043impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15044 fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15045 ptr.untyped()
15046 }
15047}
15048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15049pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15050impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15051 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15052 type StablePtr = ItemExternTypePtr<'db>;
15053 type Green = ItemExternTypeGreen<'db>;
15054 fn missing(db: &'db dyn Database) -> Self::Green {
15055 ItemExternTypeGreen(
15056 GreenNode {
15057 kind: SyntaxKind::ItemExternType,
15058 details: GreenNodeDetails::Node {
15059 children: [
15060 AttributeList::missing(db).0,
15061 Visibility::missing(db).0,
15062 TerminalExtern::missing(db).0,
15063 TerminalType::missing(db).0,
15064 TerminalIdentifier::missing(db).0,
15065 OptionWrappedGenericParamList::missing(db).0,
15066 TerminalSemicolon::missing(db).0,
15067 ]
15068 .into(),
15069 width: TextWidth::default(),
15070 },
15071 }
15072 .intern(db),
15073 )
15074 }
15075 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15076 let kind = node.kind(db);
15077 assert_eq!(
15078 kind,
15079 SyntaxKind::ItemExternType,
15080 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15081 kind,
15082 SyntaxKind::ItemExternType
15083 );
15084 Self { node }
15085 }
15086 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15087 let kind = node.kind(db);
15088 if kind == SyntaxKind::ItemExternType {
15089 Some(Self::from_syntax_node(db, node))
15090 } else {
15091 None
15092 }
15093 }
15094 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15095 self.node
15096 }
15097 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15098 ItemExternTypePtr(self.node.stable_ptr(db))
15099 }
15100}
15101#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15102pub struct ItemTrait<'db> {
15103 node: SyntaxNode<'db>,
15104}
15105impl<'db> ItemTrait<'db> {
15106 pub const INDEX_ATTRIBUTES: usize = 0;
15107 pub const INDEX_VISIBILITY: usize = 1;
15108 pub const INDEX_TRAIT_KW: usize = 2;
15109 pub const INDEX_NAME: usize = 3;
15110 pub const INDEX_GENERIC_PARAMS: usize = 4;
15111 pub const INDEX_BODY: usize = 5;
15112 pub fn new_green(
15113 db: &'db dyn Database,
15114 attributes: AttributeListGreen<'db>,
15115 visibility: VisibilityGreen<'db>,
15116 trait_kw: TerminalTraitGreen<'db>,
15117 name: TerminalIdentifierGreen<'db>,
15118 generic_params: OptionWrappedGenericParamListGreen<'db>,
15119 body: MaybeTraitBodyGreen<'db>,
15120 ) -> ItemTraitGreen<'db> {
15121 let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15122 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15123 ItemTraitGreen(
15124 GreenNode {
15125 kind: SyntaxKind::ItemTrait,
15126 details: GreenNodeDetails::Node { children: children.into(), width },
15127 }
15128 .intern(db),
15129 )
15130 }
15131}
15132impl<'db> ItemTrait<'db> {
15133 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15134 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15135 }
15136 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15137 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15138 }
15139 pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15140 TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15141 }
15142 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15143 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15144 }
15145 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15146 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15147 }
15148 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15149 MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15150 }
15151}
15152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15153pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15154impl<'db> ItemTraitPtr<'db> {
15155 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15156 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15157 }
15158}
15159impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15160 type SyntaxNode = ItemTrait<'db>;
15161 fn untyped(self) -> SyntaxStablePtrId<'db> {
15162 self.0
15163 }
15164 fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15165 ItemTrait::from_syntax_node(db, self.0.lookup(db))
15166 }
15167}
15168impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15169 fn from(ptr: ItemTraitPtr<'db>) -> Self {
15170 ptr.untyped()
15171 }
15172}
15173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15174pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15175impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15176 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15177 type StablePtr = ItemTraitPtr<'db>;
15178 type Green = ItemTraitGreen<'db>;
15179 fn missing(db: &'db dyn Database) -> Self::Green {
15180 ItemTraitGreen(
15181 GreenNode {
15182 kind: SyntaxKind::ItemTrait,
15183 details: GreenNodeDetails::Node {
15184 children: [
15185 AttributeList::missing(db).0,
15186 Visibility::missing(db).0,
15187 TerminalTrait::missing(db).0,
15188 TerminalIdentifier::missing(db).0,
15189 OptionWrappedGenericParamList::missing(db).0,
15190 MaybeTraitBody::missing(db).0,
15191 ]
15192 .into(),
15193 width: TextWidth::default(),
15194 },
15195 }
15196 .intern(db),
15197 )
15198 }
15199 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15200 let kind = node.kind(db);
15201 assert_eq!(
15202 kind,
15203 SyntaxKind::ItemTrait,
15204 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15205 kind,
15206 SyntaxKind::ItemTrait
15207 );
15208 Self { node }
15209 }
15210 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15211 let kind = node.kind(db);
15212 if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15213 }
15214 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15215 self.node
15216 }
15217 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15218 ItemTraitPtr(self.node.stable_ptr(db))
15219 }
15220}
15221#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15222pub enum MaybeTraitBody<'db> {
15223 Some(TraitBody<'db>),
15224 None(TerminalSemicolon<'db>),
15225}
15226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15227pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15228impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15229 type SyntaxNode = MaybeTraitBody<'db>;
15230 fn untyped(self) -> SyntaxStablePtrId<'db> {
15231 self.0
15232 }
15233 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15234 MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15235 }
15236}
15237impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15238 fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15239 ptr.untyped()
15240 }
15241}
15242impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15243 fn from(value: TraitBodyPtr<'db>) -> Self {
15244 Self(value.0)
15245 }
15246}
15247impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15248 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15249 Self(value.0)
15250 }
15251}
15252impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15253 fn from(value: TraitBodyGreen<'db>) -> Self {
15254 Self(value.0)
15255 }
15256}
15257impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15258 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15259 Self(value.0)
15260 }
15261}
15262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15263pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15264impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15265 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15266 type StablePtr = MaybeTraitBodyPtr<'db>;
15267 type Green = MaybeTraitBodyGreen<'db>;
15268 fn missing(db: &'db dyn Database) -> Self::Green {
15269 panic!("No missing variant.");
15270 }
15271 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15272 let kind = node.kind(db);
15273 match kind {
15274 SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15275 SyntaxKind::TerminalSemicolon => {
15276 MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15277 }
15278 _ => {
15279 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15280 }
15281 }
15282 }
15283 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15284 let kind = node.kind(db);
15285 match kind {
15286 SyntaxKind::TraitBody => {
15287 Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15288 }
15289 SyntaxKind::TerminalSemicolon => {
15290 Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15291 }
15292 _ => None,
15293 }
15294 }
15295 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15296 match self {
15297 MaybeTraitBody::Some(x) => x.as_syntax_node(),
15298 MaybeTraitBody::None(x) => x.as_syntax_node(),
15299 }
15300 }
15301 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15302 MaybeTraitBodyPtr(self.as_syntax_node().stable_ptr(db))
15303 }
15304}
15305impl<'db> MaybeTraitBody<'db> {
15306 pub fn is_variant(kind: SyntaxKind) -> bool {
15308 matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15309 }
15310}
15311#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15312pub struct TraitBody<'db> {
15313 node: SyntaxNode<'db>,
15314}
15315impl<'db> TraitBody<'db> {
15316 pub const INDEX_LBRACE: usize = 0;
15317 pub const INDEX_ITEMS: usize = 1;
15318 pub const INDEX_RBRACE: usize = 2;
15319 pub fn new_green(
15320 db: &'db dyn Database,
15321 lbrace: TerminalLBraceGreen<'db>,
15322 items: TraitItemListGreen<'db>,
15323 rbrace: TerminalRBraceGreen<'db>,
15324 ) -> TraitBodyGreen<'db> {
15325 let children = [lbrace.0, items.0, rbrace.0];
15326 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15327 TraitBodyGreen(
15328 GreenNode {
15329 kind: SyntaxKind::TraitBody,
15330 details: GreenNodeDetails::Node { children: children.into(), width },
15331 }
15332 .intern(db),
15333 )
15334 }
15335}
15336impl<'db> TraitBody<'db> {
15337 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15338 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15339 }
15340 pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15341 TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15342 }
15343 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15344 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15345 }
15346}
15347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15348pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15349impl<'db> TraitBodyPtr<'db> {}
15350impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15351 type SyntaxNode = TraitBody<'db>;
15352 fn untyped(self) -> SyntaxStablePtrId<'db> {
15353 self.0
15354 }
15355 fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15356 TraitBody::from_syntax_node(db, self.0.lookup(db))
15357 }
15358}
15359impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15360 fn from(ptr: TraitBodyPtr<'db>) -> Self {
15361 ptr.untyped()
15362 }
15363}
15364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15365pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15366impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15367 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15368 type StablePtr = TraitBodyPtr<'db>;
15369 type Green = TraitBodyGreen<'db>;
15370 fn missing(db: &'db dyn Database) -> Self::Green {
15371 TraitBodyGreen(
15372 GreenNode {
15373 kind: SyntaxKind::TraitBody,
15374 details: GreenNodeDetails::Node {
15375 children: [
15376 TerminalLBrace::missing(db).0,
15377 TraitItemList::missing(db).0,
15378 TerminalRBrace::missing(db).0,
15379 ]
15380 .into(),
15381 width: TextWidth::default(),
15382 },
15383 }
15384 .intern(db),
15385 )
15386 }
15387 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15388 let kind = node.kind(db);
15389 assert_eq!(
15390 kind,
15391 SyntaxKind::TraitBody,
15392 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15393 kind,
15394 SyntaxKind::TraitBody
15395 );
15396 Self { node }
15397 }
15398 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15399 let kind = node.kind(db);
15400 if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15401 }
15402 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15403 self.node
15404 }
15405 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15406 TraitBodyPtr(self.node.stable_ptr(db))
15407 }
15408}
15409#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15410pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15411impl<'db> Deref for TraitItemList<'db> {
15412 type Target = ElementList<'db, TraitItem<'db>, 1>;
15413 fn deref(&self) -> &Self::Target {
15414 &self.0
15415 }
15416}
15417impl<'db> TraitItemList<'db> {
15418 pub fn new_green(
15419 db: &'db dyn Database,
15420 children: &[TraitItemGreen<'db>],
15421 ) -> TraitItemListGreen<'db> {
15422 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15423 TraitItemListGreen(
15424 GreenNode {
15425 kind: SyntaxKind::TraitItemList,
15426 details: GreenNodeDetails::Node {
15427 children: children.iter().map(|x| x.0).collect(),
15428 width,
15429 },
15430 }
15431 .intern(db),
15432 )
15433 }
15434}
15435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15436pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15437impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15438 type SyntaxNode = TraitItemList<'db>;
15439 fn untyped(self) -> SyntaxStablePtrId<'db> {
15440 self.0
15441 }
15442 fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15443 TraitItemList::from_syntax_node(db, self.0.lookup(db))
15444 }
15445}
15446impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15447 fn from(ptr: TraitItemListPtr<'db>) -> Self {
15448 ptr.untyped()
15449 }
15450}
15451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15452pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15453impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15454 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15455 type StablePtr = TraitItemListPtr<'db>;
15456 type Green = TraitItemListGreen<'db>;
15457 fn missing(db: &'db dyn Database) -> Self::Green {
15458 TraitItemListGreen(
15459 GreenNode {
15460 kind: SyntaxKind::TraitItemList,
15461 details: GreenNodeDetails::Node {
15462 children: [].into(),
15463 width: TextWidth::default(),
15464 },
15465 }
15466 .intern(db),
15467 )
15468 }
15469 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15470 Self(ElementList::new(node))
15471 }
15472 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15473 if node.kind(db) == SyntaxKind::TraitItemList {
15474 Some(Self(ElementList::new(node)))
15475 } else {
15476 None
15477 }
15478 }
15479 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15480 self.node
15481 }
15482 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15483 TraitItemListPtr(self.node.stable_ptr(db))
15484 }
15485}
15486#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15487pub enum TraitItem<'db> {
15488 Function(TraitItemFunction<'db>),
15489 Type(TraitItemType<'db>),
15490 Constant(TraitItemConstant<'db>),
15491 Impl(TraitItemImpl<'db>),
15492 Missing(TraitItemMissing<'db>),
15493}
15494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15495pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15496impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15497 type SyntaxNode = TraitItem<'db>;
15498 fn untyped(self) -> SyntaxStablePtrId<'db> {
15499 self.0
15500 }
15501 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15502 TraitItem::from_syntax_node(db, self.0.lookup(db))
15503 }
15504}
15505impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15506 fn from(ptr: TraitItemPtr<'db>) -> Self {
15507 ptr.untyped()
15508 }
15509}
15510impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15511 fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15512 Self(value.0)
15513 }
15514}
15515impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15516 fn from(value: TraitItemTypePtr<'db>) -> Self {
15517 Self(value.0)
15518 }
15519}
15520impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15521 fn from(value: TraitItemConstantPtr<'db>) -> Self {
15522 Self(value.0)
15523 }
15524}
15525impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15526 fn from(value: TraitItemImplPtr<'db>) -> Self {
15527 Self(value.0)
15528 }
15529}
15530impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15531 fn from(value: TraitItemMissingPtr<'db>) -> Self {
15532 Self(value.0)
15533 }
15534}
15535impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15536 fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15537 Self(value.0)
15538 }
15539}
15540impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15541 fn from(value: TraitItemTypeGreen<'db>) -> Self {
15542 Self(value.0)
15543 }
15544}
15545impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15546 fn from(value: TraitItemConstantGreen<'db>) -> Self {
15547 Self(value.0)
15548 }
15549}
15550impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15551 fn from(value: TraitItemImplGreen<'db>) -> Self {
15552 Self(value.0)
15553 }
15554}
15555impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15556 fn from(value: TraitItemMissingGreen<'db>) -> Self {
15557 Self(value.0)
15558 }
15559}
15560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15561pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15562impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15563 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15564 type StablePtr = TraitItemPtr<'db>;
15565 type Green = TraitItemGreen<'db>;
15566 fn missing(db: &'db dyn Database) -> Self::Green {
15567 TraitItemGreen(TraitItemMissing::missing(db).0)
15568 }
15569 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15570 let kind = node.kind(db);
15571 match kind {
15572 SyntaxKind::TraitItemFunction => {
15573 TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15574 }
15575 SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15576 SyntaxKind::TraitItemConstant => {
15577 TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15578 }
15579 SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15580 SyntaxKind::TraitItemMissing => {
15581 TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15582 }
15583 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15584 }
15585 }
15586 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15587 let kind = node.kind(db);
15588 match kind {
15589 SyntaxKind::TraitItemFunction => {
15590 Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15591 }
15592 SyntaxKind::TraitItemType => {
15593 Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15594 }
15595 SyntaxKind::TraitItemConstant => {
15596 Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15597 }
15598 SyntaxKind::TraitItemImpl => {
15599 Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15600 }
15601 SyntaxKind::TraitItemMissing => {
15602 Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15603 }
15604 _ => None,
15605 }
15606 }
15607 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15608 match self {
15609 TraitItem::Function(x) => x.as_syntax_node(),
15610 TraitItem::Type(x) => x.as_syntax_node(),
15611 TraitItem::Constant(x) => x.as_syntax_node(),
15612 TraitItem::Impl(x) => x.as_syntax_node(),
15613 TraitItem::Missing(x) => x.as_syntax_node(),
15614 }
15615 }
15616 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15617 TraitItemPtr(self.as_syntax_node().stable_ptr(db))
15618 }
15619}
15620impl<'db> TraitItem<'db> {
15621 pub fn is_variant(kind: SyntaxKind) -> bool {
15623 matches!(
15624 kind,
15625 SyntaxKind::TraitItemFunction
15626 | SyntaxKind::TraitItemType
15627 | SyntaxKind::TraitItemConstant
15628 | SyntaxKind::TraitItemImpl
15629 | SyntaxKind::TraitItemMissing
15630 )
15631 }
15632}
15633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15634pub struct TraitItemMissing<'db> {
15635 node: SyntaxNode<'db>,
15636}
15637impl<'db> TraitItemMissing<'db> {
15638 pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15639 let children = [];
15640 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15641 TraitItemMissingGreen(
15642 GreenNode {
15643 kind: SyntaxKind::TraitItemMissing,
15644 details: GreenNodeDetails::Node { children: children.into(), width },
15645 }
15646 .intern(db),
15647 )
15648 }
15649}
15650impl<'db> TraitItemMissing<'db> {}
15651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15652pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15653impl<'db> TraitItemMissingPtr<'db> {}
15654impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15655 type SyntaxNode = TraitItemMissing<'db>;
15656 fn untyped(self) -> SyntaxStablePtrId<'db> {
15657 self.0
15658 }
15659 fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15660 TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15661 }
15662}
15663impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15664 fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15665 ptr.untyped()
15666 }
15667}
15668#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15669pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15670impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15671 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15672 type StablePtr = TraitItemMissingPtr<'db>;
15673 type Green = TraitItemMissingGreen<'db>;
15674 fn missing(db: &'db dyn Database) -> Self::Green {
15675 TraitItemMissingGreen(
15676 GreenNode {
15677 kind: SyntaxKind::TraitItemMissing,
15678 details: GreenNodeDetails::Node {
15679 children: [].into(),
15680 width: TextWidth::default(),
15681 },
15682 }
15683 .intern(db),
15684 )
15685 }
15686 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15687 let kind = node.kind(db);
15688 assert_eq!(
15689 kind,
15690 SyntaxKind::TraitItemMissing,
15691 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15692 kind,
15693 SyntaxKind::TraitItemMissing
15694 );
15695 Self { node }
15696 }
15697 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15698 let kind = node.kind(db);
15699 if kind == SyntaxKind::TraitItemMissing {
15700 Some(Self::from_syntax_node(db, node))
15701 } else {
15702 None
15703 }
15704 }
15705 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15706 self.node
15707 }
15708 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15709 TraitItemMissingPtr(self.node.stable_ptr(db))
15710 }
15711}
15712#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15713pub struct TraitItemFunction<'db> {
15714 node: SyntaxNode<'db>,
15715}
15716impl<'db> TraitItemFunction<'db> {
15717 pub const INDEX_ATTRIBUTES: usize = 0;
15718 pub const INDEX_DECLARATION: usize = 1;
15719 pub const INDEX_BODY: usize = 2;
15720 pub fn new_green(
15721 db: &'db dyn Database,
15722 attributes: AttributeListGreen<'db>,
15723 declaration: FunctionDeclarationGreen<'db>,
15724 body: MaybeTraitFunctionBodyGreen<'db>,
15725 ) -> TraitItemFunctionGreen<'db> {
15726 let children = [attributes.0, declaration.0, body.0];
15727 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15728 TraitItemFunctionGreen(
15729 GreenNode {
15730 kind: SyntaxKind::TraitItemFunction,
15731 details: GreenNodeDetails::Node { children: children.into(), width },
15732 }
15733 .intern(db),
15734 )
15735 }
15736}
15737impl<'db> TraitItemFunction<'db> {
15738 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15739 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15740 }
15741 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15742 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15743 }
15744 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15745 MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15746 }
15747}
15748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15749pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15750impl<'db> TraitItemFunctionPtr<'db> {
15751 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15752 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
15753 }
15754}
15755impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15756 type SyntaxNode = TraitItemFunction<'db>;
15757 fn untyped(self) -> SyntaxStablePtrId<'db> {
15758 self.0
15759 }
15760 fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15761 TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15762 }
15763}
15764impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15765 fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15766 ptr.untyped()
15767 }
15768}
15769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15770pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15771impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15772 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15773 type StablePtr = TraitItemFunctionPtr<'db>;
15774 type Green = TraitItemFunctionGreen<'db>;
15775 fn missing(db: &'db dyn Database) -> Self::Green {
15776 TraitItemFunctionGreen(
15777 GreenNode {
15778 kind: SyntaxKind::TraitItemFunction,
15779 details: GreenNodeDetails::Node {
15780 children: [
15781 AttributeList::missing(db).0,
15782 FunctionDeclaration::missing(db).0,
15783 MaybeTraitFunctionBody::missing(db).0,
15784 ]
15785 .into(),
15786 width: TextWidth::default(),
15787 },
15788 }
15789 .intern(db),
15790 )
15791 }
15792 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15793 let kind = node.kind(db);
15794 assert_eq!(
15795 kind,
15796 SyntaxKind::TraitItemFunction,
15797 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15798 kind,
15799 SyntaxKind::TraitItemFunction
15800 );
15801 Self { node }
15802 }
15803 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15804 let kind = node.kind(db);
15805 if kind == SyntaxKind::TraitItemFunction {
15806 Some(Self::from_syntax_node(db, node))
15807 } else {
15808 None
15809 }
15810 }
15811 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15812 self.node
15813 }
15814 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15815 TraitItemFunctionPtr(self.node.stable_ptr(db))
15816 }
15817}
15818#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15819pub struct TraitItemType<'db> {
15820 node: SyntaxNode<'db>,
15821}
15822impl<'db> TraitItemType<'db> {
15823 pub const INDEX_ATTRIBUTES: usize = 0;
15824 pub const INDEX_TYPE_KW: usize = 1;
15825 pub const INDEX_NAME: usize = 2;
15826 pub const INDEX_GENERIC_PARAMS: usize = 3;
15827 pub const INDEX_SEMICOLON: usize = 4;
15828 pub fn new_green(
15829 db: &'db dyn Database,
15830 attributes: AttributeListGreen<'db>,
15831 type_kw: TerminalTypeGreen<'db>,
15832 name: TerminalIdentifierGreen<'db>,
15833 generic_params: OptionWrappedGenericParamListGreen<'db>,
15834 semicolon: TerminalSemicolonGreen<'db>,
15835 ) -> TraitItemTypeGreen<'db> {
15836 let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15837 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15838 TraitItemTypeGreen(
15839 GreenNode {
15840 kind: SyntaxKind::TraitItemType,
15841 details: GreenNodeDetails::Node { children: children.into(), width },
15842 }
15843 .intern(db),
15844 )
15845 }
15846}
15847impl<'db> TraitItemType<'db> {
15848 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15849 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15850 }
15851 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15852 TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15853 }
15854 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15855 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15856 }
15857 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15858 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15859 }
15860 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15861 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15862 }
15863}
15864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15865pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15866impl<'db> TraitItemTypePtr<'db> {
15867 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15868 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15869 }
15870}
15871impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
15872 type SyntaxNode = TraitItemType<'db>;
15873 fn untyped(self) -> SyntaxStablePtrId<'db> {
15874 self.0
15875 }
15876 fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
15877 TraitItemType::from_syntax_node(db, self.0.lookup(db))
15878 }
15879}
15880impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
15881 fn from(ptr: TraitItemTypePtr<'db>) -> Self {
15882 ptr.untyped()
15883 }
15884}
15885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15886pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
15887impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
15888 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
15889 type StablePtr = TraitItemTypePtr<'db>;
15890 type Green = TraitItemTypeGreen<'db>;
15891 fn missing(db: &'db dyn Database) -> Self::Green {
15892 TraitItemTypeGreen(
15893 GreenNode {
15894 kind: SyntaxKind::TraitItemType,
15895 details: GreenNodeDetails::Node {
15896 children: [
15897 AttributeList::missing(db).0,
15898 TerminalType::missing(db).0,
15899 TerminalIdentifier::missing(db).0,
15900 OptionWrappedGenericParamList::missing(db).0,
15901 TerminalSemicolon::missing(db).0,
15902 ]
15903 .into(),
15904 width: TextWidth::default(),
15905 },
15906 }
15907 .intern(db),
15908 )
15909 }
15910 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15911 let kind = node.kind(db);
15912 assert_eq!(
15913 kind,
15914 SyntaxKind::TraitItemType,
15915 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15916 kind,
15917 SyntaxKind::TraitItemType
15918 );
15919 Self { node }
15920 }
15921 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15922 let kind = node.kind(db);
15923 if kind == SyntaxKind::TraitItemType {
15924 Some(Self::from_syntax_node(db, node))
15925 } else {
15926 None
15927 }
15928 }
15929 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15930 self.node
15931 }
15932 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15933 TraitItemTypePtr(self.node.stable_ptr(db))
15934 }
15935}
15936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15937pub struct TraitItemConstant<'db> {
15938 node: SyntaxNode<'db>,
15939}
15940impl<'db> TraitItemConstant<'db> {
15941 pub const INDEX_ATTRIBUTES: usize = 0;
15942 pub const INDEX_CONST_KW: usize = 1;
15943 pub const INDEX_NAME: usize = 2;
15944 pub const INDEX_TYPE_CLAUSE: usize = 3;
15945 pub const INDEX_SEMICOLON: usize = 4;
15946 pub fn new_green(
15947 db: &'db dyn Database,
15948 attributes: AttributeListGreen<'db>,
15949 const_kw: TerminalConstGreen<'db>,
15950 name: TerminalIdentifierGreen<'db>,
15951 type_clause: TypeClauseGreen<'db>,
15952 semicolon: TerminalSemicolonGreen<'db>,
15953 ) -> TraitItemConstantGreen<'db> {
15954 let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
15955 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15956 TraitItemConstantGreen(
15957 GreenNode {
15958 kind: SyntaxKind::TraitItemConstant,
15959 details: GreenNodeDetails::Node { children: children.into(), width },
15960 }
15961 .intern(db),
15962 )
15963 }
15964}
15965impl<'db> TraitItemConstant<'db> {
15966 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15967 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15968 }
15969 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
15970 TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
15971 }
15972 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15973 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15974 }
15975 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
15976 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
15977 }
15978 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15979 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15980 }
15981}
15982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15983pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
15984impl<'db> TraitItemConstantPtr<'db> {
15985 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15986 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15987 }
15988}
15989impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
15990 type SyntaxNode = TraitItemConstant<'db>;
15991 fn untyped(self) -> SyntaxStablePtrId<'db> {
15992 self.0
15993 }
15994 fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
15995 TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
15996 }
15997}
15998impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
15999 fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16000 ptr.untyped()
16001 }
16002}
16003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16004pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16005impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16006 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16007 type StablePtr = TraitItemConstantPtr<'db>;
16008 type Green = TraitItemConstantGreen<'db>;
16009 fn missing(db: &'db dyn Database) -> Self::Green {
16010 TraitItemConstantGreen(
16011 GreenNode {
16012 kind: SyntaxKind::TraitItemConstant,
16013 details: GreenNodeDetails::Node {
16014 children: [
16015 AttributeList::missing(db).0,
16016 TerminalConst::missing(db).0,
16017 TerminalIdentifier::missing(db).0,
16018 TypeClause::missing(db).0,
16019 TerminalSemicolon::missing(db).0,
16020 ]
16021 .into(),
16022 width: TextWidth::default(),
16023 },
16024 }
16025 .intern(db),
16026 )
16027 }
16028 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16029 let kind = node.kind(db);
16030 assert_eq!(
16031 kind,
16032 SyntaxKind::TraitItemConstant,
16033 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16034 kind,
16035 SyntaxKind::TraitItemConstant
16036 );
16037 Self { node }
16038 }
16039 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16040 let kind = node.kind(db);
16041 if kind == SyntaxKind::TraitItemConstant {
16042 Some(Self::from_syntax_node(db, node))
16043 } else {
16044 None
16045 }
16046 }
16047 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16048 self.node
16049 }
16050 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16051 TraitItemConstantPtr(self.node.stable_ptr(db))
16052 }
16053}
16054#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16055pub struct TraitItemImpl<'db> {
16056 node: SyntaxNode<'db>,
16057}
16058impl<'db> TraitItemImpl<'db> {
16059 pub const INDEX_ATTRIBUTES: usize = 0;
16060 pub const INDEX_IMPL_KW: usize = 1;
16061 pub const INDEX_NAME: usize = 2;
16062 pub const INDEX_COLON: usize = 3;
16063 pub const INDEX_TRAIT_PATH: usize = 4;
16064 pub const INDEX_SEMICOLON: usize = 5;
16065 pub fn new_green(
16066 db: &'db dyn Database,
16067 attributes: AttributeListGreen<'db>,
16068 impl_kw: TerminalImplGreen<'db>,
16069 name: TerminalIdentifierGreen<'db>,
16070 colon: TerminalColonGreen<'db>,
16071 trait_path: ExprPathGreen<'db>,
16072 semicolon: TerminalSemicolonGreen<'db>,
16073 ) -> TraitItemImplGreen<'db> {
16074 let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16075 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16076 TraitItemImplGreen(
16077 GreenNode {
16078 kind: SyntaxKind::TraitItemImpl,
16079 details: GreenNodeDetails::Node { children: children.into(), width },
16080 }
16081 .intern(db),
16082 )
16083 }
16084}
16085impl<'db> TraitItemImpl<'db> {
16086 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16087 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16088 }
16089 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16090 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16091 }
16092 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16093 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16094 }
16095 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16096 TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16097 }
16098 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16099 ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16100 }
16101 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16102 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16103 }
16104}
16105#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16106pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16107impl<'db> TraitItemImplPtr<'db> {
16108 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16109 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16110 }
16111}
16112impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16113 type SyntaxNode = TraitItemImpl<'db>;
16114 fn untyped(self) -> SyntaxStablePtrId<'db> {
16115 self.0
16116 }
16117 fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16118 TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16119 }
16120}
16121impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16122 fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16123 ptr.untyped()
16124 }
16125}
16126#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16127pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16128impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16129 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16130 type StablePtr = TraitItemImplPtr<'db>;
16131 type Green = TraitItemImplGreen<'db>;
16132 fn missing(db: &'db dyn Database) -> Self::Green {
16133 TraitItemImplGreen(
16134 GreenNode {
16135 kind: SyntaxKind::TraitItemImpl,
16136 details: GreenNodeDetails::Node {
16137 children: [
16138 AttributeList::missing(db).0,
16139 TerminalImpl::missing(db).0,
16140 TerminalIdentifier::missing(db).0,
16141 TerminalColon::missing(db).0,
16142 ExprPath::missing(db).0,
16143 TerminalSemicolon::missing(db).0,
16144 ]
16145 .into(),
16146 width: TextWidth::default(),
16147 },
16148 }
16149 .intern(db),
16150 )
16151 }
16152 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16153 let kind = node.kind(db);
16154 assert_eq!(
16155 kind,
16156 SyntaxKind::TraitItemImpl,
16157 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16158 kind,
16159 SyntaxKind::TraitItemImpl
16160 );
16161 Self { node }
16162 }
16163 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16164 let kind = node.kind(db);
16165 if kind == SyntaxKind::TraitItemImpl {
16166 Some(Self::from_syntax_node(db, node))
16167 } else {
16168 None
16169 }
16170 }
16171 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16172 self.node
16173 }
16174 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16175 TraitItemImplPtr(self.node.stable_ptr(db))
16176 }
16177}
16178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16179pub enum MaybeTraitFunctionBody<'db> {
16180 Some(ExprBlock<'db>),
16181 None(TerminalSemicolon<'db>),
16182}
16183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16184pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16185impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16186 type SyntaxNode = MaybeTraitFunctionBody<'db>;
16187 fn untyped(self) -> SyntaxStablePtrId<'db> {
16188 self.0
16189 }
16190 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16191 MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16192 }
16193}
16194impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16195 fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16196 ptr.untyped()
16197 }
16198}
16199impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16200 fn from(value: ExprBlockPtr<'db>) -> Self {
16201 Self(value.0)
16202 }
16203}
16204impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16205 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16206 Self(value.0)
16207 }
16208}
16209impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16210 fn from(value: ExprBlockGreen<'db>) -> Self {
16211 Self(value.0)
16212 }
16213}
16214impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16215 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16216 Self(value.0)
16217 }
16218}
16219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16220pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16221impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16222 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16223 type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16224 type Green = MaybeTraitFunctionBodyGreen<'db>;
16225 fn missing(db: &'db dyn Database) -> Self::Green {
16226 panic!("No missing variant.");
16227 }
16228 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16229 let kind = node.kind(db);
16230 match kind {
16231 SyntaxKind::ExprBlock => {
16232 MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16233 }
16234 SyntaxKind::TerminalSemicolon => {
16235 MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16236 }
16237 _ => panic!(
16238 "Unexpected syntax kind {:?} when constructing {}.",
16239 kind, "MaybeTraitFunctionBody"
16240 ),
16241 }
16242 }
16243 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16244 let kind = node.kind(db);
16245 match kind {
16246 SyntaxKind::ExprBlock => {
16247 Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16248 }
16249 SyntaxKind::TerminalSemicolon => {
16250 Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16251 }
16252 _ => None,
16253 }
16254 }
16255 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16256 match self {
16257 MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16258 MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16259 }
16260 }
16261 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16262 MaybeTraitFunctionBodyPtr(self.as_syntax_node().stable_ptr(db))
16263 }
16264}
16265impl<'db> MaybeTraitFunctionBody<'db> {
16266 pub fn is_variant(kind: SyntaxKind) -> bool {
16268 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16269 }
16270}
16271#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16272pub struct ItemImpl<'db> {
16273 node: SyntaxNode<'db>,
16274}
16275impl<'db> ItemImpl<'db> {
16276 pub const INDEX_ATTRIBUTES: usize = 0;
16277 pub const INDEX_VISIBILITY: usize = 1;
16278 pub const INDEX_IMPL_KW: usize = 2;
16279 pub const INDEX_NAME: usize = 3;
16280 pub const INDEX_GENERIC_PARAMS: usize = 4;
16281 pub const INDEX_OF_KW: usize = 5;
16282 pub const INDEX_TRAIT_PATH: usize = 6;
16283 pub const INDEX_BODY: usize = 7;
16284 pub fn new_green(
16285 db: &'db dyn Database,
16286 attributes: AttributeListGreen<'db>,
16287 visibility: VisibilityGreen<'db>,
16288 impl_kw: TerminalImplGreen<'db>,
16289 name: TerminalIdentifierGreen<'db>,
16290 generic_params: OptionWrappedGenericParamListGreen<'db>,
16291 of_kw: TerminalOfGreen<'db>,
16292 trait_path: ExprPathGreen<'db>,
16293 body: MaybeImplBodyGreen<'db>,
16294 ) -> ItemImplGreen<'db> {
16295 let children = [
16296 attributes.0,
16297 visibility.0,
16298 impl_kw.0,
16299 name.0,
16300 generic_params.0,
16301 of_kw.0,
16302 trait_path.0,
16303 body.0,
16304 ];
16305 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16306 ItemImplGreen(
16307 GreenNode {
16308 kind: SyntaxKind::ItemImpl,
16309 details: GreenNodeDetails::Node { children: children.into(), width },
16310 }
16311 .intern(db),
16312 )
16313 }
16314}
16315impl<'db> ItemImpl<'db> {
16316 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16317 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16318 }
16319 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16320 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16321 }
16322 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16323 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16324 }
16325 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16326 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16327 }
16328 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16329 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16330 }
16331 pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16332 TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16333 }
16334 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16335 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16336 }
16337 pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16338 MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16339 }
16340}
16341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16342pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16343impl<'db> ItemImplPtr<'db> {
16344 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16345 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16346 }
16347}
16348impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16349 type SyntaxNode = ItemImpl<'db>;
16350 fn untyped(self) -> SyntaxStablePtrId<'db> {
16351 self.0
16352 }
16353 fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16354 ItemImpl::from_syntax_node(db, self.0.lookup(db))
16355 }
16356}
16357impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16358 fn from(ptr: ItemImplPtr<'db>) -> Self {
16359 ptr.untyped()
16360 }
16361}
16362#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16363pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16364impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16365 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16366 type StablePtr = ItemImplPtr<'db>;
16367 type Green = ItemImplGreen<'db>;
16368 fn missing(db: &'db dyn Database) -> Self::Green {
16369 ItemImplGreen(
16370 GreenNode {
16371 kind: SyntaxKind::ItemImpl,
16372 details: GreenNodeDetails::Node {
16373 children: [
16374 AttributeList::missing(db).0,
16375 Visibility::missing(db).0,
16376 TerminalImpl::missing(db).0,
16377 TerminalIdentifier::missing(db).0,
16378 OptionWrappedGenericParamList::missing(db).0,
16379 TerminalOf::missing(db).0,
16380 ExprPath::missing(db).0,
16381 MaybeImplBody::missing(db).0,
16382 ]
16383 .into(),
16384 width: TextWidth::default(),
16385 },
16386 }
16387 .intern(db),
16388 )
16389 }
16390 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16391 let kind = node.kind(db);
16392 assert_eq!(
16393 kind,
16394 SyntaxKind::ItemImpl,
16395 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16396 kind,
16397 SyntaxKind::ItemImpl
16398 );
16399 Self { node }
16400 }
16401 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16402 let kind = node.kind(db);
16403 if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16404 }
16405 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16406 self.node
16407 }
16408 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16409 ItemImplPtr(self.node.stable_ptr(db))
16410 }
16411}
16412#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16413pub struct ItemHeaderDoc<'db> {
16414 node: SyntaxNode<'db>,
16415}
16416impl<'db> ItemHeaderDoc<'db> {
16417 pub const INDEX_EMPTY: usize = 0;
16418 pub fn new_green(
16419 db: &'db dyn Database,
16420 empty: TerminalEmptyGreen<'db>,
16421 ) -> ItemHeaderDocGreen<'db> {
16422 let children = [empty.0];
16423 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16424 ItemHeaderDocGreen(
16425 GreenNode {
16426 kind: SyntaxKind::ItemHeaderDoc,
16427 details: GreenNodeDetails::Node { children: children.into(), width },
16428 }
16429 .intern(db),
16430 )
16431 }
16432}
16433impl<'db> ItemHeaderDoc<'db> {
16434 pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16435 TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16436 }
16437}
16438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16439pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16440impl<'db> ItemHeaderDocPtr<'db> {}
16441impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16442 type SyntaxNode = ItemHeaderDoc<'db>;
16443 fn untyped(self) -> SyntaxStablePtrId<'db> {
16444 self.0
16445 }
16446 fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16447 ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16448 }
16449}
16450impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16451 fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16452 ptr.untyped()
16453 }
16454}
16455#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16456pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16457impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16458 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16459 type StablePtr = ItemHeaderDocPtr<'db>;
16460 type Green = ItemHeaderDocGreen<'db>;
16461 fn missing(db: &'db dyn Database) -> Self::Green {
16462 ItemHeaderDocGreen(
16463 GreenNode {
16464 kind: SyntaxKind::ItemHeaderDoc,
16465 details: GreenNodeDetails::Node {
16466 children: [TerminalEmpty::missing(db).0].into(),
16467 width: TextWidth::default(),
16468 },
16469 }
16470 .intern(db),
16471 )
16472 }
16473 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16474 let kind = node.kind(db);
16475 assert_eq!(
16476 kind,
16477 SyntaxKind::ItemHeaderDoc,
16478 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16479 kind,
16480 SyntaxKind::ItemHeaderDoc
16481 );
16482 Self { node }
16483 }
16484 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16485 let kind = node.kind(db);
16486 if kind == SyntaxKind::ItemHeaderDoc {
16487 Some(Self::from_syntax_node(db, node))
16488 } else {
16489 None
16490 }
16491 }
16492 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16493 self.node
16494 }
16495 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16496 ItemHeaderDocPtr(self.node.stable_ptr(db))
16497 }
16498}
16499#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16500pub enum MaybeImplBody<'db> {
16501 Some(ImplBody<'db>),
16502 None(TerminalSemicolon<'db>),
16503}
16504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16505pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16506impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16507 type SyntaxNode = MaybeImplBody<'db>;
16508 fn untyped(self) -> SyntaxStablePtrId<'db> {
16509 self.0
16510 }
16511 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16512 MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16513 }
16514}
16515impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16516 fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16517 ptr.untyped()
16518 }
16519}
16520impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16521 fn from(value: ImplBodyPtr<'db>) -> Self {
16522 Self(value.0)
16523 }
16524}
16525impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16526 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16527 Self(value.0)
16528 }
16529}
16530impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16531 fn from(value: ImplBodyGreen<'db>) -> Self {
16532 Self(value.0)
16533 }
16534}
16535impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16536 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16537 Self(value.0)
16538 }
16539}
16540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16541pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16542impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16543 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16544 type StablePtr = MaybeImplBodyPtr<'db>;
16545 type Green = MaybeImplBodyGreen<'db>;
16546 fn missing(db: &'db dyn Database) -> Self::Green {
16547 panic!("No missing variant.");
16548 }
16549 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16550 let kind = node.kind(db);
16551 match kind {
16552 SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16553 SyntaxKind::TerminalSemicolon => {
16554 MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16555 }
16556 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16557 }
16558 }
16559 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16560 let kind = node.kind(db);
16561 match kind {
16562 SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16563 SyntaxKind::TerminalSemicolon => {
16564 Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16565 }
16566 _ => None,
16567 }
16568 }
16569 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16570 match self {
16571 MaybeImplBody::Some(x) => x.as_syntax_node(),
16572 MaybeImplBody::None(x) => x.as_syntax_node(),
16573 }
16574 }
16575 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16576 MaybeImplBodyPtr(self.as_syntax_node().stable_ptr(db))
16577 }
16578}
16579impl<'db> MaybeImplBody<'db> {
16580 pub fn is_variant(kind: SyntaxKind) -> bool {
16582 matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16583 }
16584}
16585#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16586pub struct ImplBody<'db> {
16587 node: SyntaxNode<'db>,
16588}
16589impl<'db> ImplBody<'db> {
16590 pub const INDEX_LBRACE: usize = 0;
16591 pub const INDEX_ITEMS: usize = 1;
16592 pub const INDEX_RBRACE: usize = 2;
16593 pub fn new_green(
16594 db: &'db dyn Database,
16595 lbrace: TerminalLBraceGreen<'db>,
16596 items: ImplItemListGreen<'db>,
16597 rbrace: TerminalRBraceGreen<'db>,
16598 ) -> ImplBodyGreen<'db> {
16599 let children = [lbrace.0, items.0, rbrace.0];
16600 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16601 ImplBodyGreen(
16602 GreenNode {
16603 kind: SyntaxKind::ImplBody,
16604 details: GreenNodeDetails::Node { children: children.into(), width },
16605 }
16606 .intern(db),
16607 )
16608 }
16609}
16610impl<'db> ImplBody<'db> {
16611 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16612 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16613 }
16614 pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16615 ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16616 }
16617 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16618 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16619 }
16620}
16621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16622pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16623impl<'db> ImplBodyPtr<'db> {}
16624impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16625 type SyntaxNode = ImplBody<'db>;
16626 fn untyped(self) -> SyntaxStablePtrId<'db> {
16627 self.0
16628 }
16629 fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16630 ImplBody::from_syntax_node(db, self.0.lookup(db))
16631 }
16632}
16633impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16634 fn from(ptr: ImplBodyPtr<'db>) -> Self {
16635 ptr.untyped()
16636 }
16637}
16638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16639pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16640impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16641 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16642 type StablePtr = ImplBodyPtr<'db>;
16643 type Green = ImplBodyGreen<'db>;
16644 fn missing(db: &'db dyn Database) -> Self::Green {
16645 ImplBodyGreen(
16646 GreenNode {
16647 kind: SyntaxKind::ImplBody,
16648 details: GreenNodeDetails::Node {
16649 children: [
16650 TerminalLBrace::missing(db).0,
16651 ImplItemList::missing(db).0,
16652 TerminalRBrace::missing(db).0,
16653 ]
16654 .into(),
16655 width: TextWidth::default(),
16656 },
16657 }
16658 .intern(db),
16659 )
16660 }
16661 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16662 let kind = node.kind(db);
16663 assert_eq!(
16664 kind,
16665 SyntaxKind::ImplBody,
16666 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16667 kind,
16668 SyntaxKind::ImplBody
16669 );
16670 Self { node }
16671 }
16672 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16673 let kind = node.kind(db);
16674 if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16675 }
16676 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16677 self.node
16678 }
16679 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16680 ImplBodyPtr(self.node.stable_ptr(db))
16681 }
16682}
16683#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16684pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16685impl<'db> Deref for ImplItemList<'db> {
16686 type Target = ElementList<'db, ImplItem<'db>, 1>;
16687 fn deref(&self) -> &Self::Target {
16688 &self.0
16689 }
16690}
16691impl<'db> ImplItemList<'db> {
16692 pub fn new_green(
16693 db: &'db dyn Database,
16694 children: &[ImplItemGreen<'db>],
16695 ) -> ImplItemListGreen<'db> {
16696 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16697 ImplItemListGreen(
16698 GreenNode {
16699 kind: SyntaxKind::ImplItemList,
16700 details: GreenNodeDetails::Node {
16701 children: children.iter().map(|x| x.0).collect(),
16702 width,
16703 },
16704 }
16705 .intern(db),
16706 )
16707 }
16708}
16709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16710pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16711impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16712 type SyntaxNode = ImplItemList<'db>;
16713 fn untyped(self) -> SyntaxStablePtrId<'db> {
16714 self.0
16715 }
16716 fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16717 ImplItemList::from_syntax_node(db, self.0.lookup(db))
16718 }
16719}
16720impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16721 fn from(ptr: ImplItemListPtr<'db>) -> Self {
16722 ptr.untyped()
16723 }
16724}
16725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16726pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16727impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16728 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16729 type StablePtr = ImplItemListPtr<'db>;
16730 type Green = ImplItemListGreen<'db>;
16731 fn missing(db: &'db dyn Database) -> Self::Green {
16732 ImplItemListGreen(
16733 GreenNode {
16734 kind: SyntaxKind::ImplItemList,
16735 details: GreenNodeDetails::Node {
16736 children: [].into(),
16737 width: TextWidth::default(),
16738 },
16739 }
16740 .intern(db),
16741 )
16742 }
16743 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16744 Self(ElementList::new(node))
16745 }
16746 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16747 if node.kind(db) == SyntaxKind::ImplItemList {
16748 Some(Self(ElementList::new(node)))
16749 } else {
16750 None
16751 }
16752 }
16753 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16754 self.node
16755 }
16756 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16757 ImplItemListPtr(self.node.stable_ptr(db))
16758 }
16759}
16760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16761pub enum ImplItem<'db> {
16762 Function(FunctionWithBody<'db>),
16763 Type(ItemTypeAlias<'db>),
16764 Constant(ItemConstant<'db>),
16765 Impl(ItemImplAlias<'db>),
16766 Module(ItemModule<'db>),
16767 Use(ItemUse<'db>),
16768 ExternFunction(ItemExternFunction<'db>),
16769 ExternType(ItemExternType<'db>),
16770 Trait(ItemTrait<'db>),
16771 Struct(ItemStruct<'db>),
16772 Enum(ItemEnum<'db>),
16773 Missing(ImplItemMissing<'db>),
16774}
16775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16776pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16777impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16778 type SyntaxNode = ImplItem<'db>;
16779 fn untyped(self) -> SyntaxStablePtrId<'db> {
16780 self.0
16781 }
16782 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16783 ImplItem::from_syntax_node(db, self.0.lookup(db))
16784 }
16785}
16786impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16787 fn from(ptr: ImplItemPtr<'db>) -> Self {
16788 ptr.untyped()
16789 }
16790}
16791impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16792 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16793 Self(value.0)
16794 }
16795}
16796impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16797 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16798 Self(value.0)
16799 }
16800}
16801impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16802 fn from(value: ItemConstantPtr<'db>) -> Self {
16803 Self(value.0)
16804 }
16805}
16806impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16807 fn from(value: ItemImplAliasPtr<'db>) -> Self {
16808 Self(value.0)
16809 }
16810}
16811impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16812 fn from(value: ItemModulePtr<'db>) -> Self {
16813 Self(value.0)
16814 }
16815}
16816impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16817 fn from(value: ItemUsePtr<'db>) -> Self {
16818 Self(value.0)
16819 }
16820}
16821impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16822 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16823 Self(value.0)
16824 }
16825}
16826impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16827 fn from(value: ItemExternTypePtr<'db>) -> Self {
16828 Self(value.0)
16829 }
16830}
16831impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16832 fn from(value: ItemTraitPtr<'db>) -> Self {
16833 Self(value.0)
16834 }
16835}
16836impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16837 fn from(value: ItemStructPtr<'db>) -> Self {
16838 Self(value.0)
16839 }
16840}
16841impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16842 fn from(value: ItemEnumPtr<'db>) -> Self {
16843 Self(value.0)
16844 }
16845}
16846impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
16847 fn from(value: ImplItemMissingPtr<'db>) -> Self {
16848 Self(value.0)
16849 }
16850}
16851impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
16852 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
16853 Self(value.0)
16854 }
16855}
16856impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
16857 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
16858 Self(value.0)
16859 }
16860}
16861impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
16862 fn from(value: ItemConstantGreen<'db>) -> Self {
16863 Self(value.0)
16864 }
16865}
16866impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
16867 fn from(value: ItemImplAliasGreen<'db>) -> Self {
16868 Self(value.0)
16869 }
16870}
16871impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
16872 fn from(value: ItemModuleGreen<'db>) -> Self {
16873 Self(value.0)
16874 }
16875}
16876impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
16877 fn from(value: ItemUseGreen<'db>) -> Self {
16878 Self(value.0)
16879 }
16880}
16881impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
16882 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
16883 Self(value.0)
16884 }
16885}
16886impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
16887 fn from(value: ItemExternTypeGreen<'db>) -> Self {
16888 Self(value.0)
16889 }
16890}
16891impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
16892 fn from(value: ItemTraitGreen<'db>) -> Self {
16893 Self(value.0)
16894 }
16895}
16896impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
16897 fn from(value: ItemStructGreen<'db>) -> Self {
16898 Self(value.0)
16899 }
16900}
16901impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
16902 fn from(value: ItemEnumGreen<'db>) -> Self {
16903 Self(value.0)
16904 }
16905}
16906impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
16907 fn from(value: ImplItemMissingGreen<'db>) -> Self {
16908 Self(value.0)
16909 }
16910}
16911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16912pub struct ImplItemGreen<'db>(pub GreenId<'db>);
16913impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
16914 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16915 type StablePtr = ImplItemPtr<'db>;
16916 type Green = ImplItemGreen<'db>;
16917 fn missing(db: &'db dyn Database) -> Self::Green {
16918 ImplItemGreen(ImplItemMissing::missing(db).0)
16919 }
16920 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16921 let kind = node.kind(db);
16922 match kind {
16923 SyntaxKind::FunctionWithBody => {
16924 ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
16925 }
16926 SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
16927 SyntaxKind::ItemConstant => {
16928 ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
16929 }
16930 SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
16931 SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
16932 SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
16933 SyntaxKind::ItemExternFunction => {
16934 ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
16935 }
16936 SyntaxKind::ItemExternType => {
16937 ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
16938 }
16939 SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
16940 SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
16941 SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
16942 SyntaxKind::ImplItemMissing => {
16943 ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
16944 }
16945 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
16946 }
16947 }
16948 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16949 let kind = node.kind(db);
16950 match kind {
16951 SyntaxKind::FunctionWithBody => {
16952 Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
16953 }
16954 SyntaxKind::ItemTypeAlias => {
16955 Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
16956 }
16957 SyntaxKind::ItemConstant => {
16958 Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
16959 }
16960 SyntaxKind::ItemImplAlias => {
16961 Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
16962 }
16963 SyntaxKind::ItemModule => {
16964 Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
16965 }
16966 SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
16967 SyntaxKind::ItemExternFunction => {
16968 Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
16969 }
16970 SyntaxKind::ItemExternType => {
16971 Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
16972 }
16973 SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
16974 SyntaxKind::ItemStruct => {
16975 Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
16976 }
16977 SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
16978 SyntaxKind::ImplItemMissing => {
16979 Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
16980 }
16981 _ => None,
16982 }
16983 }
16984 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16985 match self {
16986 ImplItem::Function(x) => x.as_syntax_node(),
16987 ImplItem::Type(x) => x.as_syntax_node(),
16988 ImplItem::Constant(x) => x.as_syntax_node(),
16989 ImplItem::Impl(x) => x.as_syntax_node(),
16990 ImplItem::Module(x) => x.as_syntax_node(),
16991 ImplItem::Use(x) => x.as_syntax_node(),
16992 ImplItem::ExternFunction(x) => x.as_syntax_node(),
16993 ImplItem::ExternType(x) => x.as_syntax_node(),
16994 ImplItem::Trait(x) => x.as_syntax_node(),
16995 ImplItem::Struct(x) => x.as_syntax_node(),
16996 ImplItem::Enum(x) => x.as_syntax_node(),
16997 ImplItem::Missing(x) => x.as_syntax_node(),
16998 }
16999 }
17000 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17001 ImplItemPtr(self.as_syntax_node().stable_ptr(db))
17002 }
17003}
17004impl<'db> ImplItem<'db> {
17005 pub fn is_variant(kind: SyntaxKind) -> bool {
17007 matches!(
17008 kind,
17009 SyntaxKind::FunctionWithBody
17010 | SyntaxKind::ItemTypeAlias
17011 | SyntaxKind::ItemConstant
17012 | SyntaxKind::ItemImplAlias
17013 | SyntaxKind::ItemModule
17014 | SyntaxKind::ItemUse
17015 | SyntaxKind::ItemExternFunction
17016 | SyntaxKind::ItemExternType
17017 | SyntaxKind::ItemTrait
17018 | SyntaxKind::ItemStruct
17019 | SyntaxKind::ItemEnum
17020 | SyntaxKind::ImplItemMissing
17021 )
17022 }
17023}
17024#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17025pub struct ImplItemMissing<'db> {
17026 node: SyntaxNode<'db>,
17027}
17028impl<'db> ImplItemMissing<'db> {
17029 pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17030 let children = [];
17031 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17032 ImplItemMissingGreen(
17033 GreenNode {
17034 kind: SyntaxKind::ImplItemMissing,
17035 details: GreenNodeDetails::Node { children: children.into(), width },
17036 }
17037 .intern(db),
17038 )
17039 }
17040}
17041impl<'db> ImplItemMissing<'db> {}
17042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17043pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17044impl<'db> ImplItemMissingPtr<'db> {}
17045impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17046 type SyntaxNode = ImplItemMissing<'db>;
17047 fn untyped(self) -> SyntaxStablePtrId<'db> {
17048 self.0
17049 }
17050 fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17051 ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17052 }
17053}
17054impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17055 fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17056 ptr.untyped()
17057 }
17058}
17059#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17060pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17061impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17062 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17063 type StablePtr = ImplItemMissingPtr<'db>;
17064 type Green = ImplItemMissingGreen<'db>;
17065 fn missing(db: &'db dyn Database) -> Self::Green {
17066 ImplItemMissingGreen(
17067 GreenNode {
17068 kind: SyntaxKind::ImplItemMissing,
17069 details: GreenNodeDetails::Node {
17070 children: [].into(),
17071 width: TextWidth::default(),
17072 },
17073 }
17074 .intern(db),
17075 )
17076 }
17077 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17078 let kind = node.kind(db);
17079 assert_eq!(
17080 kind,
17081 SyntaxKind::ImplItemMissing,
17082 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17083 kind,
17084 SyntaxKind::ImplItemMissing
17085 );
17086 Self { node }
17087 }
17088 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17089 let kind = node.kind(db);
17090 if kind == SyntaxKind::ImplItemMissing {
17091 Some(Self::from_syntax_node(db, node))
17092 } else {
17093 None
17094 }
17095 }
17096 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17097 self.node
17098 }
17099 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17100 ImplItemMissingPtr(self.node.stable_ptr(db))
17101 }
17102}
17103#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17104pub struct ItemImplAlias<'db> {
17105 node: SyntaxNode<'db>,
17106}
17107impl<'db> ItemImplAlias<'db> {
17108 pub const INDEX_ATTRIBUTES: usize = 0;
17109 pub const INDEX_VISIBILITY: usize = 1;
17110 pub const INDEX_IMPL_KW: usize = 2;
17111 pub const INDEX_NAME: usize = 3;
17112 pub const INDEX_GENERIC_PARAMS: usize = 4;
17113 pub const INDEX_EQ: usize = 5;
17114 pub const INDEX_IMPL_PATH: usize = 6;
17115 pub const INDEX_SEMICOLON: usize = 7;
17116 pub fn new_green(
17117 db: &'db dyn Database,
17118 attributes: AttributeListGreen<'db>,
17119 visibility: VisibilityGreen<'db>,
17120 impl_kw: TerminalImplGreen<'db>,
17121 name: TerminalIdentifierGreen<'db>,
17122 generic_params: OptionWrappedGenericParamListGreen<'db>,
17123 eq: TerminalEqGreen<'db>,
17124 impl_path: ExprPathGreen<'db>,
17125 semicolon: TerminalSemicolonGreen<'db>,
17126 ) -> ItemImplAliasGreen<'db> {
17127 let children = [
17128 attributes.0,
17129 visibility.0,
17130 impl_kw.0,
17131 name.0,
17132 generic_params.0,
17133 eq.0,
17134 impl_path.0,
17135 semicolon.0,
17136 ];
17137 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17138 ItemImplAliasGreen(
17139 GreenNode {
17140 kind: SyntaxKind::ItemImplAlias,
17141 details: GreenNodeDetails::Node { children: children.into(), width },
17142 }
17143 .intern(db),
17144 )
17145 }
17146}
17147impl<'db> ItemImplAlias<'db> {
17148 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17149 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17150 }
17151 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17152 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17153 }
17154 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17155 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17156 }
17157 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17158 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17159 }
17160 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17161 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17162 }
17163 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17164 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17165 }
17166 pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17167 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17168 }
17169 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17170 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17171 }
17172}
17173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17174pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17175impl<'db> ItemImplAliasPtr<'db> {
17176 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17177 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17178 }
17179}
17180impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17181 type SyntaxNode = ItemImplAlias<'db>;
17182 fn untyped(self) -> SyntaxStablePtrId<'db> {
17183 self.0
17184 }
17185 fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17186 ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17187 }
17188}
17189impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17190 fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17191 ptr.untyped()
17192 }
17193}
17194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17195pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17196impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17197 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17198 type StablePtr = ItemImplAliasPtr<'db>;
17199 type Green = ItemImplAliasGreen<'db>;
17200 fn missing(db: &'db dyn Database) -> Self::Green {
17201 ItemImplAliasGreen(
17202 GreenNode {
17203 kind: SyntaxKind::ItemImplAlias,
17204 details: GreenNodeDetails::Node {
17205 children: [
17206 AttributeList::missing(db).0,
17207 Visibility::missing(db).0,
17208 TerminalImpl::missing(db).0,
17209 TerminalIdentifier::missing(db).0,
17210 OptionWrappedGenericParamList::missing(db).0,
17211 TerminalEq::missing(db).0,
17212 ExprPath::missing(db).0,
17213 TerminalSemicolon::missing(db).0,
17214 ]
17215 .into(),
17216 width: TextWidth::default(),
17217 },
17218 }
17219 .intern(db),
17220 )
17221 }
17222 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17223 let kind = node.kind(db);
17224 assert_eq!(
17225 kind,
17226 SyntaxKind::ItemImplAlias,
17227 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17228 kind,
17229 SyntaxKind::ItemImplAlias
17230 );
17231 Self { node }
17232 }
17233 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17234 let kind = node.kind(db);
17235 if kind == SyntaxKind::ItemImplAlias {
17236 Some(Self::from_syntax_node(db, node))
17237 } else {
17238 None
17239 }
17240 }
17241 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17242 self.node
17243 }
17244 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17245 ItemImplAliasPtr(self.node.stable_ptr(db))
17246 }
17247}
17248#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17249pub struct ItemStruct<'db> {
17250 node: SyntaxNode<'db>,
17251}
17252impl<'db> ItemStruct<'db> {
17253 pub const INDEX_ATTRIBUTES: usize = 0;
17254 pub const INDEX_VISIBILITY: usize = 1;
17255 pub const INDEX_STRUCT_KW: usize = 2;
17256 pub const INDEX_NAME: usize = 3;
17257 pub const INDEX_GENERIC_PARAMS: usize = 4;
17258 pub const INDEX_LBRACE: usize = 5;
17259 pub const INDEX_MEMBERS: usize = 6;
17260 pub const INDEX_RBRACE: usize = 7;
17261 pub fn new_green(
17262 db: &'db dyn Database,
17263 attributes: AttributeListGreen<'db>,
17264 visibility: VisibilityGreen<'db>,
17265 struct_kw: TerminalStructGreen<'db>,
17266 name: TerminalIdentifierGreen<'db>,
17267 generic_params: OptionWrappedGenericParamListGreen<'db>,
17268 lbrace: TerminalLBraceGreen<'db>,
17269 members: MemberListGreen<'db>,
17270 rbrace: TerminalRBraceGreen<'db>,
17271 ) -> ItemStructGreen<'db> {
17272 let children = [
17273 attributes.0,
17274 visibility.0,
17275 struct_kw.0,
17276 name.0,
17277 generic_params.0,
17278 lbrace.0,
17279 members.0,
17280 rbrace.0,
17281 ];
17282 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17283 ItemStructGreen(
17284 GreenNode {
17285 kind: SyntaxKind::ItemStruct,
17286 details: GreenNodeDetails::Node { children: children.into(), width },
17287 }
17288 .intern(db),
17289 )
17290 }
17291}
17292impl<'db> ItemStruct<'db> {
17293 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17294 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17295 }
17296 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17297 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17298 }
17299 pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17300 TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17301 }
17302 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17303 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17304 }
17305 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17306 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17307 }
17308 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17309 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17310 }
17311 pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17312 MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17313 }
17314 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17315 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17316 }
17317}
17318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17319pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17320impl<'db> ItemStructPtr<'db> {
17321 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17322 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17323 }
17324}
17325impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17326 type SyntaxNode = ItemStruct<'db>;
17327 fn untyped(self) -> SyntaxStablePtrId<'db> {
17328 self.0
17329 }
17330 fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17331 ItemStruct::from_syntax_node(db, self.0.lookup(db))
17332 }
17333}
17334impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17335 fn from(ptr: ItemStructPtr<'db>) -> Self {
17336 ptr.untyped()
17337 }
17338}
17339#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17340pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17341impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17342 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17343 type StablePtr = ItemStructPtr<'db>;
17344 type Green = ItemStructGreen<'db>;
17345 fn missing(db: &'db dyn Database) -> Self::Green {
17346 ItemStructGreen(
17347 GreenNode {
17348 kind: SyntaxKind::ItemStruct,
17349 details: GreenNodeDetails::Node {
17350 children: [
17351 AttributeList::missing(db).0,
17352 Visibility::missing(db).0,
17353 TerminalStruct::missing(db).0,
17354 TerminalIdentifier::missing(db).0,
17355 OptionWrappedGenericParamList::missing(db).0,
17356 TerminalLBrace::missing(db).0,
17357 MemberList::missing(db).0,
17358 TerminalRBrace::missing(db).0,
17359 ]
17360 .into(),
17361 width: TextWidth::default(),
17362 },
17363 }
17364 .intern(db),
17365 )
17366 }
17367 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17368 let kind = node.kind(db);
17369 assert_eq!(
17370 kind,
17371 SyntaxKind::ItemStruct,
17372 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17373 kind,
17374 SyntaxKind::ItemStruct
17375 );
17376 Self { node }
17377 }
17378 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17379 let kind = node.kind(db);
17380 if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17381 }
17382 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17383 self.node
17384 }
17385 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17386 ItemStructPtr(self.node.stable_ptr(db))
17387 }
17388}
17389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17390pub struct ItemEnum<'db> {
17391 node: SyntaxNode<'db>,
17392}
17393impl<'db> ItemEnum<'db> {
17394 pub const INDEX_ATTRIBUTES: usize = 0;
17395 pub const INDEX_VISIBILITY: usize = 1;
17396 pub const INDEX_ENUM_KW: usize = 2;
17397 pub const INDEX_NAME: usize = 3;
17398 pub const INDEX_GENERIC_PARAMS: usize = 4;
17399 pub const INDEX_LBRACE: usize = 5;
17400 pub const INDEX_VARIANTS: usize = 6;
17401 pub const INDEX_RBRACE: usize = 7;
17402 pub fn new_green(
17403 db: &'db dyn Database,
17404 attributes: AttributeListGreen<'db>,
17405 visibility: VisibilityGreen<'db>,
17406 enum_kw: TerminalEnumGreen<'db>,
17407 name: TerminalIdentifierGreen<'db>,
17408 generic_params: OptionWrappedGenericParamListGreen<'db>,
17409 lbrace: TerminalLBraceGreen<'db>,
17410 variants: VariantListGreen<'db>,
17411 rbrace: TerminalRBraceGreen<'db>,
17412 ) -> ItemEnumGreen<'db> {
17413 let children = [
17414 attributes.0,
17415 visibility.0,
17416 enum_kw.0,
17417 name.0,
17418 generic_params.0,
17419 lbrace.0,
17420 variants.0,
17421 rbrace.0,
17422 ];
17423 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17424 ItemEnumGreen(
17425 GreenNode {
17426 kind: SyntaxKind::ItemEnum,
17427 details: GreenNodeDetails::Node { children: children.into(), width },
17428 }
17429 .intern(db),
17430 )
17431 }
17432}
17433impl<'db> ItemEnum<'db> {
17434 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17435 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17436 }
17437 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17438 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17439 }
17440 pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17441 TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17442 }
17443 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17444 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17445 }
17446 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17447 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17448 }
17449 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17450 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17451 }
17452 pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17453 VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17454 }
17455 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17456 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17457 }
17458}
17459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17460pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17461impl<'db> ItemEnumPtr<'db> {
17462 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17463 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17464 }
17465}
17466impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17467 type SyntaxNode = ItemEnum<'db>;
17468 fn untyped(self) -> SyntaxStablePtrId<'db> {
17469 self.0
17470 }
17471 fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17472 ItemEnum::from_syntax_node(db, self.0.lookup(db))
17473 }
17474}
17475impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17476 fn from(ptr: ItemEnumPtr<'db>) -> Self {
17477 ptr.untyped()
17478 }
17479}
17480#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17481pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17482impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17483 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17484 type StablePtr = ItemEnumPtr<'db>;
17485 type Green = ItemEnumGreen<'db>;
17486 fn missing(db: &'db dyn Database) -> Self::Green {
17487 ItemEnumGreen(
17488 GreenNode {
17489 kind: SyntaxKind::ItemEnum,
17490 details: GreenNodeDetails::Node {
17491 children: [
17492 AttributeList::missing(db).0,
17493 Visibility::missing(db).0,
17494 TerminalEnum::missing(db).0,
17495 TerminalIdentifier::missing(db).0,
17496 OptionWrappedGenericParamList::missing(db).0,
17497 TerminalLBrace::missing(db).0,
17498 VariantList::missing(db).0,
17499 TerminalRBrace::missing(db).0,
17500 ]
17501 .into(),
17502 width: TextWidth::default(),
17503 },
17504 }
17505 .intern(db),
17506 )
17507 }
17508 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17509 let kind = node.kind(db);
17510 assert_eq!(
17511 kind,
17512 SyntaxKind::ItemEnum,
17513 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17514 kind,
17515 SyntaxKind::ItemEnum
17516 );
17517 Self { node }
17518 }
17519 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17520 let kind = node.kind(db);
17521 if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17522 }
17523 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17524 self.node
17525 }
17526 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17527 ItemEnumPtr(self.node.stable_ptr(db))
17528 }
17529}
17530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17531pub struct ItemTypeAlias<'db> {
17532 node: SyntaxNode<'db>,
17533}
17534impl<'db> ItemTypeAlias<'db> {
17535 pub const INDEX_ATTRIBUTES: usize = 0;
17536 pub const INDEX_VISIBILITY: usize = 1;
17537 pub const INDEX_TYPE_KW: usize = 2;
17538 pub const INDEX_NAME: usize = 3;
17539 pub const INDEX_GENERIC_PARAMS: usize = 4;
17540 pub const INDEX_EQ: usize = 5;
17541 pub const INDEX_TY: usize = 6;
17542 pub const INDEX_SEMICOLON: usize = 7;
17543 pub fn new_green(
17544 db: &'db dyn Database,
17545 attributes: AttributeListGreen<'db>,
17546 visibility: VisibilityGreen<'db>,
17547 type_kw: TerminalTypeGreen<'db>,
17548 name: TerminalIdentifierGreen<'db>,
17549 generic_params: OptionWrappedGenericParamListGreen<'db>,
17550 eq: TerminalEqGreen<'db>,
17551 ty: ExprGreen<'db>,
17552 semicolon: TerminalSemicolonGreen<'db>,
17553 ) -> ItemTypeAliasGreen<'db> {
17554 let children = [
17555 attributes.0,
17556 visibility.0,
17557 type_kw.0,
17558 name.0,
17559 generic_params.0,
17560 eq.0,
17561 ty.0,
17562 semicolon.0,
17563 ];
17564 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17565 ItemTypeAliasGreen(
17566 GreenNode {
17567 kind: SyntaxKind::ItemTypeAlias,
17568 details: GreenNodeDetails::Node { children: children.into(), width },
17569 }
17570 .intern(db),
17571 )
17572 }
17573}
17574impl<'db> ItemTypeAlias<'db> {
17575 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17576 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17577 }
17578 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17579 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17580 }
17581 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17582 TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17583 }
17584 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17585 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17586 }
17587 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17588 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17589 }
17590 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17591 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17592 }
17593 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17594 Expr::from_syntax_node(db, self.node.get_children(db)[6])
17595 }
17596 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17597 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17598 }
17599}
17600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17601pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17602impl<'db> ItemTypeAliasPtr<'db> {
17603 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17604 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17605 }
17606}
17607impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17608 type SyntaxNode = ItemTypeAlias<'db>;
17609 fn untyped(self) -> SyntaxStablePtrId<'db> {
17610 self.0
17611 }
17612 fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17613 ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17614 }
17615}
17616impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17617 fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17618 ptr.untyped()
17619 }
17620}
17621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17622pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17623impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17624 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17625 type StablePtr = ItemTypeAliasPtr<'db>;
17626 type Green = ItemTypeAliasGreen<'db>;
17627 fn missing(db: &'db dyn Database) -> Self::Green {
17628 ItemTypeAliasGreen(
17629 GreenNode {
17630 kind: SyntaxKind::ItemTypeAlias,
17631 details: GreenNodeDetails::Node {
17632 children: [
17633 AttributeList::missing(db).0,
17634 Visibility::missing(db).0,
17635 TerminalType::missing(db).0,
17636 TerminalIdentifier::missing(db).0,
17637 OptionWrappedGenericParamList::missing(db).0,
17638 TerminalEq::missing(db).0,
17639 Expr::missing(db).0,
17640 TerminalSemicolon::missing(db).0,
17641 ]
17642 .into(),
17643 width: TextWidth::default(),
17644 },
17645 }
17646 .intern(db),
17647 )
17648 }
17649 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17650 let kind = node.kind(db);
17651 assert_eq!(
17652 kind,
17653 SyntaxKind::ItemTypeAlias,
17654 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17655 kind,
17656 SyntaxKind::ItemTypeAlias
17657 );
17658 Self { node }
17659 }
17660 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17661 let kind = node.kind(db);
17662 if kind == SyntaxKind::ItemTypeAlias {
17663 Some(Self::from_syntax_node(db, node))
17664 } else {
17665 None
17666 }
17667 }
17668 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17669 self.node
17670 }
17671 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17672 ItemTypeAliasPtr(self.node.stable_ptr(db))
17673 }
17674}
17675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17676pub struct ItemUse<'db> {
17677 node: SyntaxNode<'db>,
17678}
17679impl<'db> ItemUse<'db> {
17680 pub const INDEX_ATTRIBUTES: usize = 0;
17681 pub const INDEX_VISIBILITY: usize = 1;
17682 pub const INDEX_USE_KW: usize = 2;
17683 pub const INDEX_DOLLAR: usize = 3;
17684 pub const INDEX_USE_PATH: usize = 4;
17685 pub const INDEX_SEMICOLON: usize = 5;
17686 pub fn new_green(
17687 db: &'db dyn Database,
17688 attributes: AttributeListGreen<'db>,
17689 visibility: VisibilityGreen<'db>,
17690 use_kw: TerminalUseGreen<'db>,
17691 dollar: OptionTerminalDollarGreen<'db>,
17692 use_path: UsePathGreen<'db>,
17693 semicolon: TerminalSemicolonGreen<'db>,
17694 ) -> ItemUseGreen<'db> {
17695 let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17696 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17697 ItemUseGreen(
17698 GreenNode {
17699 kind: SyntaxKind::ItemUse,
17700 details: GreenNodeDetails::Node { children: children.into(), width },
17701 }
17702 .intern(db),
17703 )
17704 }
17705}
17706impl<'db> ItemUse<'db> {
17707 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17708 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17709 }
17710 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17711 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17712 }
17713 pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17714 TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17715 }
17716 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17717 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17718 }
17719 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17720 UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17721 }
17722 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17723 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17724 }
17725}
17726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17727pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17728impl<'db> ItemUsePtr<'db> {
17729 pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17730 UsePathGreen(self.0.0.key_fields(db)[0])
17731 }
17732}
17733impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17734 type SyntaxNode = ItemUse<'db>;
17735 fn untyped(self) -> SyntaxStablePtrId<'db> {
17736 self.0
17737 }
17738 fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17739 ItemUse::from_syntax_node(db, self.0.lookup(db))
17740 }
17741}
17742impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17743 fn from(ptr: ItemUsePtr<'db>) -> Self {
17744 ptr.untyped()
17745 }
17746}
17747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17748pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17749impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17750 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17751 type StablePtr = ItemUsePtr<'db>;
17752 type Green = ItemUseGreen<'db>;
17753 fn missing(db: &'db dyn Database) -> Self::Green {
17754 ItemUseGreen(
17755 GreenNode {
17756 kind: SyntaxKind::ItemUse,
17757 details: GreenNodeDetails::Node {
17758 children: [
17759 AttributeList::missing(db).0,
17760 Visibility::missing(db).0,
17761 TerminalUse::missing(db).0,
17762 OptionTerminalDollar::missing(db).0,
17763 UsePath::missing(db).0,
17764 TerminalSemicolon::missing(db).0,
17765 ]
17766 .into(),
17767 width: TextWidth::default(),
17768 },
17769 }
17770 .intern(db),
17771 )
17772 }
17773 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17774 let kind = node.kind(db);
17775 assert_eq!(
17776 kind,
17777 SyntaxKind::ItemUse,
17778 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17779 kind,
17780 SyntaxKind::ItemUse
17781 );
17782 Self { node }
17783 }
17784 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17785 let kind = node.kind(db);
17786 if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17787 }
17788 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17789 self.node
17790 }
17791 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17792 ItemUsePtr(self.node.stable_ptr(db))
17793 }
17794}
17795#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17796pub enum UsePath<'db> {
17797 Leaf(UsePathLeaf<'db>),
17798 Single(UsePathSingle<'db>),
17799 Multi(UsePathMulti<'db>),
17800 Star(UsePathStar<'db>),
17801}
17802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17803pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17804impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17805 type SyntaxNode = UsePath<'db>;
17806 fn untyped(self) -> SyntaxStablePtrId<'db> {
17807 self.0
17808 }
17809 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17810 UsePath::from_syntax_node(db, self.0.lookup(db))
17811 }
17812}
17813impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17814 fn from(ptr: UsePathPtr<'db>) -> Self {
17815 ptr.untyped()
17816 }
17817}
17818impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17819 fn from(value: UsePathLeafPtr<'db>) -> Self {
17820 Self(value.0)
17821 }
17822}
17823impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
17824 fn from(value: UsePathSinglePtr<'db>) -> Self {
17825 Self(value.0)
17826 }
17827}
17828impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
17829 fn from(value: UsePathMultiPtr<'db>) -> Self {
17830 Self(value.0)
17831 }
17832}
17833impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
17834 fn from(value: UsePathStarPtr<'db>) -> Self {
17835 Self(value.0)
17836 }
17837}
17838impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
17839 fn from(value: UsePathLeafGreen<'db>) -> Self {
17840 Self(value.0)
17841 }
17842}
17843impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
17844 fn from(value: UsePathSingleGreen<'db>) -> Self {
17845 Self(value.0)
17846 }
17847}
17848impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
17849 fn from(value: UsePathMultiGreen<'db>) -> Self {
17850 Self(value.0)
17851 }
17852}
17853impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
17854 fn from(value: UsePathStarGreen<'db>) -> Self {
17855 Self(value.0)
17856 }
17857}
17858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17859pub struct UsePathGreen<'db>(pub GreenId<'db>);
17860impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
17861 const OPTIONAL_KIND: Option<SyntaxKind> = None;
17862 type StablePtr = UsePathPtr<'db>;
17863 type Green = UsePathGreen<'db>;
17864 fn missing(db: &'db dyn Database) -> Self::Green {
17865 panic!("No missing variant.");
17866 }
17867 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17868 let kind = node.kind(db);
17869 match kind {
17870 SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
17871 SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
17872 SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
17873 SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
17874 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
17875 }
17876 }
17877 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17878 let kind = node.kind(db);
17879 match kind {
17880 SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
17881 SyntaxKind::UsePathSingle => {
17882 Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
17883 }
17884 SyntaxKind::UsePathMulti => {
17885 Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
17886 }
17887 SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
17888 _ => None,
17889 }
17890 }
17891 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17892 match self {
17893 UsePath::Leaf(x) => x.as_syntax_node(),
17894 UsePath::Single(x) => x.as_syntax_node(),
17895 UsePath::Multi(x) => x.as_syntax_node(),
17896 UsePath::Star(x) => x.as_syntax_node(),
17897 }
17898 }
17899 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17900 UsePathPtr(self.as_syntax_node().stable_ptr(db))
17901 }
17902}
17903impl<'db> UsePath<'db> {
17904 pub fn is_variant(kind: SyntaxKind) -> bool {
17906 matches!(
17907 kind,
17908 SyntaxKind::UsePathLeaf
17909 | SyntaxKind::UsePathSingle
17910 | SyntaxKind::UsePathMulti
17911 | SyntaxKind::UsePathStar
17912 )
17913 }
17914}
17915#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17916pub struct UsePathLeaf<'db> {
17917 node: SyntaxNode<'db>,
17918}
17919impl<'db> UsePathLeaf<'db> {
17920 pub const INDEX_IDENT: usize = 0;
17921 pub const INDEX_ALIAS_CLAUSE: usize = 1;
17922 pub fn new_green(
17923 db: &'db dyn Database,
17924 ident: PathSegmentGreen<'db>,
17925 alias_clause: OptionAliasClauseGreen<'db>,
17926 ) -> UsePathLeafGreen<'db> {
17927 let children = [ident.0, alias_clause.0];
17928 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17929 UsePathLeafGreen(
17930 GreenNode {
17931 kind: SyntaxKind::UsePathLeaf,
17932 details: GreenNodeDetails::Node { children: children.into(), width },
17933 }
17934 .intern(db),
17935 )
17936 }
17937}
17938impl<'db> UsePathLeaf<'db> {
17939 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
17940 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
17941 }
17942 pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
17943 OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
17944 }
17945}
17946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17947pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
17948impl<'db> UsePathLeafPtr<'db> {
17949 pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
17950 PathSegmentGreen(self.0.0.key_fields(db)[0])
17951 }
17952 pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
17953 OptionAliasClauseGreen(self.0.0.key_fields(db)[1])
17954 }
17955}
17956impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
17957 type SyntaxNode = UsePathLeaf<'db>;
17958 fn untyped(self) -> SyntaxStablePtrId<'db> {
17959 self.0
17960 }
17961 fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
17962 UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
17963 }
17964}
17965impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
17966 fn from(ptr: UsePathLeafPtr<'db>) -> Self {
17967 ptr.untyped()
17968 }
17969}
17970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17971pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
17972impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
17973 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
17974 type StablePtr = UsePathLeafPtr<'db>;
17975 type Green = UsePathLeafGreen<'db>;
17976 fn missing(db: &'db dyn Database) -> Self::Green {
17977 UsePathLeafGreen(
17978 GreenNode {
17979 kind: SyntaxKind::UsePathLeaf,
17980 details: GreenNodeDetails::Node {
17981 children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
17982 width: TextWidth::default(),
17983 },
17984 }
17985 .intern(db),
17986 )
17987 }
17988 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17989 let kind = node.kind(db);
17990 assert_eq!(
17991 kind,
17992 SyntaxKind::UsePathLeaf,
17993 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17994 kind,
17995 SyntaxKind::UsePathLeaf
17996 );
17997 Self { node }
17998 }
17999 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18000 let kind = node.kind(db);
18001 if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18002 }
18003 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18004 self.node
18005 }
18006 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18007 UsePathLeafPtr(self.node.stable_ptr(db))
18008 }
18009}
18010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18011pub struct UsePathSingle<'db> {
18012 node: SyntaxNode<'db>,
18013}
18014impl<'db> UsePathSingle<'db> {
18015 pub const INDEX_IDENT: usize = 0;
18016 pub const INDEX_COLON_COLON: usize = 1;
18017 pub const INDEX_USE_PATH: usize = 2;
18018 pub fn new_green(
18019 db: &'db dyn Database,
18020 ident: PathSegmentGreen<'db>,
18021 colon_colon: TerminalColonColonGreen<'db>,
18022 use_path: UsePathGreen<'db>,
18023 ) -> UsePathSingleGreen<'db> {
18024 let children = [ident.0, colon_colon.0, use_path.0];
18025 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18026 UsePathSingleGreen(
18027 GreenNode {
18028 kind: SyntaxKind::UsePathSingle,
18029 details: GreenNodeDetails::Node { children: children.into(), width },
18030 }
18031 .intern(db),
18032 )
18033 }
18034}
18035impl<'db> UsePathSingle<'db> {
18036 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18037 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18038 }
18039 pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18040 TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18041 }
18042 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18043 UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18044 }
18045}
18046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18047pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18048impl<'db> UsePathSinglePtr<'db> {}
18049impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18050 type SyntaxNode = UsePathSingle<'db>;
18051 fn untyped(self) -> SyntaxStablePtrId<'db> {
18052 self.0
18053 }
18054 fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18055 UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18056 }
18057}
18058impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18059 fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18060 ptr.untyped()
18061 }
18062}
18063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18064pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18065impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18066 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18067 type StablePtr = UsePathSinglePtr<'db>;
18068 type Green = UsePathSingleGreen<'db>;
18069 fn missing(db: &'db dyn Database) -> Self::Green {
18070 UsePathSingleGreen(
18071 GreenNode {
18072 kind: SyntaxKind::UsePathSingle,
18073 details: GreenNodeDetails::Node {
18074 children: [
18075 PathSegment::missing(db).0,
18076 TerminalColonColon::missing(db).0,
18077 UsePath::missing(db).0,
18078 ]
18079 .into(),
18080 width: TextWidth::default(),
18081 },
18082 }
18083 .intern(db),
18084 )
18085 }
18086 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18087 let kind = node.kind(db);
18088 assert_eq!(
18089 kind,
18090 SyntaxKind::UsePathSingle,
18091 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18092 kind,
18093 SyntaxKind::UsePathSingle
18094 );
18095 Self { node }
18096 }
18097 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18098 let kind = node.kind(db);
18099 if kind == SyntaxKind::UsePathSingle {
18100 Some(Self::from_syntax_node(db, node))
18101 } else {
18102 None
18103 }
18104 }
18105 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18106 self.node
18107 }
18108 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18109 UsePathSinglePtr(self.node.stable_ptr(db))
18110 }
18111}
18112#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18113pub struct UsePathMulti<'db> {
18114 node: SyntaxNode<'db>,
18115}
18116impl<'db> UsePathMulti<'db> {
18117 pub const INDEX_LBRACE: usize = 0;
18118 pub const INDEX_USE_PATHS: usize = 1;
18119 pub const INDEX_RBRACE: usize = 2;
18120 pub fn new_green(
18121 db: &'db dyn Database,
18122 lbrace: TerminalLBraceGreen<'db>,
18123 use_paths: UsePathListGreen<'db>,
18124 rbrace: TerminalRBraceGreen<'db>,
18125 ) -> UsePathMultiGreen<'db> {
18126 let children = [lbrace.0, use_paths.0, rbrace.0];
18127 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18128 UsePathMultiGreen(
18129 GreenNode {
18130 kind: SyntaxKind::UsePathMulti,
18131 details: GreenNodeDetails::Node { children: children.into(), width },
18132 }
18133 .intern(db),
18134 )
18135 }
18136}
18137impl<'db> UsePathMulti<'db> {
18138 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18139 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18140 }
18141 pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18142 UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18143 }
18144 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18145 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18146 }
18147}
18148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18149pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18150impl<'db> UsePathMultiPtr<'db> {}
18151impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18152 type SyntaxNode = UsePathMulti<'db>;
18153 fn untyped(self) -> SyntaxStablePtrId<'db> {
18154 self.0
18155 }
18156 fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18157 UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18158 }
18159}
18160impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18161 fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18162 ptr.untyped()
18163 }
18164}
18165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18166pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18167impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18168 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18169 type StablePtr = UsePathMultiPtr<'db>;
18170 type Green = UsePathMultiGreen<'db>;
18171 fn missing(db: &'db dyn Database) -> Self::Green {
18172 UsePathMultiGreen(
18173 GreenNode {
18174 kind: SyntaxKind::UsePathMulti,
18175 details: GreenNodeDetails::Node {
18176 children: [
18177 TerminalLBrace::missing(db).0,
18178 UsePathList::missing(db).0,
18179 TerminalRBrace::missing(db).0,
18180 ]
18181 .into(),
18182 width: TextWidth::default(),
18183 },
18184 }
18185 .intern(db),
18186 )
18187 }
18188 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18189 let kind = node.kind(db);
18190 assert_eq!(
18191 kind,
18192 SyntaxKind::UsePathMulti,
18193 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18194 kind,
18195 SyntaxKind::UsePathMulti
18196 );
18197 Self { node }
18198 }
18199 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18200 let kind = node.kind(db);
18201 if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18202 }
18203 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18204 self.node
18205 }
18206 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18207 UsePathMultiPtr(self.node.stable_ptr(db))
18208 }
18209}
18210#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18211pub struct UsePathStar<'db> {
18212 node: SyntaxNode<'db>,
18213}
18214impl<'db> UsePathStar<'db> {
18215 pub const INDEX_STAR: usize = 0;
18216 pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18217 let children = [star.0];
18218 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18219 UsePathStarGreen(
18220 GreenNode {
18221 kind: SyntaxKind::UsePathStar,
18222 details: GreenNodeDetails::Node { children: children.into(), width },
18223 }
18224 .intern(db),
18225 )
18226 }
18227}
18228impl<'db> UsePathStar<'db> {
18229 pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18230 TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18231 }
18232}
18233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18234pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18235impl<'db> UsePathStarPtr<'db> {}
18236impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18237 type SyntaxNode = UsePathStar<'db>;
18238 fn untyped(self) -> SyntaxStablePtrId<'db> {
18239 self.0
18240 }
18241 fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18242 UsePathStar::from_syntax_node(db, self.0.lookup(db))
18243 }
18244}
18245impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18246 fn from(ptr: UsePathStarPtr<'db>) -> Self {
18247 ptr.untyped()
18248 }
18249}
18250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18251pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18252impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18253 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18254 type StablePtr = UsePathStarPtr<'db>;
18255 type Green = UsePathStarGreen<'db>;
18256 fn missing(db: &'db dyn Database) -> Self::Green {
18257 UsePathStarGreen(
18258 GreenNode {
18259 kind: SyntaxKind::UsePathStar,
18260 details: GreenNodeDetails::Node {
18261 children: [TerminalMul::missing(db).0].into(),
18262 width: TextWidth::default(),
18263 },
18264 }
18265 .intern(db),
18266 )
18267 }
18268 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18269 let kind = node.kind(db);
18270 assert_eq!(
18271 kind,
18272 SyntaxKind::UsePathStar,
18273 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18274 kind,
18275 SyntaxKind::UsePathStar
18276 );
18277 Self { node }
18278 }
18279 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18280 let kind = node.kind(db);
18281 if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18282 }
18283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18284 self.node
18285 }
18286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18287 UsePathStarPtr(self.node.stable_ptr(db))
18288 }
18289}
18290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18291pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18292impl<'db> Deref for UsePathList<'db> {
18293 type Target = ElementList<'db, UsePath<'db>, 2>;
18294 fn deref(&self) -> &Self::Target {
18295 &self.0
18296 }
18297}
18298impl<'db> UsePathList<'db> {
18299 pub fn new_green(
18300 db: &'db dyn Database,
18301 children: &[UsePathListElementOrSeparatorGreen<'db>],
18302 ) -> UsePathListGreen<'db> {
18303 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18304 UsePathListGreen(
18305 GreenNode {
18306 kind: SyntaxKind::UsePathList,
18307 details: GreenNodeDetails::Node {
18308 children: children.iter().map(|x| x.id()).collect(),
18309 width,
18310 },
18311 }
18312 .intern(db),
18313 )
18314 }
18315}
18316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18317pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18318impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18319 type SyntaxNode = UsePathList<'db>;
18320 fn untyped(self) -> SyntaxStablePtrId<'db> {
18321 self.0
18322 }
18323 fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18324 UsePathList::from_syntax_node(db, self.0.lookup(db))
18325 }
18326}
18327impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18328 fn from(ptr: UsePathListPtr<'db>) -> Self {
18329 ptr.untyped()
18330 }
18331}
18332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18333pub enum UsePathListElementOrSeparatorGreen<'db> {
18334 Separator(TerminalCommaGreen<'db>),
18335 Element(UsePathGreen<'db>),
18336}
18337impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18338 fn from(value: TerminalCommaGreen<'db>) -> Self {
18339 UsePathListElementOrSeparatorGreen::Separator(value)
18340 }
18341}
18342impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18343 fn from(value: UsePathGreen<'db>) -> Self {
18344 UsePathListElementOrSeparatorGreen::Element(value)
18345 }
18346}
18347impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18348 fn id(&self) -> GreenId<'db> {
18349 match self {
18350 UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18351 UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18352 }
18353 }
18354}
18355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18356pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18357impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18358 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18359 type StablePtr = UsePathListPtr<'db>;
18360 type Green = UsePathListGreen<'db>;
18361 fn missing(db: &'db dyn Database) -> Self::Green {
18362 UsePathListGreen(
18363 GreenNode {
18364 kind: SyntaxKind::UsePathList,
18365 details: GreenNodeDetails::Node {
18366 children: [].into(),
18367 width: TextWidth::default(),
18368 },
18369 }
18370 .intern(db),
18371 )
18372 }
18373 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18374 Self(ElementList::new(node))
18375 }
18376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18377 if node.kind(db) == SyntaxKind::UsePathList {
18378 Some(Self(ElementList::new(node)))
18379 } else {
18380 None
18381 }
18382 }
18383 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18384 self.node
18385 }
18386 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18387 UsePathListPtr(self.node.stable_ptr(db))
18388 }
18389}
18390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18391pub struct AliasClause<'db> {
18392 node: SyntaxNode<'db>,
18393}
18394impl<'db> AliasClause<'db> {
18395 pub const INDEX_AS_KW: usize = 0;
18396 pub const INDEX_ALIAS: usize = 1;
18397 pub fn new_green(
18398 db: &'db dyn Database,
18399 as_kw: TerminalAsGreen<'db>,
18400 alias: TerminalIdentifierGreen<'db>,
18401 ) -> AliasClauseGreen<'db> {
18402 let children = [as_kw.0, alias.0];
18403 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18404 AliasClauseGreen(
18405 GreenNode {
18406 kind: SyntaxKind::AliasClause,
18407 details: GreenNodeDetails::Node { children: children.into(), width },
18408 }
18409 .intern(db),
18410 )
18411 }
18412}
18413impl<'db> AliasClause<'db> {
18414 pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18415 TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18416 }
18417 pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18418 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18419 }
18420}
18421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18422pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18423impl<'db> AliasClausePtr<'db> {
18424 pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18425 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
18426 }
18427}
18428impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18429 type SyntaxNode = AliasClause<'db>;
18430 fn untyped(self) -> SyntaxStablePtrId<'db> {
18431 self.0
18432 }
18433 fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18434 AliasClause::from_syntax_node(db, self.0.lookup(db))
18435 }
18436}
18437impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18438 fn from(ptr: AliasClausePtr<'db>) -> Self {
18439 ptr.untyped()
18440 }
18441}
18442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18443pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18444impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18445 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18446 type StablePtr = AliasClausePtr<'db>;
18447 type Green = AliasClauseGreen<'db>;
18448 fn missing(db: &'db dyn Database) -> Self::Green {
18449 AliasClauseGreen(
18450 GreenNode {
18451 kind: SyntaxKind::AliasClause,
18452 details: GreenNodeDetails::Node {
18453 children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18454 width: TextWidth::default(),
18455 },
18456 }
18457 .intern(db),
18458 )
18459 }
18460 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18461 let kind = node.kind(db);
18462 assert_eq!(
18463 kind,
18464 SyntaxKind::AliasClause,
18465 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18466 kind,
18467 SyntaxKind::AliasClause
18468 );
18469 Self { node }
18470 }
18471 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18472 let kind = node.kind(db);
18473 if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18474 }
18475 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18476 self.node
18477 }
18478 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18479 AliasClausePtr(self.node.stable_ptr(db))
18480 }
18481}
18482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18483pub enum OptionAliasClause<'db> {
18484 Empty(OptionAliasClauseEmpty<'db>),
18485 AliasClause(AliasClause<'db>),
18486}
18487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18488pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18489impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18490 type SyntaxNode = OptionAliasClause<'db>;
18491 fn untyped(self) -> SyntaxStablePtrId<'db> {
18492 self.0
18493 }
18494 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18495 OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18496 }
18497}
18498impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18499 fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18500 ptr.untyped()
18501 }
18502}
18503impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18504 fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18505 Self(value.0)
18506 }
18507}
18508impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18509 fn from(value: AliasClausePtr<'db>) -> Self {
18510 Self(value.0)
18511 }
18512}
18513impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18514 fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18515 Self(value.0)
18516 }
18517}
18518impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18519 fn from(value: AliasClauseGreen<'db>) -> Self {
18520 Self(value.0)
18521 }
18522}
18523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18524pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18525impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18526 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18527 type StablePtr = OptionAliasClausePtr<'db>;
18528 type Green = OptionAliasClauseGreen<'db>;
18529 fn missing(db: &'db dyn Database) -> Self::Green {
18530 panic!("No missing variant.");
18531 }
18532 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18533 let kind = node.kind(db);
18534 match kind {
18535 SyntaxKind::OptionAliasClauseEmpty => {
18536 OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18537 }
18538 SyntaxKind::AliasClause => {
18539 OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18540 }
18541 _ => panic!(
18542 "Unexpected syntax kind {:?} when constructing {}.",
18543 kind, "OptionAliasClause"
18544 ),
18545 }
18546 }
18547 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18548 let kind = node.kind(db);
18549 match kind {
18550 SyntaxKind::OptionAliasClauseEmpty => {
18551 Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18552 }
18553 SyntaxKind::AliasClause => {
18554 Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18555 }
18556 _ => None,
18557 }
18558 }
18559 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18560 match self {
18561 OptionAliasClause::Empty(x) => x.as_syntax_node(),
18562 OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18563 }
18564 }
18565 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18566 OptionAliasClausePtr(self.as_syntax_node().stable_ptr(db))
18567 }
18568}
18569impl<'db> OptionAliasClause<'db> {
18570 pub fn is_variant(kind: SyntaxKind) -> bool {
18572 matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18573 }
18574}
18575#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18576pub struct OptionAliasClauseEmpty<'db> {
18577 node: SyntaxNode<'db>,
18578}
18579impl<'db> OptionAliasClauseEmpty<'db> {
18580 pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18581 let children = [];
18582 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18583 OptionAliasClauseEmptyGreen(
18584 GreenNode {
18585 kind: SyntaxKind::OptionAliasClauseEmpty,
18586 details: GreenNodeDetails::Node { children: children.into(), width },
18587 }
18588 .intern(db),
18589 )
18590 }
18591}
18592impl<'db> OptionAliasClauseEmpty<'db> {}
18593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18594pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18595impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18596impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18597 type SyntaxNode = OptionAliasClauseEmpty<'db>;
18598 fn untyped(self) -> SyntaxStablePtrId<'db> {
18599 self.0
18600 }
18601 fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18602 OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18603 }
18604}
18605impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18606 fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18607 ptr.untyped()
18608 }
18609}
18610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18611pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18612impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18613 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18614 type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18615 type Green = OptionAliasClauseEmptyGreen<'db>;
18616 fn missing(db: &'db dyn Database) -> Self::Green {
18617 OptionAliasClauseEmptyGreen(
18618 GreenNode {
18619 kind: SyntaxKind::OptionAliasClauseEmpty,
18620 details: GreenNodeDetails::Node {
18621 children: [].into(),
18622 width: TextWidth::default(),
18623 },
18624 }
18625 .intern(db),
18626 )
18627 }
18628 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18629 let kind = node.kind(db);
18630 assert_eq!(
18631 kind,
18632 SyntaxKind::OptionAliasClauseEmpty,
18633 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18634 kind,
18635 SyntaxKind::OptionAliasClauseEmpty
18636 );
18637 Self { node }
18638 }
18639 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18640 let kind = node.kind(db);
18641 if kind == SyntaxKind::OptionAliasClauseEmpty {
18642 Some(Self::from_syntax_node(db, node))
18643 } else {
18644 None
18645 }
18646 }
18647 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18648 self.node
18649 }
18650 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18651 OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18652 }
18653}
18654#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18655pub enum GenericArg<'db> {
18656 Unnamed(GenericArgUnnamed<'db>),
18657 Named(GenericArgNamed<'db>),
18658}
18659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18660pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18661impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18662 type SyntaxNode = GenericArg<'db>;
18663 fn untyped(self) -> SyntaxStablePtrId<'db> {
18664 self.0
18665 }
18666 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18667 GenericArg::from_syntax_node(db, self.0.lookup(db))
18668 }
18669}
18670impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18671 fn from(ptr: GenericArgPtr<'db>) -> Self {
18672 ptr.untyped()
18673 }
18674}
18675impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18676 fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18677 Self(value.0)
18678 }
18679}
18680impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18681 fn from(value: GenericArgNamedPtr<'db>) -> Self {
18682 Self(value.0)
18683 }
18684}
18685impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18686 fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18687 Self(value.0)
18688 }
18689}
18690impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18691 fn from(value: GenericArgNamedGreen<'db>) -> Self {
18692 Self(value.0)
18693 }
18694}
18695#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18696pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18697impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18698 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18699 type StablePtr = GenericArgPtr<'db>;
18700 type Green = GenericArgGreen<'db>;
18701 fn missing(db: &'db dyn Database) -> Self::Green {
18702 panic!("No missing variant.");
18703 }
18704 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18705 let kind = node.kind(db);
18706 match kind {
18707 SyntaxKind::GenericArgUnnamed => {
18708 GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18709 }
18710 SyntaxKind::GenericArgNamed => {
18711 GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18712 }
18713 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18714 }
18715 }
18716 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18717 let kind = node.kind(db);
18718 match kind {
18719 SyntaxKind::GenericArgUnnamed => {
18720 Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18721 }
18722 SyntaxKind::GenericArgNamed => {
18723 Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18724 }
18725 _ => None,
18726 }
18727 }
18728 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18729 match self {
18730 GenericArg::Unnamed(x) => x.as_syntax_node(),
18731 GenericArg::Named(x) => x.as_syntax_node(),
18732 }
18733 }
18734 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18735 GenericArgPtr(self.as_syntax_node().stable_ptr(db))
18736 }
18737}
18738impl<'db> GenericArg<'db> {
18739 pub fn is_variant(kind: SyntaxKind) -> bool {
18741 matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18742 }
18743}
18744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18745pub struct GenericArgNamed<'db> {
18746 node: SyntaxNode<'db>,
18747}
18748impl<'db> GenericArgNamed<'db> {
18749 pub const INDEX_NAME: usize = 0;
18750 pub const INDEX_COLON: usize = 1;
18751 pub const INDEX_VALUE: usize = 2;
18752 pub fn new_green(
18753 db: &'db dyn Database,
18754 name: TerminalIdentifierGreen<'db>,
18755 colon: TerminalColonGreen<'db>,
18756 value: ExprGreen<'db>,
18757 ) -> GenericArgNamedGreen<'db> {
18758 let children = [name.0, colon.0, value.0];
18759 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18760 GenericArgNamedGreen(
18761 GreenNode {
18762 kind: SyntaxKind::GenericArgNamed,
18763 details: GreenNodeDetails::Node { children: children.into(), width },
18764 }
18765 .intern(db),
18766 )
18767 }
18768}
18769impl<'db> GenericArgNamed<'db> {
18770 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18771 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18772 }
18773 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18774 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18775 }
18776 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
18777 Expr::from_syntax_node(db, self.node.get_children(db)[2])
18778 }
18779}
18780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18781pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18782impl<'db> GenericArgNamedPtr<'db> {}
18783impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18784 type SyntaxNode = GenericArgNamed<'db>;
18785 fn untyped(self) -> SyntaxStablePtrId<'db> {
18786 self.0
18787 }
18788 fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18789 GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18790 }
18791}
18792impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18793 fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18794 ptr.untyped()
18795 }
18796}
18797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18798pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18799impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18800 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18801 type StablePtr = GenericArgNamedPtr<'db>;
18802 type Green = GenericArgNamedGreen<'db>;
18803 fn missing(db: &'db dyn Database) -> Self::Green {
18804 GenericArgNamedGreen(
18805 GreenNode {
18806 kind: SyntaxKind::GenericArgNamed,
18807 details: GreenNodeDetails::Node {
18808 children: [
18809 TerminalIdentifier::missing(db).0,
18810 TerminalColon::missing(db).0,
18811 Expr::missing(db).0,
18812 ]
18813 .into(),
18814 width: TextWidth::default(),
18815 },
18816 }
18817 .intern(db),
18818 )
18819 }
18820 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18821 let kind = node.kind(db);
18822 assert_eq!(
18823 kind,
18824 SyntaxKind::GenericArgNamed,
18825 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18826 kind,
18827 SyntaxKind::GenericArgNamed
18828 );
18829 Self { node }
18830 }
18831 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18832 let kind = node.kind(db);
18833 if kind == SyntaxKind::GenericArgNamed {
18834 Some(Self::from_syntax_node(db, node))
18835 } else {
18836 None
18837 }
18838 }
18839 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18840 self.node
18841 }
18842 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18843 GenericArgNamedPtr(self.node.stable_ptr(db))
18844 }
18845}
18846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18847pub struct GenericArgUnnamed<'db> {
18848 node: SyntaxNode<'db>,
18849}
18850impl<'db> GenericArgUnnamed<'db> {
18851 pub const INDEX_VALUE: usize = 0;
18852 pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> GenericArgUnnamedGreen<'db> {
18853 let children = [value.0];
18854 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18855 GenericArgUnnamedGreen(
18856 GreenNode {
18857 kind: SyntaxKind::GenericArgUnnamed,
18858 details: GreenNodeDetails::Node { children: children.into(), width },
18859 }
18860 .intern(db),
18861 )
18862 }
18863}
18864impl<'db> GenericArgUnnamed<'db> {
18865 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
18866 Expr::from_syntax_node(db, self.node.get_children(db)[0])
18867 }
18868}
18869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18870pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18871impl<'db> GenericArgUnnamedPtr<'db> {}
18872impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
18873 type SyntaxNode = GenericArgUnnamed<'db>;
18874 fn untyped(self) -> SyntaxStablePtrId<'db> {
18875 self.0
18876 }
18877 fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
18878 GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
18879 }
18880}
18881impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
18882 fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
18883 ptr.untyped()
18884 }
18885}
18886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18887pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
18888impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
18889 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
18890 type StablePtr = GenericArgUnnamedPtr<'db>;
18891 type Green = GenericArgUnnamedGreen<'db>;
18892 fn missing(db: &'db dyn Database) -> Self::Green {
18893 GenericArgUnnamedGreen(
18894 GreenNode {
18895 kind: SyntaxKind::GenericArgUnnamed,
18896 details: GreenNodeDetails::Node {
18897 children: [Expr::missing(db).0].into(),
18898 width: TextWidth::default(),
18899 },
18900 }
18901 .intern(db),
18902 )
18903 }
18904 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18905 let kind = node.kind(db);
18906 assert_eq!(
18907 kind,
18908 SyntaxKind::GenericArgUnnamed,
18909 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18910 kind,
18911 SyntaxKind::GenericArgUnnamed
18912 );
18913 Self { node }
18914 }
18915 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18916 let kind = node.kind(db);
18917 if kind == SyntaxKind::GenericArgUnnamed {
18918 Some(Self::from_syntax_node(db, node))
18919 } else {
18920 None
18921 }
18922 }
18923 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18924 self.node
18925 }
18926 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18927 GenericArgUnnamedPtr(self.node.stable_ptr(db))
18928 }
18929}
18930#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18931pub struct GenericArgs<'db> {
18932 node: SyntaxNode<'db>,
18933}
18934impl<'db> GenericArgs<'db> {
18935 pub const INDEX_LANGLE: usize = 0;
18936 pub const INDEX_GENERIC_ARGS: usize = 1;
18937 pub const INDEX_RANGLE: usize = 2;
18938 pub fn new_green(
18939 db: &'db dyn Database,
18940 langle: TerminalLTGreen<'db>,
18941 generic_args: GenericArgListGreen<'db>,
18942 rangle: TerminalGTGreen<'db>,
18943 ) -> GenericArgsGreen<'db> {
18944 let children = [langle.0, generic_args.0, rangle.0];
18945 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18946 GenericArgsGreen(
18947 GreenNode {
18948 kind: SyntaxKind::GenericArgs,
18949 details: GreenNodeDetails::Node { children: children.into(), width },
18950 }
18951 .intern(db),
18952 )
18953 }
18954}
18955impl<'db> GenericArgs<'db> {
18956 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
18957 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
18958 }
18959 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
18960 GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
18961 }
18962 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
18963 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
18964 }
18965}
18966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18967pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
18968impl<'db> GenericArgsPtr<'db> {}
18969impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
18970 type SyntaxNode = GenericArgs<'db>;
18971 fn untyped(self) -> SyntaxStablePtrId<'db> {
18972 self.0
18973 }
18974 fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
18975 GenericArgs::from_syntax_node(db, self.0.lookup(db))
18976 }
18977}
18978impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
18979 fn from(ptr: GenericArgsPtr<'db>) -> Self {
18980 ptr.untyped()
18981 }
18982}
18983#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18984pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
18985impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
18986 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
18987 type StablePtr = GenericArgsPtr<'db>;
18988 type Green = GenericArgsGreen<'db>;
18989 fn missing(db: &'db dyn Database) -> Self::Green {
18990 GenericArgsGreen(
18991 GreenNode {
18992 kind: SyntaxKind::GenericArgs,
18993 details: GreenNodeDetails::Node {
18994 children: [
18995 TerminalLT::missing(db).0,
18996 GenericArgList::missing(db).0,
18997 TerminalGT::missing(db).0,
18998 ]
18999 .into(),
19000 width: TextWidth::default(),
19001 },
19002 }
19003 .intern(db),
19004 )
19005 }
19006 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19007 let kind = node.kind(db);
19008 assert_eq!(
19009 kind,
19010 SyntaxKind::GenericArgs,
19011 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19012 kind,
19013 SyntaxKind::GenericArgs
19014 );
19015 Self { node }
19016 }
19017 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19018 let kind = node.kind(db);
19019 if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19020 }
19021 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19022 self.node
19023 }
19024 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19025 GenericArgsPtr(self.node.stable_ptr(db))
19026 }
19027}
19028#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19029pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19030impl<'db> Deref for GenericArgList<'db> {
19031 type Target = ElementList<'db, GenericArg<'db>, 2>;
19032 fn deref(&self) -> &Self::Target {
19033 &self.0
19034 }
19035}
19036impl<'db> GenericArgList<'db> {
19037 pub fn new_green(
19038 db: &'db dyn Database,
19039 children: &[GenericArgListElementOrSeparatorGreen<'db>],
19040 ) -> GenericArgListGreen<'db> {
19041 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19042 GenericArgListGreen(
19043 GreenNode {
19044 kind: SyntaxKind::GenericArgList,
19045 details: GreenNodeDetails::Node {
19046 children: children.iter().map(|x| x.id()).collect(),
19047 width,
19048 },
19049 }
19050 .intern(db),
19051 )
19052 }
19053}
19054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19055pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19056impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19057 type SyntaxNode = GenericArgList<'db>;
19058 fn untyped(self) -> SyntaxStablePtrId<'db> {
19059 self.0
19060 }
19061 fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19062 GenericArgList::from_syntax_node(db, self.0.lookup(db))
19063 }
19064}
19065impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19066 fn from(ptr: GenericArgListPtr<'db>) -> Self {
19067 ptr.untyped()
19068 }
19069}
19070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19071pub enum GenericArgListElementOrSeparatorGreen<'db> {
19072 Separator(TerminalCommaGreen<'db>),
19073 Element(GenericArgGreen<'db>),
19074}
19075impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19076 fn from(value: TerminalCommaGreen<'db>) -> Self {
19077 GenericArgListElementOrSeparatorGreen::Separator(value)
19078 }
19079}
19080impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19081 fn from(value: GenericArgGreen<'db>) -> Self {
19082 GenericArgListElementOrSeparatorGreen::Element(value)
19083 }
19084}
19085impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19086 fn id(&self) -> GreenId<'db> {
19087 match self {
19088 GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19089 GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19090 }
19091 }
19092}
19093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19094pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19095impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19096 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19097 type StablePtr = GenericArgListPtr<'db>;
19098 type Green = GenericArgListGreen<'db>;
19099 fn missing(db: &'db dyn Database) -> Self::Green {
19100 GenericArgListGreen(
19101 GreenNode {
19102 kind: SyntaxKind::GenericArgList,
19103 details: GreenNodeDetails::Node {
19104 children: [].into(),
19105 width: TextWidth::default(),
19106 },
19107 }
19108 .intern(db),
19109 )
19110 }
19111 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19112 Self(ElementList::new(node))
19113 }
19114 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19115 if node.kind(db) == SyntaxKind::GenericArgList {
19116 Some(Self(ElementList::new(node)))
19117 } else {
19118 None
19119 }
19120 }
19121 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19122 self.node
19123 }
19124 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19125 GenericArgListPtr(self.node.stable_ptr(db))
19126 }
19127}
19128#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19129pub struct AssociatedItemConstraint<'db> {
19130 node: SyntaxNode<'db>,
19131}
19132impl<'db> AssociatedItemConstraint<'db> {
19133 pub const INDEX_ITEM: usize = 0;
19134 pub const INDEX_COLON: usize = 1;
19135 pub const INDEX_VALUE: usize = 2;
19136 pub fn new_green(
19137 db: &'db dyn Database,
19138 item: TerminalIdentifierGreen<'db>,
19139 colon: TerminalColonGreen<'db>,
19140 value: ExprGreen<'db>,
19141 ) -> AssociatedItemConstraintGreen<'db> {
19142 let children = [item.0, colon.0, value.0];
19143 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19144 AssociatedItemConstraintGreen(
19145 GreenNode {
19146 kind: SyntaxKind::AssociatedItemConstraint,
19147 details: GreenNodeDetails::Node { children: children.into(), width },
19148 }
19149 .intern(db),
19150 )
19151 }
19152}
19153impl<'db> AssociatedItemConstraint<'db> {
19154 pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19155 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19156 }
19157 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19158 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19159 }
19160 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19161 Expr::from_syntax_node(db, self.node.get_children(db)[2])
19162 }
19163}
19164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19165pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19166impl<'db> AssociatedItemConstraintPtr<'db> {}
19167impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19168 type SyntaxNode = AssociatedItemConstraint<'db>;
19169 fn untyped(self) -> SyntaxStablePtrId<'db> {
19170 self.0
19171 }
19172 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19173 AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19174 }
19175}
19176impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19177 fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19178 ptr.untyped()
19179 }
19180}
19181#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19182pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19183impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19184 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19185 type StablePtr = AssociatedItemConstraintPtr<'db>;
19186 type Green = AssociatedItemConstraintGreen<'db>;
19187 fn missing(db: &'db dyn Database) -> Self::Green {
19188 AssociatedItemConstraintGreen(
19189 GreenNode {
19190 kind: SyntaxKind::AssociatedItemConstraint,
19191 details: GreenNodeDetails::Node {
19192 children: [
19193 TerminalIdentifier::missing(db).0,
19194 TerminalColon::missing(db).0,
19195 Expr::missing(db).0,
19196 ]
19197 .into(),
19198 width: TextWidth::default(),
19199 },
19200 }
19201 .intern(db),
19202 )
19203 }
19204 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19205 let kind = node.kind(db);
19206 assert_eq!(
19207 kind,
19208 SyntaxKind::AssociatedItemConstraint,
19209 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19210 kind,
19211 SyntaxKind::AssociatedItemConstraint
19212 );
19213 Self { node }
19214 }
19215 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19216 let kind = node.kind(db);
19217 if kind == SyntaxKind::AssociatedItemConstraint {
19218 Some(Self::from_syntax_node(db, node))
19219 } else {
19220 None
19221 }
19222 }
19223 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19224 self.node
19225 }
19226 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19227 AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19228 }
19229}
19230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19231pub struct AssociatedItemConstraints<'db> {
19232 node: SyntaxNode<'db>,
19233}
19234impl<'db> AssociatedItemConstraints<'db> {
19235 pub const INDEX_LBRACK: usize = 0;
19236 pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19237 pub const INDEX_RBRACK: usize = 2;
19238 pub fn new_green(
19239 db: &'db dyn Database,
19240 lbrack: TerminalLBrackGreen<'db>,
19241 associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19242 rbrack: TerminalRBrackGreen<'db>,
19243 ) -> AssociatedItemConstraintsGreen<'db> {
19244 let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19245 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19246 AssociatedItemConstraintsGreen(
19247 GreenNode {
19248 kind: SyntaxKind::AssociatedItemConstraints,
19249 details: GreenNodeDetails::Node { children: children.into(), width },
19250 }
19251 .intern(db),
19252 )
19253 }
19254}
19255impl<'db> AssociatedItemConstraints<'db> {
19256 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19257 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19258 }
19259 pub fn associated_item_constraints(
19260 &self,
19261 db: &'db dyn Database,
19262 ) -> AssociatedItemConstraintList<'db> {
19263 AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19264 }
19265 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19266 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19267 }
19268}
19269#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19270pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19271impl<'db> AssociatedItemConstraintsPtr<'db> {}
19272impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19273 type SyntaxNode = AssociatedItemConstraints<'db>;
19274 fn untyped(self) -> SyntaxStablePtrId<'db> {
19275 self.0
19276 }
19277 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19278 AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19279 }
19280}
19281impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19282 fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19283 ptr.untyped()
19284 }
19285}
19286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19287pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19288impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19289 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19290 type StablePtr = AssociatedItemConstraintsPtr<'db>;
19291 type Green = AssociatedItemConstraintsGreen<'db>;
19292 fn missing(db: &'db dyn Database) -> Self::Green {
19293 AssociatedItemConstraintsGreen(
19294 GreenNode {
19295 kind: SyntaxKind::AssociatedItemConstraints,
19296 details: GreenNodeDetails::Node {
19297 children: [
19298 TerminalLBrack::missing(db).0,
19299 AssociatedItemConstraintList::missing(db).0,
19300 TerminalRBrack::missing(db).0,
19301 ]
19302 .into(),
19303 width: TextWidth::default(),
19304 },
19305 }
19306 .intern(db),
19307 )
19308 }
19309 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19310 let kind = node.kind(db);
19311 assert_eq!(
19312 kind,
19313 SyntaxKind::AssociatedItemConstraints,
19314 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19315 kind,
19316 SyntaxKind::AssociatedItemConstraints
19317 );
19318 Self { node }
19319 }
19320 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19321 let kind = node.kind(db);
19322 if kind == SyntaxKind::AssociatedItemConstraints {
19323 Some(Self::from_syntax_node(db, node))
19324 } else {
19325 None
19326 }
19327 }
19328 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19329 self.node
19330 }
19331 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19332 AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19333 }
19334}
19335#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19336pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19337impl<'db> Deref for AssociatedItemConstraintList<'db> {
19338 type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19339 fn deref(&self) -> &Self::Target {
19340 &self.0
19341 }
19342}
19343impl<'db> AssociatedItemConstraintList<'db> {
19344 pub fn new_green(
19345 db: &'db dyn Database,
19346 children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19347 ) -> AssociatedItemConstraintListGreen<'db> {
19348 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19349 AssociatedItemConstraintListGreen(
19350 GreenNode {
19351 kind: SyntaxKind::AssociatedItemConstraintList,
19352 details: GreenNodeDetails::Node {
19353 children: children.iter().map(|x| x.id()).collect(),
19354 width,
19355 },
19356 }
19357 .intern(db),
19358 )
19359 }
19360}
19361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19362pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19363impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19364 type SyntaxNode = AssociatedItemConstraintList<'db>;
19365 fn untyped(self) -> SyntaxStablePtrId<'db> {
19366 self.0
19367 }
19368 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19369 AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19370 }
19371}
19372impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19373 fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19374 ptr.untyped()
19375 }
19376}
19377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19378pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19379 Separator(TerminalCommaGreen<'db>),
19380 Element(AssociatedItemConstraintGreen<'db>),
19381}
19382impl<'db> From<TerminalCommaGreen<'db>>
19383 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19384{
19385 fn from(value: TerminalCommaGreen<'db>) -> Self {
19386 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19387 }
19388}
19389impl<'db> From<AssociatedItemConstraintGreen<'db>>
19390 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19391{
19392 fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19393 AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19394 }
19395}
19396impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19397 fn id(&self) -> GreenId<'db> {
19398 match self {
19399 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19400 AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19401 }
19402 }
19403}
19404#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19405pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19406impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19407 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19408 type StablePtr = AssociatedItemConstraintListPtr<'db>;
19409 type Green = AssociatedItemConstraintListGreen<'db>;
19410 fn missing(db: &'db dyn Database) -> Self::Green {
19411 AssociatedItemConstraintListGreen(
19412 GreenNode {
19413 kind: SyntaxKind::AssociatedItemConstraintList,
19414 details: GreenNodeDetails::Node {
19415 children: [].into(),
19416 width: TextWidth::default(),
19417 },
19418 }
19419 .intern(db),
19420 )
19421 }
19422 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19423 Self(ElementList::new(node))
19424 }
19425 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19426 if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19427 Some(Self(ElementList::new(node)))
19428 } else {
19429 None
19430 }
19431 }
19432 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19433 self.node
19434 }
19435 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19436 AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19437 }
19438}
19439#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19440pub enum OptionAssociatedItemConstraints<'db> {
19441 Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19442 AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19443}
19444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19445pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19446impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19447 type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19448 fn untyped(self) -> SyntaxStablePtrId<'db> {
19449 self.0
19450 }
19451 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19452 OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19453 }
19454}
19455impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19456 fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19457 ptr.untyped()
19458 }
19459}
19460impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19461 for OptionAssociatedItemConstraintsPtr<'db>
19462{
19463 fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19464 Self(value.0)
19465 }
19466}
19467impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19468 fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19469 Self(value.0)
19470 }
19471}
19472impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19473 for OptionAssociatedItemConstraintsGreen<'db>
19474{
19475 fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19476 Self(value.0)
19477 }
19478}
19479impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19480 fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19481 Self(value.0)
19482 }
19483}
19484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19485pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19486impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19487 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19488 type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19489 type Green = OptionAssociatedItemConstraintsGreen<'db>;
19490 fn missing(db: &'db dyn Database) -> Self::Green {
19491 panic!("No missing variant.");
19492 }
19493 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19494 let kind = node.kind(db);
19495 match kind {
19496 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19497 OptionAssociatedItemConstraints::Empty(
19498 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19499 )
19500 }
19501 SyntaxKind::AssociatedItemConstraints => {
19502 OptionAssociatedItemConstraints::AssociatedItemConstraints(
19503 AssociatedItemConstraints::from_syntax_node(db, node),
19504 )
19505 }
19506 _ => panic!(
19507 "Unexpected syntax kind {:?} when constructing {}.",
19508 kind, "OptionAssociatedItemConstraints"
19509 ),
19510 }
19511 }
19512 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19513 let kind = node.kind(db);
19514 match kind {
19515 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19516 Some(OptionAssociatedItemConstraints::Empty(
19517 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19518 ))
19519 }
19520 SyntaxKind::AssociatedItemConstraints => {
19521 Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19522 AssociatedItemConstraints::from_syntax_node(db, node),
19523 ))
19524 }
19525 _ => None,
19526 }
19527 }
19528 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19529 match self {
19530 OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19531 OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19532 }
19533 }
19534 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19535 OptionAssociatedItemConstraintsPtr(self.as_syntax_node().stable_ptr(db))
19536 }
19537}
19538impl<'db> OptionAssociatedItemConstraints<'db> {
19539 pub fn is_variant(kind: SyntaxKind) -> bool {
19541 matches!(
19542 kind,
19543 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19544 | SyntaxKind::AssociatedItemConstraints
19545 )
19546 }
19547}
19548#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19549pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19550 node: SyntaxNode<'db>,
19551}
19552impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19553 pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19554 let children = [];
19555 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19556 OptionAssociatedItemConstraintsEmptyGreen(
19557 GreenNode {
19558 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19559 details: GreenNodeDetails::Node { children: children.into(), width },
19560 }
19561 .intern(db),
19562 )
19563 }
19564}
19565impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19566#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19567pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19568impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19569impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19570 type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19571 fn untyped(self) -> SyntaxStablePtrId<'db> {
19572 self.0
19573 }
19574 fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19575 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19576 }
19577}
19578impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19579 fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19580 ptr.untyped()
19581 }
19582}
19583#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19584pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19585impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19586 const OPTIONAL_KIND: Option<SyntaxKind> =
19587 Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19588 type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19589 type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19590 fn missing(db: &'db dyn Database) -> Self::Green {
19591 OptionAssociatedItemConstraintsEmptyGreen(
19592 GreenNode {
19593 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19594 details: GreenNodeDetails::Node {
19595 children: [].into(),
19596 width: TextWidth::default(),
19597 },
19598 }
19599 .intern(db),
19600 )
19601 }
19602 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19603 let kind = node.kind(db);
19604 assert_eq!(
19605 kind,
19606 SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19607 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19608 kind,
19609 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19610 );
19611 Self { node }
19612 }
19613 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19614 let kind = node.kind(db);
19615 if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19616 Some(Self::from_syntax_node(db, node))
19617 } else {
19618 None
19619 }
19620 }
19621 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19622 self.node
19623 }
19624 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19625 OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19626 }
19627}
19628#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19629pub enum OptionWrappedGenericParamList<'db> {
19630 Empty(OptionWrappedGenericParamListEmpty<'db>),
19631 WrappedGenericParamList(WrappedGenericParamList<'db>),
19632}
19633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19634pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19635impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
19636 type SyntaxNode = OptionWrappedGenericParamList<'db>;
19637 fn untyped(self) -> SyntaxStablePtrId<'db> {
19638 self.0
19639 }
19640 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19641 OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19642 }
19643}
19644impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19645 fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
19646 ptr.untyped()
19647 }
19648}
19649impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
19650 for OptionWrappedGenericParamListPtr<'db>
19651{
19652 fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19653 Self(value.0)
19654 }
19655}
19656impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
19657 fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
19658 Self(value.0)
19659 }
19660}
19661impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
19662 for OptionWrappedGenericParamListGreen<'db>
19663{
19664 fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
19665 Self(value.0)
19666 }
19667}
19668impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
19669 fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
19670 Self(value.0)
19671 }
19672}
19673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19674pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19675impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
19676 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19677 type StablePtr = OptionWrappedGenericParamListPtr<'db>;
19678 type Green = OptionWrappedGenericParamListGreen<'db>;
19679 fn missing(db: &'db dyn Database) -> Self::Green {
19680 panic!("No missing variant.");
19681 }
19682 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19683 let kind = node.kind(db);
19684 match kind {
19685 SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
19686 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19687 ),
19688 SyntaxKind::WrappedGenericParamList => {
19689 OptionWrappedGenericParamList::WrappedGenericParamList(
19690 WrappedGenericParamList::from_syntax_node(db, node),
19691 )
19692 }
19693 _ => panic!(
19694 "Unexpected syntax kind {:?} when constructing {}.",
19695 kind, "OptionWrappedGenericParamList"
19696 ),
19697 }
19698 }
19699 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19700 let kind = node.kind(db);
19701 match kind {
19702 SyntaxKind::OptionWrappedGenericParamListEmpty => {
19703 Some(OptionWrappedGenericParamList::Empty(
19704 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19705 ))
19706 }
19707 SyntaxKind::WrappedGenericParamList => {
19708 Some(OptionWrappedGenericParamList::WrappedGenericParamList(
19709 WrappedGenericParamList::from_syntax_node(db, node),
19710 ))
19711 }
19712 _ => None,
19713 }
19714 }
19715 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19716 match self {
19717 OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
19718 OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
19719 }
19720 }
19721 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19722 OptionWrappedGenericParamListPtr(self.as_syntax_node().stable_ptr(db))
19723 }
19724}
19725impl<'db> OptionWrappedGenericParamList<'db> {
19726 pub fn is_variant(kind: SyntaxKind) -> bool {
19728 matches!(
19729 kind,
19730 SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
19731 )
19732 }
19733}
19734#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19735pub struct OptionWrappedGenericParamListEmpty<'db> {
19736 node: SyntaxNode<'db>,
19737}
19738impl<'db> OptionWrappedGenericParamListEmpty<'db> {
19739 pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
19740 let children = [];
19741 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19742 OptionWrappedGenericParamListEmptyGreen(
19743 GreenNode {
19744 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19745 details: GreenNodeDetails::Node { children: children.into(), width },
19746 }
19747 .intern(db),
19748 )
19749 }
19750}
19751impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
19752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19753pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19754impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
19755impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
19756 type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
19757 fn untyped(self) -> SyntaxStablePtrId<'db> {
19758 self.0
19759 }
19760 fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
19761 OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
19762 }
19763}
19764impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19765 fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19766 ptr.untyped()
19767 }
19768}
19769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19770pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
19771impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
19772 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
19773 type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
19774 type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
19775 fn missing(db: &'db dyn Database) -> Self::Green {
19776 OptionWrappedGenericParamListEmptyGreen(
19777 GreenNode {
19778 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19779 details: GreenNodeDetails::Node {
19780 children: [].into(),
19781 width: TextWidth::default(),
19782 },
19783 }
19784 .intern(db),
19785 )
19786 }
19787 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19788 let kind = node.kind(db);
19789 assert_eq!(
19790 kind,
19791 SyntaxKind::OptionWrappedGenericParamListEmpty,
19792 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19793 kind,
19794 SyntaxKind::OptionWrappedGenericParamListEmpty
19795 );
19796 Self { node }
19797 }
19798 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19799 let kind = node.kind(db);
19800 if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
19801 Some(Self::from_syntax_node(db, node))
19802 } else {
19803 None
19804 }
19805 }
19806 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19807 self.node
19808 }
19809 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19810 OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
19811 }
19812}
19813#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19814pub struct WrappedGenericParamList<'db> {
19815 node: SyntaxNode<'db>,
19816}
19817impl<'db> WrappedGenericParamList<'db> {
19818 pub const INDEX_LANGLE: usize = 0;
19819 pub const INDEX_GENERIC_PARAMS: usize = 1;
19820 pub const INDEX_RANGLE: usize = 2;
19821 pub fn new_green(
19822 db: &'db dyn Database,
19823 langle: TerminalLTGreen<'db>,
19824 generic_params: GenericParamListGreen<'db>,
19825 rangle: TerminalGTGreen<'db>,
19826 ) -> WrappedGenericParamListGreen<'db> {
19827 let children = [langle.0, generic_params.0, rangle.0];
19828 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19829 WrappedGenericParamListGreen(
19830 GreenNode {
19831 kind: SyntaxKind::WrappedGenericParamList,
19832 details: GreenNodeDetails::Node { children: children.into(), width },
19833 }
19834 .intern(db),
19835 )
19836 }
19837}
19838impl<'db> WrappedGenericParamList<'db> {
19839 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19840 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19841 }
19842 pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
19843 GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
19844 }
19845 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19846 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19847 }
19848}
19849#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19850pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19851impl<'db> WrappedGenericParamListPtr<'db> {}
19852impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
19853 type SyntaxNode = WrappedGenericParamList<'db>;
19854 fn untyped(self) -> SyntaxStablePtrId<'db> {
19855 self.0
19856 }
19857 fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
19858 WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19859 }
19860}
19861impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19862 fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
19863 ptr.untyped()
19864 }
19865}
19866#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19867pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19868impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
19869 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
19870 type StablePtr = WrappedGenericParamListPtr<'db>;
19871 type Green = WrappedGenericParamListGreen<'db>;
19872 fn missing(db: &'db dyn Database) -> Self::Green {
19873 WrappedGenericParamListGreen(
19874 GreenNode {
19875 kind: SyntaxKind::WrappedGenericParamList,
19876 details: GreenNodeDetails::Node {
19877 children: [
19878 TerminalLT::missing(db).0,
19879 GenericParamList::missing(db).0,
19880 TerminalGT::missing(db).0,
19881 ]
19882 .into(),
19883 width: TextWidth::default(),
19884 },
19885 }
19886 .intern(db),
19887 )
19888 }
19889 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19890 let kind = node.kind(db);
19891 assert_eq!(
19892 kind,
19893 SyntaxKind::WrappedGenericParamList,
19894 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19895 kind,
19896 SyntaxKind::WrappedGenericParamList
19897 );
19898 Self { node }
19899 }
19900 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19901 let kind = node.kind(db);
19902 if kind == SyntaxKind::WrappedGenericParamList {
19903 Some(Self::from_syntax_node(db, node))
19904 } else {
19905 None
19906 }
19907 }
19908 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19909 self.node
19910 }
19911 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19912 WrappedGenericParamListPtr(self.node.stable_ptr(db))
19913 }
19914}
19915#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19916pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
19917impl<'db> Deref for GenericParamList<'db> {
19918 type Target = ElementList<'db, GenericParam<'db>, 2>;
19919 fn deref(&self) -> &Self::Target {
19920 &self.0
19921 }
19922}
19923impl<'db> GenericParamList<'db> {
19924 pub fn new_green(
19925 db: &'db dyn Database,
19926 children: &[GenericParamListElementOrSeparatorGreen<'db>],
19927 ) -> GenericParamListGreen<'db> {
19928 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19929 GenericParamListGreen(
19930 GreenNode {
19931 kind: SyntaxKind::GenericParamList,
19932 details: GreenNodeDetails::Node {
19933 children: children.iter().map(|x| x.id()).collect(),
19934 width,
19935 },
19936 }
19937 .intern(db),
19938 )
19939 }
19940}
19941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19942pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19943impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
19944 type SyntaxNode = GenericParamList<'db>;
19945 fn untyped(self) -> SyntaxStablePtrId<'db> {
19946 self.0
19947 }
19948 fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
19949 GenericParamList::from_syntax_node(db, self.0.lookup(db))
19950 }
19951}
19952impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19953 fn from(ptr: GenericParamListPtr<'db>) -> Self {
19954 ptr.untyped()
19955 }
19956}
19957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19958pub enum GenericParamListElementOrSeparatorGreen<'db> {
19959 Separator(TerminalCommaGreen<'db>),
19960 Element(GenericParamGreen<'db>),
19961}
19962impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
19963 fn from(value: TerminalCommaGreen<'db>) -> Self {
19964 GenericParamListElementOrSeparatorGreen::Separator(value)
19965 }
19966}
19967impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
19968 fn from(value: GenericParamGreen<'db>) -> Self {
19969 GenericParamListElementOrSeparatorGreen::Element(value)
19970 }
19971}
19972impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
19973 fn id(&self) -> GreenId<'db> {
19974 match self {
19975 GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
19976 GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
19977 }
19978 }
19979}
19980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19981pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
19982impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
19983 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
19984 type StablePtr = GenericParamListPtr<'db>;
19985 type Green = GenericParamListGreen<'db>;
19986 fn missing(db: &'db dyn Database) -> Self::Green {
19987 GenericParamListGreen(
19988 GreenNode {
19989 kind: SyntaxKind::GenericParamList,
19990 details: GreenNodeDetails::Node {
19991 children: [].into(),
19992 width: TextWidth::default(),
19993 },
19994 }
19995 .intern(db),
19996 )
19997 }
19998 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19999 Self(ElementList::new(node))
20000 }
20001 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20002 if node.kind(db) == SyntaxKind::GenericParamList {
20003 Some(Self(ElementList::new(node)))
20004 } else {
20005 None
20006 }
20007 }
20008 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20009 self.node
20010 }
20011 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20012 GenericParamListPtr(self.node.stable_ptr(db))
20013 }
20014}
20015#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20016pub enum GenericParam<'db> {
20017 Type(GenericParamType<'db>),
20018 Const(GenericParamConst<'db>),
20019 ImplNamed(GenericParamImplNamed<'db>),
20020 ImplAnonymous(GenericParamImplAnonymous<'db>),
20021 NegativeImpl(GenericParamNegativeImpl<'db>),
20022}
20023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20024pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20025impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20026 type SyntaxNode = GenericParam<'db>;
20027 fn untyped(self) -> SyntaxStablePtrId<'db> {
20028 self.0
20029 }
20030 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20031 GenericParam::from_syntax_node(db, self.0.lookup(db))
20032 }
20033}
20034impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20035 fn from(ptr: GenericParamPtr<'db>) -> Self {
20036 ptr.untyped()
20037 }
20038}
20039impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20040 fn from(value: GenericParamTypePtr<'db>) -> Self {
20041 Self(value.0)
20042 }
20043}
20044impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20045 fn from(value: GenericParamConstPtr<'db>) -> Self {
20046 Self(value.0)
20047 }
20048}
20049impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20050 fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20051 Self(value.0)
20052 }
20053}
20054impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20055 fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20056 Self(value.0)
20057 }
20058}
20059impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20060 fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20061 Self(value.0)
20062 }
20063}
20064impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20065 fn from(value: GenericParamTypeGreen<'db>) -> Self {
20066 Self(value.0)
20067 }
20068}
20069impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20070 fn from(value: GenericParamConstGreen<'db>) -> Self {
20071 Self(value.0)
20072 }
20073}
20074impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20075 fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20076 Self(value.0)
20077 }
20078}
20079impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20080 fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20081 Self(value.0)
20082 }
20083}
20084impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20085 fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20086 Self(value.0)
20087 }
20088}
20089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20090pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20091impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20092 const OPTIONAL_KIND: Option<SyntaxKind> = None;
20093 type StablePtr = GenericParamPtr<'db>;
20094 type Green = GenericParamGreen<'db>;
20095 fn missing(db: &'db dyn Database) -> Self::Green {
20096 panic!("No missing variant.");
20097 }
20098 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20099 let kind = node.kind(db);
20100 match kind {
20101 SyntaxKind::GenericParamType => {
20102 GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20103 }
20104 SyntaxKind::GenericParamConst => {
20105 GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20106 }
20107 SyntaxKind::GenericParamImplNamed => {
20108 GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20109 }
20110 SyntaxKind::GenericParamImplAnonymous => {
20111 GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20112 }
20113 SyntaxKind::GenericParamNegativeImpl => {
20114 GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20115 }
20116 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20117 }
20118 }
20119 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20120 let kind = node.kind(db);
20121 match kind {
20122 SyntaxKind::GenericParamType => {
20123 Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20124 }
20125 SyntaxKind::GenericParamConst => {
20126 Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20127 }
20128 SyntaxKind::GenericParamImplNamed => {
20129 Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20130 }
20131 SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20132 GenericParamImplAnonymous::from_syntax_node(db, node),
20133 )),
20134 SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20135 GenericParamNegativeImpl::from_syntax_node(db, node),
20136 )),
20137 _ => None,
20138 }
20139 }
20140 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20141 match self {
20142 GenericParam::Type(x) => x.as_syntax_node(),
20143 GenericParam::Const(x) => x.as_syntax_node(),
20144 GenericParam::ImplNamed(x) => x.as_syntax_node(),
20145 GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20146 GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20147 }
20148 }
20149 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20150 GenericParamPtr(self.as_syntax_node().stable_ptr(db))
20151 }
20152}
20153impl<'db> GenericParam<'db> {
20154 pub fn is_variant(kind: SyntaxKind) -> bool {
20156 matches!(
20157 kind,
20158 SyntaxKind::GenericParamType
20159 | SyntaxKind::GenericParamConst
20160 | SyntaxKind::GenericParamImplNamed
20161 | SyntaxKind::GenericParamImplAnonymous
20162 | SyntaxKind::GenericParamNegativeImpl
20163 )
20164 }
20165}
20166#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20167pub struct GenericParamType<'db> {
20168 node: SyntaxNode<'db>,
20169}
20170impl<'db> GenericParamType<'db> {
20171 pub const INDEX_NAME: usize = 0;
20172 pub fn new_green(
20173 db: &'db dyn Database,
20174 name: TerminalIdentifierGreen<'db>,
20175 ) -> GenericParamTypeGreen<'db> {
20176 let children = [name.0];
20177 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20178 GenericParamTypeGreen(
20179 GreenNode {
20180 kind: SyntaxKind::GenericParamType,
20181 details: GreenNodeDetails::Node { children: children.into(), width },
20182 }
20183 .intern(db),
20184 )
20185 }
20186}
20187impl<'db> GenericParamType<'db> {
20188 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20189 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20190 }
20191}
20192#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20193pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20194impl<'db> GenericParamTypePtr<'db> {
20195 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20196 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20197 }
20198}
20199impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20200 type SyntaxNode = GenericParamType<'db>;
20201 fn untyped(self) -> SyntaxStablePtrId<'db> {
20202 self.0
20203 }
20204 fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20205 GenericParamType::from_syntax_node(db, self.0.lookup(db))
20206 }
20207}
20208impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20209 fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20210 ptr.untyped()
20211 }
20212}
20213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20214pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20215impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20216 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20217 type StablePtr = GenericParamTypePtr<'db>;
20218 type Green = GenericParamTypeGreen<'db>;
20219 fn missing(db: &'db dyn Database) -> Self::Green {
20220 GenericParamTypeGreen(
20221 GreenNode {
20222 kind: SyntaxKind::GenericParamType,
20223 details: GreenNodeDetails::Node {
20224 children: [TerminalIdentifier::missing(db).0].into(),
20225 width: TextWidth::default(),
20226 },
20227 }
20228 .intern(db),
20229 )
20230 }
20231 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20232 let kind = node.kind(db);
20233 assert_eq!(
20234 kind,
20235 SyntaxKind::GenericParamType,
20236 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20237 kind,
20238 SyntaxKind::GenericParamType
20239 );
20240 Self { node }
20241 }
20242 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20243 let kind = node.kind(db);
20244 if kind == SyntaxKind::GenericParamType {
20245 Some(Self::from_syntax_node(db, node))
20246 } else {
20247 None
20248 }
20249 }
20250 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20251 self.node
20252 }
20253 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20254 GenericParamTypePtr(self.node.stable_ptr(db))
20255 }
20256}
20257#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20258pub struct GenericParamConst<'db> {
20259 node: SyntaxNode<'db>,
20260}
20261impl<'db> GenericParamConst<'db> {
20262 pub const INDEX_CONST_KW: usize = 0;
20263 pub const INDEX_NAME: usize = 1;
20264 pub const INDEX_COLON: usize = 2;
20265 pub const INDEX_TY: usize = 3;
20266 pub fn new_green(
20267 db: &'db dyn Database,
20268 const_kw: TerminalConstGreen<'db>,
20269 name: TerminalIdentifierGreen<'db>,
20270 colon: TerminalColonGreen<'db>,
20271 ty: ExprGreen<'db>,
20272 ) -> GenericParamConstGreen<'db> {
20273 let children = [const_kw.0, name.0, colon.0, ty.0];
20274 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20275 GenericParamConstGreen(
20276 GreenNode {
20277 kind: SyntaxKind::GenericParamConst,
20278 details: GreenNodeDetails::Node { children: children.into(), width },
20279 }
20280 .intern(db),
20281 )
20282 }
20283}
20284impl<'db> GenericParamConst<'db> {
20285 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20286 TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20287 }
20288 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20289 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20290 }
20291 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20292 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20293 }
20294 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20295 Expr::from_syntax_node(db, self.node.get_children(db)[3])
20296 }
20297}
20298#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20299pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20300impl<'db> GenericParamConstPtr<'db> {
20301 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20302 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20303 }
20304}
20305impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20306 type SyntaxNode = GenericParamConst<'db>;
20307 fn untyped(self) -> SyntaxStablePtrId<'db> {
20308 self.0
20309 }
20310 fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20311 GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20312 }
20313}
20314impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20315 fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20316 ptr.untyped()
20317 }
20318}
20319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20320pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20321impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20322 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20323 type StablePtr = GenericParamConstPtr<'db>;
20324 type Green = GenericParamConstGreen<'db>;
20325 fn missing(db: &'db dyn Database) -> Self::Green {
20326 GenericParamConstGreen(
20327 GreenNode {
20328 kind: SyntaxKind::GenericParamConst,
20329 details: GreenNodeDetails::Node {
20330 children: [
20331 TerminalConst::missing(db).0,
20332 TerminalIdentifier::missing(db).0,
20333 TerminalColon::missing(db).0,
20334 Expr::missing(db).0,
20335 ]
20336 .into(),
20337 width: TextWidth::default(),
20338 },
20339 }
20340 .intern(db),
20341 )
20342 }
20343 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20344 let kind = node.kind(db);
20345 assert_eq!(
20346 kind,
20347 SyntaxKind::GenericParamConst,
20348 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20349 kind,
20350 SyntaxKind::GenericParamConst
20351 );
20352 Self { node }
20353 }
20354 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20355 let kind = node.kind(db);
20356 if kind == SyntaxKind::GenericParamConst {
20357 Some(Self::from_syntax_node(db, node))
20358 } else {
20359 None
20360 }
20361 }
20362 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20363 self.node
20364 }
20365 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20366 GenericParamConstPtr(self.node.stable_ptr(db))
20367 }
20368}
20369#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20370pub struct GenericParamImplNamed<'db> {
20371 node: SyntaxNode<'db>,
20372}
20373impl<'db> GenericParamImplNamed<'db> {
20374 pub const INDEX_IMPL_KW: usize = 0;
20375 pub const INDEX_NAME: usize = 1;
20376 pub const INDEX_COLON: usize = 2;
20377 pub const INDEX_TRAIT_PATH: usize = 3;
20378 pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20379 pub fn new_green(
20380 db: &'db dyn Database,
20381 impl_kw: TerminalImplGreen<'db>,
20382 name: TerminalIdentifierGreen<'db>,
20383 colon: TerminalColonGreen<'db>,
20384 trait_path: ExprPathGreen<'db>,
20385 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20386 ) -> GenericParamImplNamedGreen<'db> {
20387 let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20388 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20389 GenericParamImplNamedGreen(
20390 GreenNode {
20391 kind: SyntaxKind::GenericParamImplNamed,
20392 details: GreenNodeDetails::Node { children: children.into(), width },
20393 }
20394 .intern(db),
20395 )
20396 }
20397}
20398impl<'db> GenericParamImplNamed<'db> {
20399 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20400 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20401 }
20402 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20403 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20404 }
20405 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20406 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20407 }
20408 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20409 ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20410 }
20411 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20412 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20413 }
20414}
20415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20416pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20417impl<'db> GenericParamImplNamedPtr<'db> {
20418 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20419 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20420 }
20421}
20422impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20423 type SyntaxNode = GenericParamImplNamed<'db>;
20424 fn untyped(self) -> SyntaxStablePtrId<'db> {
20425 self.0
20426 }
20427 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20428 GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20429 }
20430}
20431impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20432 fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20433 ptr.untyped()
20434 }
20435}
20436#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20437pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20438impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20439 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20440 type StablePtr = GenericParamImplNamedPtr<'db>;
20441 type Green = GenericParamImplNamedGreen<'db>;
20442 fn missing(db: &'db dyn Database) -> Self::Green {
20443 GenericParamImplNamedGreen(
20444 GreenNode {
20445 kind: SyntaxKind::GenericParamImplNamed,
20446 details: GreenNodeDetails::Node {
20447 children: [
20448 TerminalImpl::missing(db).0,
20449 TerminalIdentifier::missing(db).0,
20450 TerminalColon::missing(db).0,
20451 ExprPath::missing(db).0,
20452 OptionAssociatedItemConstraints::missing(db).0,
20453 ]
20454 .into(),
20455 width: TextWidth::default(),
20456 },
20457 }
20458 .intern(db),
20459 )
20460 }
20461 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20462 let kind = node.kind(db);
20463 assert_eq!(
20464 kind,
20465 SyntaxKind::GenericParamImplNamed,
20466 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20467 kind,
20468 SyntaxKind::GenericParamImplNamed
20469 );
20470 Self { node }
20471 }
20472 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20473 let kind = node.kind(db);
20474 if kind == SyntaxKind::GenericParamImplNamed {
20475 Some(Self::from_syntax_node(db, node))
20476 } else {
20477 None
20478 }
20479 }
20480 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20481 self.node
20482 }
20483 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20484 GenericParamImplNamedPtr(self.node.stable_ptr(db))
20485 }
20486}
20487#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20488pub struct GenericParamImplAnonymous<'db> {
20489 node: SyntaxNode<'db>,
20490}
20491impl<'db> GenericParamImplAnonymous<'db> {
20492 pub const INDEX_PLUS: usize = 0;
20493 pub const INDEX_TRAIT_PATH: usize = 1;
20494 pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20495 pub fn new_green(
20496 db: &'db dyn Database,
20497 plus: TerminalPlusGreen<'db>,
20498 trait_path: ExprPathGreen<'db>,
20499 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20500 ) -> GenericParamImplAnonymousGreen<'db> {
20501 let children = [plus.0, trait_path.0, type_constrains.0];
20502 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20503 GenericParamImplAnonymousGreen(
20504 GreenNode {
20505 kind: SyntaxKind::GenericParamImplAnonymous,
20506 details: GreenNodeDetails::Node { children: children.into(), width },
20507 }
20508 .intern(db),
20509 )
20510 }
20511}
20512impl<'db> GenericParamImplAnonymous<'db> {
20513 pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20514 TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20515 }
20516 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20517 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20518 }
20519 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20520 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20521 }
20522}
20523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20524pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20525impl<'db> GenericParamImplAnonymousPtr<'db> {}
20526impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20527 type SyntaxNode = GenericParamImplAnonymous<'db>;
20528 fn untyped(self) -> SyntaxStablePtrId<'db> {
20529 self.0
20530 }
20531 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20532 GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20533 }
20534}
20535impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20536 fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20537 ptr.untyped()
20538 }
20539}
20540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20541pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20542impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20543 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20544 type StablePtr = GenericParamImplAnonymousPtr<'db>;
20545 type Green = GenericParamImplAnonymousGreen<'db>;
20546 fn missing(db: &'db dyn Database) -> Self::Green {
20547 GenericParamImplAnonymousGreen(
20548 GreenNode {
20549 kind: SyntaxKind::GenericParamImplAnonymous,
20550 details: GreenNodeDetails::Node {
20551 children: [
20552 TerminalPlus::missing(db).0,
20553 ExprPath::missing(db).0,
20554 OptionAssociatedItemConstraints::missing(db).0,
20555 ]
20556 .into(),
20557 width: TextWidth::default(),
20558 },
20559 }
20560 .intern(db),
20561 )
20562 }
20563 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20564 let kind = node.kind(db);
20565 assert_eq!(
20566 kind,
20567 SyntaxKind::GenericParamImplAnonymous,
20568 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20569 kind,
20570 SyntaxKind::GenericParamImplAnonymous
20571 );
20572 Self { node }
20573 }
20574 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20575 let kind = node.kind(db);
20576 if kind == SyntaxKind::GenericParamImplAnonymous {
20577 Some(Self::from_syntax_node(db, node))
20578 } else {
20579 None
20580 }
20581 }
20582 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20583 self.node
20584 }
20585 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20586 GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20587 }
20588}
20589#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20590pub struct GenericParamNegativeImpl<'db> {
20591 node: SyntaxNode<'db>,
20592}
20593impl<'db> GenericParamNegativeImpl<'db> {
20594 pub const INDEX_MINUS: usize = 0;
20595 pub const INDEX_TRAIT_PATH: usize = 1;
20596 pub fn new_green(
20597 db: &'db dyn Database,
20598 minus: TerminalMinusGreen<'db>,
20599 trait_path: ExprPathGreen<'db>,
20600 ) -> GenericParamNegativeImplGreen<'db> {
20601 let children = [minus.0, trait_path.0];
20602 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20603 GenericParamNegativeImplGreen(
20604 GreenNode {
20605 kind: SyntaxKind::GenericParamNegativeImpl,
20606 details: GreenNodeDetails::Node { children: children.into(), width },
20607 }
20608 .intern(db),
20609 )
20610 }
20611}
20612impl<'db> GenericParamNegativeImpl<'db> {
20613 pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
20614 TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
20615 }
20616 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20617 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20618 }
20619}
20620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20621pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
20622impl<'db> GenericParamNegativeImplPtr<'db> {}
20623impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
20624 type SyntaxNode = GenericParamNegativeImpl<'db>;
20625 fn untyped(self) -> SyntaxStablePtrId<'db> {
20626 self.0
20627 }
20628 fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
20629 GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
20630 }
20631}
20632impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
20633 fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
20634 ptr.untyped()
20635 }
20636}
20637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20638pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
20639impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
20640 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
20641 type StablePtr = GenericParamNegativeImplPtr<'db>;
20642 type Green = GenericParamNegativeImplGreen<'db>;
20643 fn missing(db: &'db dyn Database) -> Self::Green {
20644 GenericParamNegativeImplGreen(
20645 GreenNode {
20646 kind: SyntaxKind::GenericParamNegativeImpl,
20647 details: GreenNodeDetails::Node {
20648 children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
20649 width: TextWidth::default(),
20650 },
20651 }
20652 .intern(db),
20653 )
20654 }
20655 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20656 let kind = node.kind(db);
20657 assert_eq!(
20658 kind,
20659 SyntaxKind::GenericParamNegativeImpl,
20660 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20661 kind,
20662 SyntaxKind::GenericParamNegativeImpl
20663 );
20664 Self { node }
20665 }
20666 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20667 let kind = node.kind(db);
20668 if kind == SyntaxKind::GenericParamNegativeImpl {
20669 Some(Self::from_syntax_node(db, node))
20670 } else {
20671 None
20672 }
20673 }
20674 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20675 self.node
20676 }
20677 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20678 GenericParamNegativeImplPtr(self.node.stable_ptr(db))
20679 }
20680}
20681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20682pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
20683impl<'db> Deref for TokenList<'db> {
20684 type Target = ElementList<'db, TokenTree<'db>, 1>;
20685 fn deref(&self) -> &Self::Target {
20686 &self.0
20687 }
20688}
20689impl<'db> TokenList<'db> {
20690 pub fn new_green(
20691 db: &'db dyn Database,
20692 children: &[TokenTreeGreen<'db>],
20693 ) -> TokenListGreen<'db> {
20694 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
20695 TokenListGreen(
20696 GreenNode {
20697 kind: SyntaxKind::TokenList,
20698 details: GreenNodeDetails::Node {
20699 children: children.iter().map(|x| x.0).collect(),
20700 width,
20701 },
20702 }
20703 .intern(db),
20704 )
20705 }
20706}
20707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20708pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
20709impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
20710 type SyntaxNode = TokenList<'db>;
20711 fn untyped(self) -> SyntaxStablePtrId<'db> {
20712 self.0
20713 }
20714 fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
20715 TokenList::from_syntax_node(db, self.0.lookup(db))
20716 }
20717}
20718impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
20719 fn from(ptr: TokenListPtr<'db>) -> Self {
20720 ptr.untyped()
20721 }
20722}
20723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20724pub struct TokenListGreen<'db>(pub GreenId<'db>);
20725impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
20726 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
20727 type StablePtr = TokenListPtr<'db>;
20728 type Green = TokenListGreen<'db>;
20729 fn missing(db: &'db dyn Database) -> Self::Green {
20730 TokenListGreen(
20731 GreenNode {
20732 kind: SyntaxKind::TokenList,
20733 details: GreenNodeDetails::Node {
20734 children: [].into(),
20735 width: TextWidth::default(),
20736 },
20737 }
20738 .intern(db),
20739 )
20740 }
20741 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20742 Self(ElementList::new(node))
20743 }
20744 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20745 if node.kind(db) == SyntaxKind::TokenList {
20746 Some(Self(ElementList::new(node)))
20747 } else {
20748 None
20749 }
20750 }
20751 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20752 self.node
20753 }
20754 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20755 TokenListPtr(self.node.stable_ptr(db))
20756 }
20757}
20758#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20759pub struct TokenTreeLeaf<'db> {
20760 node: SyntaxNode<'db>,
20761}
20762impl<'db> TokenTreeLeaf<'db> {
20763 pub const INDEX_LEAF: usize = 0;
20764 pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
20765 let children = [leaf.0];
20766 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20767 TokenTreeLeafGreen(
20768 GreenNode {
20769 kind: SyntaxKind::TokenTreeLeaf,
20770 details: GreenNodeDetails::Node { children: children.into(), width },
20771 }
20772 .intern(db),
20773 )
20774 }
20775}
20776impl<'db> TokenTreeLeaf<'db> {
20777 pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
20778 TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
20779 }
20780}
20781#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20782pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
20783impl<'db> TokenTreeLeafPtr<'db> {}
20784impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
20785 type SyntaxNode = TokenTreeLeaf<'db>;
20786 fn untyped(self) -> SyntaxStablePtrId<'db> {
20787 self.0
20788 }
20789 fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
20790 TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
20791 }
20792}
20793impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
20794 fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
20795 ptr.untyped()
20796 }
20797}
20798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20799pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
20800impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
20801 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
20802 type StablePtr = TokenTreeLeafPtr<'db>;
20803 type Green = TokenTreeLeafGreen<'db>;
20804 fn missing(db: &'db dyn Database) -> Self::Green {
20805 TokenTreeLeafGreen(
20806 GreenNode {
20807 kind: SyntaxKind::TokenTreeLeaf,
20808 details: GreenNodeDetails::Node {
20809 children: [TokenNode::missing(db).0].into(),
20810 width: TextWidth::default(),
20811 },
20812 }
20813 .intern(db),
20814 )
20815 }
20816 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20817 let kind = node.kind(db);
20818 assert_eq!(
20819 kind,
20820 SyntaxKind::TokenTreeLeaf,
20821 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20822 kind,
20823 SyntaxKind::TokenTreeLeaf
20824 );
20825 Self { node }
20826 }
20827 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20828 let kind = node.kind(db);
20829 if kind == SyntaxKind::TokenTreeLeaf {
20830 Some(Self::from_syntax_node(db, node))
20831 } else {
20832 None
20833 }
20834 }
20835 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20836 self.node
20837 }
20838 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20839 TokenTreeLeafPtr(self.node.stable_ptr(db))
20840 }
20841}
20842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20843pub struct TokenTreeNode<'db> {
20844 node: SyntaxNode<'db>,
20845}
20846impl<'db> TokenTreeNode<'db> {
20847 pub const INDEX_SUBTREE: usize = 0;
20848 pub fn new_green(
20849 db: &'db dyn Database,
20850 subtree: WrappedTokenTreeGreen<'db>,
20851 ) -> TokenTreeNodeGreen<'db> {
20852 let children = [subtree.0];
20853 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20854 TokenTreeNodeGreen(
20855 GreenNode {
20856 kind: SyntaxKind::TokenTreeNode,
20857 details: GreenNodeDetails::Node { children: children.into(), width },
20858 }
20859 .intern(db),
20860 )
20861 }
20862}
20863impl<'db> TokenTreeNode<'db> {
20864 pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
20865 WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
20866 }
20867}
20868#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20869pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
20870impl<'db> TokenTreeNodePtr<'db> {}
20871impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
20872 type SyntaxNode = TokenTreeNode<'db>;
20873 fn untyped(self) -> SyntaxStablePtrId<'db> {
20874 self.0
20875 }
20876 fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
20877 TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
20878 }
20879}
20880impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
20881 fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
20882 ptr.untyped()
20883 }
20884}
20885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20886pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
20887impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
20888 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
20889 type StablePtr = TokenTreeNodePtr<'db>;
20890 type Green = TokenTreeNodeGreen<'db>;
20891 fn missing(db: &'db dyn Database) -> Self::Green {
20892 TokenTreeNodeGreen(
20893 GreenNode {
20894 kind: SyntaxKind::TokenTreeNode,
20895 details: GreenNodeDetails::Node {
20896 children: [WrappedTokenTree::missing(db).0].into(),
20897 width: TextWidth::default(),
20898 },
20899 }
20900 .intern(db),
20901 )
20902 }
20903 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20904 let kind = node.kind(db);
20905 assert_eq!(
20906 kind,
20907 SyntaxKind::TokenTreeNode,
20908 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20909 kind,
20910 SyntaxKind::TokenTreeNode
20911 );
20912 Self { node }
20913 }
20914 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20915 let kind = node.kind(db);
20916 if kind == SyntaxKind::TokenTreeNode {
20917 Some(Self::from_syntax_node(db, node))
20918 } else {
20919 None
20920 }
20921 }
20922 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20923 self.node
20924 }
20925 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20926 TokenTreeNodePtr(self.node.stable_ptr(db))
20927 }
20928}
20929#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20930pub struct TokenTreeRepetition<'db> {
20931 node: SyntaxNode<'db>,
20932}
20933impl<'db> TokenTreeRepetition<'db> {
20934 pub const INDEX_DOLLAR: usize = 0;
20935 pub const INDEX_LPAREN: usize = 1;
20936 pub const INDEX_ELEMENTS: usize = 2;
20937 pub const INDEX_RPAREN: usize = 3;
20938 pub const INDEX_SEPARATOR: usize = 4;
20939 pub const INDEX_OPERATOR: usize = 5;
20940 pub fn new_green(
20941 db: &'db dyn Database,
20942 dollar: TerminalDollarGreen<'db>,
20943 lparen: TerminalLParenGreen<'db>,
20944 elements: TokenListGreen<'db>,
20945 rparen: TerminalRParenGreen<'db>,
20946 separator: OptionTerminalCommaGreen<'db>,
20947 operator: MacroRepetitionOperatorGreen<'db>,
20948 ) -> TokenTreeRepetitionGreen<'db> {
20949 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
20950 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20951 TokenTreeRepetitionGreen(
20952 GreenNode {
20953 kind: SyntaxKind::TokenTreeRepetition,
20954 details: GreenNodeDetails::Node { children: children.into(), width },
20955 }
20956 .intern(db),
20957 )
20958 }
20959}
20960impl<'db> TokenTreeRepetition<'db> {
20961 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
20962 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
20963 }
20964 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
20965 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
20966 }
20967 pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
20968 TokenList::from_syntax_node(db, self.node.get_children(db)[2])
20969 }
20970 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
20971 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
20972 }
20973 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
20974 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
20975 }
20976 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
20977 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
20978 }
20979}
20980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20981pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
20982impl<'db> TokenTreeRepetitionPtr<'db> {}
20983impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
20984 type SyntaxNode = TokenTreeRepetition<'db>;
20985 fn untyped(self) -> SyntaxStablePtrId<'db> {
20986 self.0
20987 }
20988 fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
20989 TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
20990 }
20991}
20992impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
20993 fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
20994 ptr.untyped()
20995 }
20996}
20997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20998pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
20999impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21000 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21001 type StablePtr = TokenTreeRepetitionPtr<'db>;
21002 type Green = TokenTreeRepetitionGreen<'db>;
21003 fn missing(db: &'db dyn Database) -> Self::Green {
21004 TokenTreeRepetitionGreen(
21005 GreenNode {
21006 kind: SyntaxKind::TokenTreeRepetition,
21007 details: GreenNodeDetails::Node {
21008 children: [
21009 TerminalDollar::missing(db).0,
21010 TerminalLParen::missing(db).0,
21011 TokenList::missing(db).0,
21012 TerminalRParen::missing(db).0,
21013 OptionTerminalComma::missing(db).0,
21014 MacroRepetitionOperator::missing(db).0,
21015 ]
21016 .into(),
21017 width: TextWidth::default(),
21018 },
21019 }
21020 .intern(db),
21021 )
21022 }
21023 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21024 let kind = node.kind(db);
21025 assert_eq!(
21026 kind,
21027 SyntaxKind::TokenTreeRepetition,
21028 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21029 kind,
21030 SyntaxKind::TokenTreeRepetition
21031 );
21032 Self { node }
21033 }
21034 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21035 let kind = node.kind(db);
21036 if kind == SyntaxKind::TokenTreeRepetition {
21037 Some(Self::from_syntax_node(db, node))
21038 } else {
21039 None
21040 }
21041 }
21042 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21043 self.node
21044 }
21045 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21046 TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21047 }
21048}
21049#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21050pub struct TokenTreeParam<'db> {
21051 node: SyntaxNode<'db>,
21052}
21053impl<'db> TokenTreeParam<'db> {
21054 pub const INDEX_DOLLAR: usize = 0;
21055 pub const INDEX_NAME: usize = 1;
21056 pub fn new_green(
21057 db: &'db dyn Database,
21058 dollar: TerminalDollarGreen<'db>,
21059 name: TerminalIdentifierGreen<'db>,
21060 ) -> TokenTreeParamGreen<'db> {
21061 let children = [dollar.0, name.0];
21062 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21063 TokenTreeParamGreen(
21064 GreenNode {
21065 kind: SyntaxKind::TokenTreeParam,
21066 details: GreenNodeDetails::Node { children: children.into(), width },
21067 }
21068 .intern(db),
21069 )
21070 }
21071}
21072impl<'db> TokenTreeParam<'db> {
21073 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21074 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21075 }
21076 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21077 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21078 }
21079}
21080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21081pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21082impl<'db> TokenTreeParamPtr<'db> {}
21083impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21084 type SyntaxNode = TokenTreeParam<'db>;
21085 fn untyped(self) -> SyntaxStablePtrId<'db> {
21086 self.0
21087 }
21088 fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21089 TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21090 }
21091}
21092impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21093 fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21094 ptr.untyped()
21095 }
21096}
21097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21098pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21099impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21100 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21101 type StablePtr = TokenTreeParamPtr<'db>;
21102 type Green = TokenTreeParamGreen<'db>;
21103 fn missing(db: &'db dyn Database) -> Self::Green {
21104 TokenTreeParamGreen(
21105 GreenNode {
21106 kind: SyntaxKind::TokenTreeParam,
21107 details: GreenNodeDetails::Node {
21108 children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21109 .into(),
21110 width: TextWidth::default(),
21111 },
21112 }
21113 .intern(db),
21114 )
21115 }
21116 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21117 let kind = node.kind(db);
21118 assert_eq!(
21119 kind,
21120 SyntaxKind::TokenTreeParam,
21121 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21122 kind,
21123 SyntaxKind::TokenTreeParam
21124 );
21125 Self { node }
21126 }
21127 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21128 let kind = node.kind(db);
21129 if kind == SyntaxKind::TokenTreeParam {
21130 Some(Self::from_syntax_node(db, node))
21131 } else {
21132 None
21133 }
21134 }
21135 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21136 self.node
21137 }
21138 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21139 TokenTreeParamPtr(self.node.stable_ptr(db))
21140 }
21141}
21142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21143pub enum TokenTree<'db> {
21144 Token(TokenTreeLeaf<'db>),
21145 Subtree(TokenTreeNode<'db>),
21146 Repetition(TokenTreeRepetition<'db>),
21147 Param(TokenTreeParam<'db>),
21148 Missing(TokenTreeMissing<'db>),
21149}
21150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21151pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21152impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21153 type SyntaxNode = TokenTree<'db>;
21154 fn untyped(self) -> SyntaxStablePtrId<'db> {
21155 self.0
21156 }
21157 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21158 TokenTree::from_syntax_node(db, self.0.lookup(db))
21159 }
21160}
21161impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21162 fn from(ptr: TokenTreePtr<'db>) -> Self {
21163 ptr.untyped()
21164 }
21165}
21166impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21167 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21168 Self(value.0)
21169 }
21170}
21171impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21172 fn from(value: TokenTreeNodePtr<'db>) -> Self {
21173 Self(value.0)
21174 }
21175}
21176impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21177 fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21178 Self(value.0)
21179 }
21180}
21181impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21182 fn from(value: TokenTreeParamPtr<'db>) -> Self {
21183 Self(value.0)
21184 }
21185}
21186impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21187 fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21188 Self(value.0)
21189 }
21190}
21191impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21192 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21193 Self(value.0)
21194 }
21195}
21196impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21197 fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21198 Self(value.0)
21199 }
21200}
21201impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21202 fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21203 Self(value.0)
21204 }
21205}
21206impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21207 fn from(value: TokenTreeParamGreen<'db>) -> Self {
21208 Self(value.0)
21209 }
21210}
21211impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21212 fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21213 Self(value.0)
21214 }
21215}
21216#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21217pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21218impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21219 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21220 type StablePtr = TokenTreePtr<'db>;
21221 type Green = TokenTreeGreen<'db>;
21222 fn missing(db: &'db dyn Database) -> Self::Green {
21223 TokenTreeGreen(TokenTreeMissing::missing(db).0)
21224 }
21225 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21226 let kind = node.kind(db);
21227 match kind {
21228 SyntaxKind::TokenTreeLeaf => {
21229 TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21230 }
21231 SyntaxKind::TokenTreeNode => {
21232 TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21233 }
21234 SyntaxKind::TokenTreeRepetition => {
21235 TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21236 }
21237 SyntaxKind::TokenTreeParam => {
21238 TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21239 }
21240 SyntaxKind::TokenTreeMissing => {
21241 TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21242 }
21243 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21244 }
21245 }
21246 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21247 let kind = node.kind(db);
21248 match kind {
21249 SyntaxKind::TokenTreeLeaf => {
21250 Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21251 }
21252 SyntaxKind::TokenTreeNode => {
21253 Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21254 }
21255 SyntaxKind::TokenTreeRepetition => {
21256 Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21257 }
21258 SyntaxKind::TokenTreeParam => {
21259 Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21260 }
21261 SyntaxKind::TokenTreeMissing => {
21262 Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21263 }
21264 _ => None,
21265 }
21266 }
21267 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21268 match self {
21269 TokenTree::Token(x) => x.as_syntax_node(),
21270 TokenTree::Subtree(x) => x.as_syntax_node(),
21271 TokenTree::Repetition(x) => x.as_syntax_node(),
21272 TokenTree::Param(x) => x.as_syntax_node(),
21273 TokenTree::Missing(x) => x.as_syntax_node(),
21274 }
21275 }
21276 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21277 TokenTreePtr(self.as_syntax_node().stable_ptr(db))
21278 }
21279}
21280impl<'db> TokenTree<'db> {
21281 pub fn is_variant(kind: SyntaxKind) -> bool {
21283 matches!(
21284 kind,
21285 SyntaxKind::TokenTreeLeaf
21286 | SyntaxKind::TokenTreeNode
21287 | SyntaxKind::TokenTreeRepetition
21288 | SyntaxKind::TokenTreeParam
21289 | SyntaxKind::TokenTreeMissing
21290 )
21291 }
21292}
21293#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21294pub struct TokenTreeMissing<'db> {
21295 node: SyntaxNode<'db>,
21296}
21297impl<'db> TokenTreeMissing<'db> {
21298 pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21299 let children = [];
21300 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21301 TokenTreeMissingGreen(
21302 GreenNode {
21303 kind: SyntaxKind::TokenTreeMissing,
21304 details: GreenNodeDetails::Node { children: children.into(), width },
21305 }
21306 .intern(db),
21307 )
21308 }
21309}
21310impl<'db> TokenTreeMissing<'db> {}
21311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21312pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21313impl<'db> TokenTreeMissingPtr<'db> {}
21314impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21315 type SyntaxNode = TokenTreeMissing<'db>;
21316 fn untyped(self) -> SyntaxStablePtrId<'db> {
21317 self.0
21318 }
21319 fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21320 TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21321 }
21322}
21323impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21324 fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21325 ptr.untyped()
21326 }
21327}
21328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21329pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21330impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21331 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21332 type StablePtr = TokenTreeMissingPtr<'db>;
21333 type Green = TokenTreeMissingGreen<'db>;
21334 fn missing(db: &'db dyn Database) -> Self::Green {
21335 TokenTreeMissingGreen(
21336 GreenNode {
21337 kind: SyntaxKind::TokenTreeMissing,
21338 details: GreenNodeDetails::Node {
21339 children: [].into(),
21340 width: TextWidth::default(),
21341 },
21342 }
21343 .intern(db),
21344 )
21345 }
21346 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21347 let kind = node.kind(db);
21348 assert_eq!(
21349 kind,
21350 SyntaxKind::TokenTreeMissing,
21351 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21352 kind,
21353 SyntaxKind::TokenTreeMissing
21354 );
21355 Self { node }
21356 }
21357 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21358 let kind = node.kind(db);
21359 if kind == SyntaxKind::TokenTreeMissing {
21360 Some(Self::from_syntax_node(db, node))
21361 } else {
21362 None
21363 }
21364 }
21365 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21366 self.node
21367 }
21368 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21369 TokenTreeMissingPtr(self.node.stable_ptr(db))
21370 }
21371}
21372#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21373pub enum WrappedTokenTree<'db> {
21374 Parenthesized(ParenthesizedTokenTree<'db>),
21375 Braced(BracedTokenTree<'db>),
21376 Bracketed(BracketedTokenTree<'db>),
21377 Missing(WrappedTokenTreeMissing<'db>),
21378}
21379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21380pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21381impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21382 type SyntaxNode = WrappedTokenTree<'db>;
21383 fn untyped(self) -> SyntaxStablePtrId<'db> {
21384 self.0
21385 }
21386 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21387 WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21388 }
21389}
21390impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21391 fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21392 ptr.untyped()
21393 }
21394}
21395impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21396 fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21397 Self(value.0)
21398 }
21399}
21400impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21401 fn from(value: BracedTokenTreePtr<'db>) -> Self {
21402 Self(value.0)
21403 }
21404}
21405impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21406 fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21407 Self(value.0)
21408 }
21409}
21410impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21411 fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21412 Self(value.0)
21413 }
21414}
21415impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21416 fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21417 Self(value.0)
21418 }
21419}
21420impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21421 fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21422 Self(value.0)
21423 }
21424}
21425impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21426 fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21427 Self(value.0)
21428 }
21429}
21430impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21431 fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21432 Self(value.0)
21433 }
21434}
21435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21436pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21437impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21438 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21439 type StablePtr = WrappedTokenTreePtr<'db>;
21440 type Green = WrappedTokenTreeGreen<'db>;
21441 fn missing(db: &'db dyn Database) -> Self::Green {
21442 WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21443 }
21444 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21445 let kind = node.kind(db);
21446 match kind {
21447 SyntaxKind::ParenthesizedTokenTree => {
21448 WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21449 }
21450 SyntaxKind::BracedTokenTree => {
21451 WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21452 }
21453 SyntaxKind::BracketedTokenTree => {
21454 WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21455 }
21456 SyntaxKind::WrappedTokenTreeMissing => {
21457 WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21458 }
21459 _ => panic!(
21460 "Unexpected syntax kind {:?} when constructing {}.",
21461 kind, "WrappedTokenTree"
21462 ),
21463 }
21464 }
21465 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21466 let kind = node.kind(db);
21467 match kind {
21468 SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21469 ParenthesizedTokenTree::from_syntax_node(db, node),
21470 )),
21471 SyntaxKind::BracedTokenTree => {
21472 Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21473 }
21474 SyntaxKind::BracketedTokenTree => {
21475 Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21476 }
21477 SyntaxKind::WrappedTokenTreeMissing => {
21478 Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21479 }
21480 _ => None,
21481 }
21482 }
21483 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21484 match self {
21485 WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21486 WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21487 WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21488 WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21489 }
21490 }
21491 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21492 WrappedTokenTreePtr(self.as_syntax_node().stable_ptr(db))
21493 }
21494}
21495impl<'db> WrappedTokenTree<'db> {
21496 pub fn is_variant(kind: SyntaxKind) -> bool {
21498 matches!(
21499 kind,
21500 SyntaxKind::ParenthesizedTokenTree
21501 | SyntaxKind::BracedTokenTree
21502 | SyntaxKind::BracketedTokenTree
21503 | SyntaxKind::WrappedTokenTreeMissing
21504 )
21505 }
21506}
21507#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21508pub struct WrappedTokenTreeMissing<'db> {
21509 node: SyntaxNode<'db>,
21510}
21511impl<'db> WrappedTokenTreeMissing<'db> {
21512 pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21513 let children = [];
21514 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21515 WrappedTokenTreeMissingGreen(
21516 GreenNode {
21517 kind: SyntaxKind::WrappedTokenTreeMissing,
21518 details: GreenNodeDetails::Node { children: children.into(), width },
21519 }
21520 .intern(db),
21521 )
21522 }
21523}
21524impl<'db> WrappedTokenTreeMissing<'db> {}
21525#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21526pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21527impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21528impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21529 type SyntaxNode = WrappedTokenTreeMissing<'db>;
21530 fn untyped(self) -> SyntaxStablePtrId<'db> {
21531 self.0
21532 }
21533 fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21534 WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21535 }
21536}
21537impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21538 fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21539 ptr.untyped()
21540 }
21541}
21542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21543pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21544impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21545 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21546 type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21547 type Green = WrappedTokenTreeMissingGreen<'db>;
21548 fn missing(db: &'db dyn Database) -> Self::Green {
21549 WrappedTokenTreeMissingGreen(
21550 GreenNode {
21551 kind: SyntaxKind::WrappedTokenTreeMissing,
21552 details: GreenNodeDetails::Node {
21553 children: [].into(),
21554 width: TextWidth::default(),
21555 },
21556 }
21557 .intern(db),
21558 )
21559 }
21560 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21561 let kind = node.kind(db);
21562 assert_eq!(
21563 kind,
21564 SyntaxKind::WrappedTokenTreeMissing,
21565 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21566 kind,
21567 SyntaxKind::WrappedTokenTreeMissing
21568 );
21569 Self { node }
21570 }
21571 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21572 let kind = node.kind(db);
21573 if kind == SyntaxKind::WrappedTokenTreeMissing {
21574 Some(Self::from_syntax_node(db, node))
21575 } else {
21576 None
21577 }
21578 }
21579 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21580 self.node
21581 }
21582 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21583 WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21584 }
21585}
21586#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21587pub struct ParenthesizedTokenTree<'db> {
21588 node: SyntaxNode<'db>,
21589}
21590impl<'db> ParenthesizedTokenTree<'db> {
21591 pub const INDEX_LPAREN: usize = 0;
21592 pub const INDEX_TOKENS: usize = 1;
21593 pub const INDEX_RPAREN: usize = 2;
21594 pub fn new_green(
21595 db: &'db dyn Database,
21596 lparen: TerminalLParenGreen<'db>,
21597 tokens: TokenListGreen<'db>,
21598 rparen: TerminalRParenGreen<'db>,
21599 ) -> ParenthesizedTokenTreeGreen<'db> {
21600 let children = [lparen.0, tokens.0, rparen.0];
21601 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21602 ParenthesizedTokenTreeGreen(
21603 GreenNode {
21604 kind: SyntaxKind::ParenthesizedTokenTree,
21605 details: GreenNodeDetails::Node { children: children.into(), width },
21606 }
21607 .intern(db),
21608 )
21609 }
21610}
21611impl<'db> ParenthesizedTokenTree<'db> {
21612 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21613 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
21614 }
21615 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21616 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21617 }
21618 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21619 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
21620 }
21621}
21622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21623pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21624impl<'db> ParenthesizedTokenTreePtr<'db> {}
21625impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
21626 type SyntaxNode = ParenthesizedTokenTree<'db>;
21627 fn untyped(self) -> SyntaxStablePtrId<'db> {
21628 self.0
21629 }
21630 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
21631 ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
21632 }
21633}
21634impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21635 fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
21636 ptr.untyped()
21637 }
21638}
21639#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21640pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
21641impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
21642 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
21643 type StablePtr = ParenthesizedTokenTreePtr<'db>;
21644 type Green = ParenthesizedTokenTreeGreen<'db>;
21645 fn missing(db: &'db dyn Database) -> Self::Green {
21646 ParenthesizedTokenTreeGreen(
21647 GreenNode {
21648 kind: SyntaxKind::ParenthesizedTokenTree,
21649 details: GreenNodeDetails::Node {
21650 children: [
21651 TerminalLParen::missing(db).0,
21652 TokenList::missing(db).0,
21653 TerminalRParen::missing(db).0,
21654 ]
21655 .into(),
21656 width: TextWidth::default(),
21657 },
21658 }
21659 .intern(db),
21660 )
21661 }
21662 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21663 let kind = node.kind(db);
21664 assert_eq!(
21665 kind,
21666 SyntaxKind::ParenthesizedTokenTree,
21667 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21668 kind,
21669 SyntaxKind::ParenthesizedTokenTree
21670 );
21671 Self { node }
21672 }
21673 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21674 let kind = node.kind(db);
21675 if kind == SyntaxKind::ParenthesizedTokenTree {
21676 Some(Self::from_syntax_node(db, node))
21677 } else {
21678 None
21679 }
21680 }
21681 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21682 self.node
21683 }
21684 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21685 ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
21686 }
21687}
21688#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21689pub struct BracedTokenTree<'db> {
21690 node: SyntaxNode<'db>,
21691}
21692impl<'db> BracedTokenTree<'db> {
21693 pub const INDEX_LBRACE: usize = 0;
21694 pub const INDEX_TOKENS: usize = 1;
21695 pub const INDEX_RBRACE: usize = 2;
21696 pub fn new_green(
21697 db: &'db dyn Database,
21698 lbrace: TerminalLBraceGreen<'db>,
21699 tokens: TokenListGreen<'db>,
21700 rbrace: TerminalRBraceGreen<'db>,
21701 ) -> BracedTokenTreeGreen<'db> {
21702 let children = [lbrace.0, tokens.0, rbrace.0];
21703 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21704 BracedTokenTreeGreen(
21705 GreenNode {
21706 kind: SyntaxKind::BracedTokenTree,
21707 details: GreenNodeDetails::Node { children: children.into(), width },
21708 }
21709 .intern(db),
21710 )
21711 }
21712}
21713impl<'db> BracedTokenTree<'db> {
21714 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
21715 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
21716 }
21717 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21718 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21719 }
21720 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
21721 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
21722 }
21723}
21724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21725pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21726impl<'db> BracedTokenTreePtr<'db> {}
21727impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
21728 type SyntaxNode = BracedTokenTree<'db>;
21729 fn untyped(self) -> SyntaxStablePtrId<'db> {
21730 self.0
21731 }
21732 fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
21733 BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
21734 }
21735}
21736impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21737 fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
21738 ptr.untyped()
21739 }
21740}
21741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21742pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
21743impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
21744 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
21745 type StablePtr = BracedTokenTreePtr<'db>;
21746 type Green = BracedTokenTreeGreen<'db>;
21747 fn missing(db: &'db dyn Database) -> Self::Green {
21748 BracedTokenTreeGreen(
21749 GreenNode {
21750 kind: SyntaxKind::BracedTokenTree,
21751 details: GreenNodeDetails::Node {
21752 children: [
21753 TerminalLBrace::missing(db).0,
21754 TokenList::missing(db).0,
21755 TerminalRBrace::missing(db).0,
21756 ]
21757 .into(),
21758 width: TextWidth::default(),
21759 },
21760 }
21761 .intern(db),
21762 )
21763 }
21764 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21765 let kind = node.kind(db);
21766 assert_eq!(
21767 kind,
21768 SyntaxKind::BracedTokenTree,
21769 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21770 kind,
21771 SyntaxKind::BracedTokenTree
21772 );
21773 Self { node }
21774 }
21775 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21776 let kind = node.kind(db);
21777 if kind == SyntaxKind::BracedTokenTree {
21778 Some(Self::from_syntax_node(db, node))
21779 } else {
21780 None
21781 }
21782 }
21783 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21784 self.node
21785 }
21786 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21787 BracedTokenTreePtr(self.node.stable_ptr(db))
21788 }
21789}
21790#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21791pub struct BracketedTokenTree<'db> {
21792 node: SyntaxNode<'db>,
21793}
21794impl<'db> BracketedTokenTree<'db> {
21795 pub const INDEX_LBRACK: usize = 0;
21796 pub const INDEX_TOKENS: usize = 1;
21797 pub const INDEX_RBRACK: usize = 2;
21798 pub fn new_green(
21799 db: &'db dyn Database,
21800 lbrack: TerminalLBrackGreen<'db>,
21801 tokens: TokenListGreen<'db>,
21802 rbrack: TerminalRBrackGreen<'db>,
21803 ) -> BracketedTokenTreeGreen<'db> {
21804 let children = [lbrack.0, tokens.0, rbrack.0];
21805 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21806 BracketedTokenTreeGreen(
21807 GreenNode {
21808 kind: SyntaxKind::BracketedTokenTree,
21809 details: GreenNodeDetails::Node { children: children.into(), width },
21810 }
21811 .intern(db),
21812 )
21813 }
21814}
21815impl<'db> BracketedTokenTree<'db> {
21816 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
21817 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
21818 }
21819 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21820 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21821 }
21822 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
21823 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
21824 }
21825}
21826#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21827pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21828impl<'db> BracketedTokenTreePtr<'db> {}
21829impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
21830 type SyntaxNode = BracketedTokenTree<'db>;
21831 fn untyped(self) -> SyntaxStablePtrId<'db> {
21832 self.0
21833 }
21834 fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
21835 BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
21836 }
21837}
21838impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21839 fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
21840 ptr.untyped()
21841 }
21842}
21843#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21844pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
21845impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
21846 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
21847 type StablePtr = BracketedTokenTreePtr<'db>;
21848 type Green = BracketedTokenTreeGreen<'db>;
21849 fn missing(db: &'db dyn Database) -> Self::Green {
21850 BracketedTokenTreeGreen(
21851 GreenNode {
21852 kind: SyntaxKind::BracketedTokenTree,
21853 details: GreenNodeDetails::Node {
21854 children: [
21855 TerminalLBrack::missing(db).0,
21856 TokenList::missing(db).0,
21857 TerminalRBrack::missing(db).0,
21858 ]
21859 .into(),
21860 width: TextWidth::default(),
21861 },
21862 }
21863 .intern(db),
21864 )
21865 }
21866 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21867 let kind = node.kind(db);
21868 assert_eq!(
21869 kind,
21870 SyntaxKind::BracketedTokenTree,
21871 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21872 kind,
21873 SyntaxKind::BracketedTokenTree
21874 );
21875 Self { node }
21876 }
21877 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21878 let kind = node.kind(db);
21879 if kind == SyntaxKind::BracketedTokenTree {
21880 Some(Self::from_syntax_node(db, node))
21881 } else {
21882 None
21883 }
21884 }
21885 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21886 self.node
21887 }
21888 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21889 BracketedTokenTreePtr(self.node.stable_ptr(db))
21890 }
21891}
21892#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21893pub struct ExprInlineMacro<'db> {
21894 node: SyntaxNode<'db>,
21895}
21896impl<'db> ExprInlineMacro<'db> {
21897 pub const INDEX_PATH: usize = 0;
21898 pub const INDEX_BANG: usize = 1;
21899 pub const INDEX_ARGUMENTS: usize = 2;
21900 pub fn new_green(
21901 db: &'db dyn Database,
21902 path: ExprPathGreen<'db>,
21903 bang: TerminalNotGreen<'db>,
21904 arguments: TokenTreeNodeGreen<'db>,
21905 ) -> ExprInlineMacroGreen<'db> {
21906 let children = [path.0, bang.0, arguments.0];
21907 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21908 ExprInlineMacroGreen(
21909 GreenNode {
21910 kind: SyntaxKind::ExprInlineMacro,
21911 details: GreenNodeDetails::Node { children: children.into(), width },
21912 }
21913 .intern(db),
21914 )
21915 }
21916}
21917impl<'db> ExprInlineMacro<'db> {
21918 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
21919 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
21920 }
21921 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
21922 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
21923 }
21924 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21925 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
21926 }
21927}
21928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21929pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
21930impl<'db> ExprInlineMacroPtr<'db> {}
21931impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
21932 type SyntaxNode = ExprInlineMacro<'db>;
21933 fn untyped(self) -> SyntaxStablePtrId<'db> {
21934 self.0
21935 }
21936 fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
21937 ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
21938 }
21939}
21940impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
21941 fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
21942 ptr.untyped()
21943 }
21944}
21945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21946pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
21947impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
21948 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
21949 type StablePtr = ExprInlineMacroPtr<'db>;
21950 type Green = ExprInlineMacroGreen<'db>;
21951 fn missing(db: &'db dyn Database) -> Self::Green {
21952 ExprInlineMacroGreen(
21953 GreenNode {
21954 kind: SyntaxKind::ExprInlineMacro,
21955 details: GreenNodeDetails::Node {
21956 children: [
21957 ExprPath::missing(db).0,
21958 TerminalNot::missing(db).0,
21959 TokenTreeNode::missing(db).0,
21960 ]
21961 .into(),
21962 width: TextWidth::default(),
21963 },
21964 }
21965 .intern(db),
21966 )
21967 }
21968 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21969 let kind = node.kind(db);
21970 assert_eq!(
21971 kind,
21972 SyntaxKind::ExprInlineMacro,
21973 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21974 kind,
21975 SyntaxKind::ExprInlineMacro
21976 );
21977 Self { node }
21978 }
21979 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21980 let kind = node.kind(db);
21981 if kind == SyntaxKind::ExprInlineMacro {
21982 Some(Self::from_syntax_node(db, node))
21983 } else {
21984 None
21985 }
21986 }
21987 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21988 self.node
21989 }
21990 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21991 ExprInlineMacroPtr(self.node.stable_ptr(db))
21992 }
21993}
21994#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21995pub struct ItemInlineMacro<'db> {
21996 node: SyntaxNode<'db>,
21997}
21998impl<'db> ItemInlineMacro<'db> {
21999 pub const INDEX_ATTRIBUTES: usize = 0;
22000 pub const INDEX_PATH: usize = 1;
22001 pub const INDEX_BANG: usize = 2;
22002 pub const INDEX_ARGUMENTS: usize = 3;
22003 pub const INDEX_SEMICOLON: usize = 4;
22004 pub fn new_green(
22005 db: &'db dyn Database,
22006 attributes: AttributeListGreen<'db>,
22007 path: ExprPathGreen<'db>,
22008 bang: TerminalNotGreen<'db>,
22009 arguments: TokenTreeNodeGreen<'db>,
22010 semicolon: TerminalSemicolonGreen<'db>,
22011 ) -> ItemInlineMacroGreen<'db> {
22012 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22013 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22014 ItemInlineMacroGreen(
22015 GreenNode {
22016 kind: SyntaxKind::ItemInlineMacro,
22017 details: GreenNodeDetails::Node { children: children.into(), width },
22018 }
22019 .intern(db),
22020 )
22021 }
22022}
22023impl<'db> ItemInlineMacro<'db> {
22024 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22025 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22026 }
22027 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22028 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22029 }
22030 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22031 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22032 }
22033 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22034 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22035 }
22036 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22037 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22038 }
22039}
22040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22041pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22042impl<'db> ItemInlineMacroPtr<'db> {}
22043impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22044 type SyntaxNode = ItemInlineMacro<'db>;
22045 fn untyped(self) -> SyntaxStablePtrId<'db> {
22046 self.0
22047 }
22048 fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22049 ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22050 }
22051}
22052impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22053 fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22054 ptr.untyped()
22055 }
22056}
22057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22058pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22059impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22060 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22061 type StablePtr = ItemInlineMacroPtr<'db>;
22062 type Green = ItemInlineMacroGreen<'db>;
22063 fn missing(db: &'db dyn Database) -> Self::Green {
22064 ItemInlineMacroGreen(
22065 GreenNode {
22066 kind: SyntaxKind::ItemInlineMacro,
22067 details: GreenNodeDetails::Node {
22068 children: [
22069 AttributeList::missing(db).0,
22070 ExprPath::missing(db).0,
22071 TerminalNot::missing(db).0,
22072 TokenTreeNode::missing(db).0,
22073 TerminalSemicolon::missing(db).0,
22074 ]
22075 .into(),
22076 width: TextWidth::default(),
22077 },
22078 }
22079 .intern(db),
22080 )
22081 }
22082 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22083 let kind = node.kind(db);
22084 assert_eq!(
22085 kind,
22086 SyntaxKind::ItemInlineMacro,
22087 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22088 kind,
22089 SyntaxKind::ItemInlineMacro
22090 );
22091 Self { node }
22092 }
22093 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22094 let kind = node.kind(db);
22095 if kind == SyntaxKind::ItemInlineMacro {
22096 Some(Self::from_syntax_node(db, node))
22097 } else {
22098 None
22099 }
22100 }
22101 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22102 self.node
22103 }
22104 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22105 ItemInlineMacroPtr(self.node.stable_ptr(db))
22106 }
22107}
22108#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22109pub struct ItemMacroDeclaration<'db> {
22110 node: SyntaxNode<'db>,
22111}
22112impl<'db> ItemMacroDeclaration<'db> {
22113 pub const INDEX_ATTRIBUTES: usize = 0;
22114 pub const INDEX_VISIBILITY: usize = 1;
22115 pub const INDEX_MACRO_KW: usize = 2;
22116 pub const INDEX_NAME: usize = 3;
22117 pub const INDEX_LBRACE: usize = 4;
22118 pub const INDEX_RULES: usize = 5;
22119 pub const INDEX_RBRACE: usize = 6;
22120 pub fn new_green(
22121 db: &'db dyn Database,
22122 attributes: AttributeListGreen<'db>,
22123 visibility: VisibilityGreen<'db>,
22124 macro_kw: TerminalMacroGreen<'db>,
22125 name: TerminalIdentifierGreen<'db>,
22126 lbrace: TerminalLBraceGreen<'db>,
22127 rules: MacroRulesListGreen<'db>,
22128 rbrace: TerminalRBraceGreen<'db>,
22129 ) -> ItemMacroDeclarationGreen<'db> {
22130 let children =
22131 [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22132 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22133 ItemMacroDeclarationGreen(
22134 GreenNode {
22135 kind: SyntaxKind::ItemMacroDeclaration,
22136 details: GreenNodeDetails::Node { children: children.into(), width },
22137 }
22138 .intern(db),
22139 )
22140 }
22141}
22142impl<'db> ItemMacroDeclaration<'db> {
22143 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22144 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22145 }
22146 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22147 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22148 }
22149 pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22150 TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22151 }
22152 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22153 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22154 }
22155 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22156 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22157 }
22158 pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22159 MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22160 }
22161 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22162 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22163 }
22164}
22165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22166pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22167impl<'db> ItemMacroDeclarationPtr<'db> {
22168 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22169 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
22170 }
22171}
22172impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22173 type SyntaxNode = ItemMacroDeclaration<'db>;
22174 fn untyped(self) -> SyntaxStablePtrId<'db> {
22175 self.0
22176 }
22177 fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22178 ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22179 }
22180}
22181impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22182 fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22183 ptr.untyped()
22184 }
22185}
22186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22187pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22188impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22189 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22190 type StablePtr = ItemMacroDeclarationPtr<'db>;
22191 type Green = ItemMacroDeclarationGreen<'db>;
22192 fn missing(db: &'db dyn Database) -> Self::Green {
22193 ItemMacroDeclarationGreen(
22194 GreenNode {
22195 kind: SyntaxKind::ItemMacroDeclaration,
22196 details: GreenNodeDetails::Node {
22197 children: [
22198 AttributeList::missing(db).0,
22199 Visibility::missing(db).0,
22200 TerminalMacro::missing(db).0,
22201 TerminalIdentifier::missing(db).0,
22202 TerminalLBrace::missing(db).0,
22203 MacroRulesList::missing(db).0,
22204 TerminalRBrace::missing(db).0,
22205 ]
22206 .into(),
22207 width: TextWidth::default(),
22208 },
22209 }
22210 .intern(db),
22211 )
22212 }
22213 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22214 let kind = node.kind(db);
22215 assert_eq!(
22216 kind,
22217 SyntaxKind::ItemMacroDeclaration,
22218 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22219 kind,
22220 SyntaxKind::ItemMacroDeclaration
22221 );
22222 Self { node }
22223 }
22224 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22225 let kind = node.kind(db);
22226 if kind == SyntaxKind::ItemMacroDeclaration {
22227 Some(Self::from_syntax_node(db, node))
22228 } else {
22229 None
22230 }
22231 }
22232 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22233 self.node
22234 }
22235 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22236 ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22237 }
22238}
22239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22240pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22241impl<'db> Deref for MacroRulesList<'db> {
22242 type Target = ElementList<'db, MacroRule<'db>, 1>;
22243 fn deref(&self) -> &Self::Target {
22244 &self.0
22245 }
22246}
22247impl<'db> MacroRulesList<'db> {
22248 pub fn new_green(
22249 db: &'db dyn Database,
22250 children: &[MacroRuleGreen<'db>],
22251 ) -> MacroRulesListGreen<'db> {
22252 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22253 MacroRulesListGreen(
22254 GreenNode {
22255 kind: SyntaxKind::MacroRulesList,
22256 details: GreenNodeDetails::Node {
22257 children: children.iter().map(|x| x.0).collect(),
22258 width,
22259 },
22260 }
22261 .intern(db),
22262 )
22263 }
22264}
22265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22266pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22267impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22268 type SyntaxNode = MacroRulesList<'db>;
22269 fn untyped(self) -> SyntaxStablePtrId<'db> {
22270 self.0
22271 }
22272 fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22273 MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22274 }
22275}
22276impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22277 fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22278 ptr.untyped()
22279 }
22280}
22281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22282pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22283impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22284 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22285 type StablePtr = MacroRulesListPtr<'db>;
22286 type Green = MacroRulesListGreen<'db>;
22287 fn missing(db: &'db dyn Database) -> Self::Green {
22288 MacroRulesListGreen(
22289 GreenNode {
22290 kind: SyntaxKind::MacroRulesList,
22291 details: GreenNodeDetails::Node {
22292 children: [].into(),
22293 width: TextWidth::default(),
22294 },
22295 }
22296 .intern(db),
22297 )
22298 }
22299 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22300 Self(ElementList::new(node))
22301 }
22302 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22303 if node.kind(db) == SyntaxKind::MacroRulesList {
22304 Some(Self(ElementList::new(node)))
22305 } else {
22306 None
22307 }
22308 }
22309 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22310 self.node
22311 }
22312 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22313 MacroRulesListPtr(self.node.stable_ptr(db))
22314 }
22315}
22316#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22317pub struct MacroRule<'db> {
22318 node: SyntaxNode<'db>,
22319}
22320impl<'db> MacroRule<'db> {
22321 pub const INDEX_LHS: usize = 0;
22322 pub const INDEX_FAT_ARROW: usize = 1;
22323 pub const INDEX_RHS: usize = 2;
22324 pub const INDEX_SEMICOLON: usize = 3;
22325 pub fn new_green(
22326 db: &'db dyn Database,
22327 lhs: WrappedMacroGreen<'db>,
22328 fat_arrow: TerminalMatchArrowGreen<'db>,
22329 rhs: BracedMacroGreen<'db>,
22330 semicolon: TerminalSemicolonGreen<'db>,
22331 ) -> MacroRuleGreen<'db> {
22332 let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22333 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22334 MacroRuleGreen(
22335 GreenNode {
22336 kind: SyntaxKind::MacroRule,
22337 details: GreenNodeDetails::Node { children: children.into(), width },
22338 }
22339 .intern(db),
22340 )
22341 }
22342}
22343impl<'db> MacroRule<'db> {
22344 pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22345 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22346 }
22347 pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22348 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22349 }
22350 pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22351 BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22352 }
22353 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22354 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22355 }
22356}
22357#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22358pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22359impl<'db> MacroRulePtr<'db> {}
22360impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22361 type SyntaxNode = MacroRule<'db>;
22362 fn untyped(self) -> SyntaxStablePtrId<'db> {
22363 self.0
22364 }
22365 fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22366 MacroRule::from_syntax_node(db, self.0.lookup(db))
22367 }
22368}
22369impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22370 fn from(ptr: MacroRulePtr<'db>) -> Self {
22371 ptr.untyped()
22372 }
22373}
22374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22375pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22376impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22377 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22378 type StablePtr = MacroRulePtr<'db>;
22379 type Green = MacroRuleGreen<'db>;
22380 fn missing(db: &'db dyn Database) -> Self::Green {
22381 MacroRuleGreen(
22382 GreenNode {
22383 kind: SyntaxKind::MacroRule,
22384 details: GreenNodeDetails::Node {
22385 children: [
22386 WrappedMacro::missing(db).0,
22387 TerminalMatchArrow::missing(db).0,
22388 BracedMacro::missing(db).0,
22389 TerminalSemicolon::missing(db).0,
22390 ]
22391 .into(),
22392 width: TextWidth::default(),
22393 },
22394 }
22395 .intern(db),
22396 )
22397 }
22398 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22399 let kind = node.kind(db);
22400 assert_eq!(
22401 kind,
22402 SyntaxKind::MacroRule,
22403 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22404 kind,
22405 SyntaxKind::MacroRule
22406 );
22407 Self { node }
22408 }
22409 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22410 let kind = node.kind(db);
22411 if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22412 }
22413 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22414 self.node
22415 }
22416 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22417 MacroRulePtr(self.node.stable_ptr(db))
22418 }
22419}
22420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22421pub struct ParamKind<'db> {
22422 node: SyntaxNode<'db>,
22423}
22424impl<'db> ParamKind<'db> {
22425 pub const INDEX_COLON: usize = 0;
22426 pub const INDEX_KIND: usize = 1;
22427 pub fn new_green(
22428 db: &'db dyn Database,
22429 colon: TerminalColonGreen<'db>,
22430 kind: MacroParamKindGreen<'db>,
22431 ) -> ParamKindGreen<'db> {
22432 let children = [colon.0, kind.0];
22433 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22434 ParamKindGreen(
22435 GreenNode {
22436 kind: SyntaxKind::ParamKind,
22437 details: GreenNodeDetails::Node { children: children.into(), width },
22438 }
22439 .intern(db),
22440 )
22441 }
22442}
22443impl<'db> ParamKind<'db> {
22444 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22445 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22446 }
22447 pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22448 MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22449 }
22450}
22451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22452pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22453impl<'db> ParamKindPtr<'db> {}
22454impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22455 type SyntaxNode = ParamKind<'db>;
22456 fn untyped(self) -> SyntaxStablePtrId<'db> {
22457 self.0
22458 }
22459 fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22460 ParamKind::from_syntax_node(db, self.0.lookup(db))
22461 }
22462}
22463impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22464 fn from(ptr: ParamKindPtr<'db>) -> Self {
22465 ptr.untyped()
22466 }
22467}
22468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22469pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22470impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22471 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22472 type StablePtr = ParamKindPtr<'db>;
22473 type Green = ParamKindGreen<'db>;
22474 fn missing(db: &'db dyn Database) -> Self::Green {
22475 ParamKindGreen(
22476 GreenNode {
22477 kind: SyntaxKind::ParamKind,
22478 details: GreenNodeDetails::Node {
22479 children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22480 width: TextWidth::default(),
22481 },
22482 }
22483 .intern(db),
22484 )
22485 }
22486 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22487 let kind = node.kind(db);
22488 assert_eq!(
22489 kind,
22490 SyntaxKind::ParamKind,
22491 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22492 kind,
22493 SyntaxKind::ParamKind
22494 );
22495 Self { node }
22496 }
22497 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22498 let kind = node.kind(db);
22499 if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22500 }
22501 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22502 self.node
22503 }
22504 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22505 ParamKindPtr(self.node.stable_ptr(db))
22506 }
22507}
22508#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22509pub enum OptionParamKind<'db> {
22510 Empty(OptionParamKindEmpty<'db>),
22511 ParamKind(ParamKind<'db>),
22512}
22513#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22514pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22515impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22516 type SyntaxNode = OptionParamKind<'db>;
22517 fn untyped(self) -> SyntaxStablePtrId<'db> {
22518 self.0
22519 }
22520 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22521 OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22522 }
22523}
22524impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22525 fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22526 ptr.untyped()
22527 }
22528}
22529impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22530 fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22531 Self(value.0)
22532 }
22533}
22534impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22535 fn from(value: ParamKindPtr<'db>) -> Self {
22536 Self(value.0)
22537 }
22538}
22539impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22540 fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22541 Self(value.0)
22542 }
22543}
22544impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22545 fn from(value: ParamKindGreen<'db>) -> Self {
22546 Self(value.0)
22547 }
22548}
22549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22550pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22551impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22552 const OPTIONAL_KIND: Option<SyntaxKind> = None;
22553 type StablePtr = OptionParamKindPtr<'db>;
22554 type Green = OptionParamKindGreen<'db>;
22555 fn missing(db: &'db dyn Database) -> Self::Green {
22556 panic!("No missing variant.");
22557 }
22558 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22559 let kind = node.kind(db);
22560 match kind {
22561 SyntaxKind::OptionParamKindEmpty => {
22562 OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22563 }
22564 SyntaxKind::ParamKind => {
22565 OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22566 }
22567 _ => {
22568 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22569 }
22570 }
22571 }
22572 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22573 let kind = node.kind(db);
22574 match kind {
22575 SyntaxKind::OptionParamKindEmpty => {
22576 Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22577 }
22578 SyntaxKind::ParamKind => {
22579 Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22580 }
22581 _ => None,
22582 }
22583 }
22584 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22585 match self {
22586 OptionParamKind::Empty(x) => x.as_syntax_node(),
22587 OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22588 }
22589 }
22590 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22591 OptionParamKindPtr(self.as_syntax_node().stable_ptr(db))
22592 }
22593}
22594impl<'db> OptionParamKind<'db> {
22595 pub fn is_variant(kind: SyntaxKind) -> bool {
22597 matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22598 }
22599}
22600#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22601pub struct OptionParamKindEmpty<'db> {
22602 node: SyntaxNode<'db>,
22603}
22604impl<'db> OptionParamKindEmpty<'db> {
22605 pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22606 let children = [];
22607 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22608 OptionParamKindEmptyGreen(
22609 GreenNode {
22610 kind: SyntaxKind::OptionParamKindEmpty,
22611 details: GreenNodeDetails::Node { children: children.into(), width },
22612 }
22613 .intern(db),
22614 )
22615 }
22616}
22617impl<'db> OptionParamKindEmpty<'db> {}
22618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22619pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
22620impl<'db> OptionParamKindEmptyPtr<'db> {}
22621impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
22622 type SyntaxNode = OptionParamKindEmpty<'db>;
22623 fn untyped(self) -> SyntaxStablePtrId<'db> {
22624 self.0
22625 }
22626 fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
22627 OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
22628 }
22629}
22630impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
22631 fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
22632 ptr.untyped()
22633 }
22634}
22635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22636pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
22637impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
22638 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
22639 type StablePtr = OptionParamKindEmptyPtr<'db>;
22640 type Green = OptionParamKindEmptyGreen<'db>;
22641 fn missing(db: &'db dyn Database) -> Self::Green {
22642 OptionParamKindEmptyGreen(
22643 GreenNode {
22644 kind: SyntaxKind::OptionParamKindEmpty,
22645 details: GreenNodeDetails::Node {
22646 children: [].into(),
22647 width: TextWidth::default(),
22648 },
22649 }
22650 .intern(db),
22651 )
22652 }
22653 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22654 let kind = node.kind(db);
22655 assert_eq!(
22656 kind,
22657 SyntaxKind::OptionParamKindEmpty,
22658 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22659 kind,
22660 SyntaxKind::OptionParamKindEmpty
22661 );
22662 Self { node }
22663 }
22664 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22665 let kind = node.kind(db);
22666 if kind == SyntaxKind::OptionParamKindEmpty {
22667 Some(Self::from_syntax_node(db, node))
22668 } else {
22669 None
22670 }
22671 }
22672 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22673 self.node
22674 }
22675 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22676 OptionParamKindEmptyPtr(self.node.stable_ptr(db))
22677 }
22678}
22679#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22680pub struct MacroParam<'db> {
22681 node: SyntaxNode<'db>,
22682}
22683impl<'db> MacroParam<'db> {
22684 pub const INDEX_DOLLAR: usize = 0;
22685 pub const INDEX_NAME: usize = 1;
22686 pub const INDEX_KIND: usize = 2;
22687 pub fn new_green(
22688 db: &'db dyn Database,
22689 dollar: TerminalDollarGreen<'db>,
22690 name: TerminalIdentifierGreen<'db>,
22691 kind: OptionParamKindGreen<'db>,
22692 ) -> MacroParamGreen<'db> {
22693 let children = [dollar.0, name.0, kind.0];
22694 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22695 MacroParamGreen(
22696 GreenNode {
22697 kind: SyntaxKind::MacroParam,
22698 details: GreenNodeDetails::Node { children: children.into(), width },
22699 }
22700 .intern(db),
22701 )
22702 }
22703}
22704impl<'db> MacroParam<'db> {
22705 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22706 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22707 }
22708 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22709 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
22710 }
22711 pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
22712 OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
22713 }
22714}
22715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22716pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
22717impl<'db> MacroParamPtr<'db> {}
22718impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
22719 type SyntaxNode = MacroParam<'db>;
22720 fn untyped(self) -> SyntaxStablePtrId<'db> {
22721 self.0
22722 }
22723 fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
22724 MacroParam::from_syntax_node(db, self.0.lookup(db))
22725 }
22726}
22727impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
22728 fn from(ptr: MacroParamPtr<'db>) -> Self {
22729 ptr.untyped()
22730 }
22731}
22732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22733pub struct MacroParamGreen<'db>(pub GreenId<'db>);
22734impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
22735 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
22736 type StablePtr = MacroParamPtr<'db>;
22737 type Green = MacroParamGreen<'db>;
22738 fn missing(db: &'db dyn Database) -> Self::Green {
22739 MacroParamGreen(
22740 GreenNode {
22741 kind: SyntaxKind::MacroParam,
22742 details: GreenNodeDetails::Node {
22743 children: [
22744 TerminalDollar::missing(db).0,
22745 TerminalIdentifier::missing(db).0,
22746 OptionParamKind::missing(db).0,
22747 ]
22748 .into(),
22749 width: TextWidth::default(),
22750 },
22751 }
22752 .intern(db),
22753 )
22754 }
22755 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22756 let kind = node.kind(db);
22757 assert_eq!(
22758 kind,
22759 SyntaxKind::MacroParam,
22760 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22761 kind,
22762 SyntaxKind::MacroParam
22763 );
22764 Self { node }
22765 }
22766 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22767 let kind = node.kind(db);
22768 if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
22769 }
22770 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22771 self.node
22772 }
22773 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22774 MacroParamPtr(self.node.stable_ptr(db))
22775 }
22776}
22777#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22778pub struct MacroRepetition<'db> {
22779 node: SyntaxNode<'db>,
22780}
22781impl<'db> MacroRepetition<'db> {
22782 pub const INDEX_DOLLAR: usize = 0;
22783 pub const INDEX_LPAREN: usize = 1;
22784 pub const INDEX_ELEMENTS: usize = 2;
22785 pub const INDEX_RPAREN: usize = 3;
22786 pub const INDEX_SEPARATOR: usize = 4;
22787 pub const INDEX_OPERATOR: usize = 5;
22788 pub fn new_green(
22789 db: &'db dyn Database,
22790 dollar: TerminalDollarGreen<'db>,
22791 lparen: TerminalLParenGreen<'db>,
22792 elements: MacroElementsGreen<'db>,
22793 rparen: TerminalRParenGreen<'db>,
22794 separator: OptionTerminalCommaGreen<'db>,
22795 operator: MacroRepetitionOperatorGreen<'db>,
22796 ) -> MacroRepetitionGreen<'db> {
22797 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
22798 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22799 MacroRepetitionGreen(
22800 GreenNode {
22801 kind: SyntaxKind::MacroRepetition,
22802 details: GreenNodeDetails::Node { children: children.into(), width },
22803 }
22804 .intern(db),
22805 )
22806 }
22807}
22808impl<'db> MacroRepetition<'db> {
22809 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22810 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22811 }
22812 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
22813 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
22814 }
22815 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
22816 MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
22817 }
22818 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
22819 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
22820 }
22821 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
22822 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
22823 }
22824 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
22825 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
22826 }
22827}
22828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22829pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
22830impl<'db> MacroRepetitionPtr<'db> {}
22831impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
22832 type SyntaxNode = MacroRepetition<'db>;
22833 fn untyped(self) -> SyntaxStablePtrId<'db> {
22834 self.0
22835 }
22836 fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
22837 MacroRepetition::from_syntax_node(db, self.0.lookup(db))
22838 }
22839}
22840impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
22841 fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
22842 ptr.untyped()
22843 }
22844}
22845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22846pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
22847impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
22848 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
22849 type StablePtr = MacroRepetitionPtr<'db>;
22850 type Green = MacroRepetitionGreen<'db>;
22851 fn missing(db: &'db dyn Database) -> Self::Green {
22852 MacroRepetitionGreen(
22853 GreenNode {
22854 kind: SyntaxKind::MacroRepetition,
22855 details: GreenNodeDetails::Node {
22856 children: [
22857 TerminalDollar::missing(db).0,
22858 TerminalLParen::missing(db).0,
22859 MacroElements::missing(db).0,
22860 TerminalRParen::missing(db).0,
22861 OptionTerminalComma::missing(db).0,
22862 MacroRepetitionOperator::missing(db).0,
22863 ]
22864 .into(),
22865 width: TextWidth::default(),
22866 },
22867 }
22868 .intern(db),
22869 )
22870 }
22871 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22872 let kind = node.kind(db);
22873 assert_eq!(
22874 kind,
22875 SyntaxKind::MacroRepetition,
22876 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22877 kind,
22878 SyntaxKind::MacroRepetition
22879 );
22880 Self { node }
22881 }
22882 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22883 let kind = node.kind(db);
22884 if kind == SyntaxKind::MacroRepetition {
22885 Some(Self::from_syntax_node(db, node))
22886 } else {
22887 None
22888 }
22889 }
22890 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22891 self.node
22892 }
22893 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22894 MacroRepetitionPtr(self.node.stable_ptr(db))
22895 }
22896}
22897#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22898pub enum OptionTerminalComma<'db> {
22899 Empty(OptionTerminalCommaEmpty<'db>),
22900 TerminalComma(TerminalComma<'db>),
22901}
22902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22903pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
22904impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
22905 type SyntaxNode = OptionTerminalComma<'db>;
22906 fn untyped(self) -> SyntaxStablePtrId<'db> {
22907 self.0
22908 }
22909 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22910 OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
22911 }
22912}
22913impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
22914 fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
22915 ptr.untyped()
22916 }
22917}
22918impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
22919 fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
22920 Self(value.0)
22921 }
22922}
22923impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
22924 fn from(value: TerminalCommaPtr<'db>) -> Self {
22925 Self(value.0)
22926 }
22927}
22928impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
22929 fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
22930 Self(value.0)
22931 }
22932}
22933impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
22934 fn from(value: TerminalCommaGreen<'db>) -> Self {
22935 Self(value.0)
22936 }
22937}
22938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22939pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
22940impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
22941 const OPTIONAL_KIND: Option<SyntaxKind> = None;
22942 type StablePtr = OptionTerminalCommaPtr<'db>;
22943 type Green = OptionTerminalCommaGreen<'db>;
22944 fn missing(db: &'db dyn Database) -> Self::Green {
22945 panic!("No missing variant.");
22946 }
22947 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22948 let kind = node.kind(db);
22949 match kind {
22950 SyntaxKind::OptionTerminalCommaEmpty => {
22951 OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
22952 }
22953 SyntaxKind::TerminalComma => {
22954 OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
22955 }
22956 _ => panic!(
22957 "Unexpected syntax kind {:?} when constructing {}.",
22958 kind, "OptionTerminalComma"
22959 ),
22960 }
22961 }
22962 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22963 let kind = node.kind(db);
22964 match kind {
22965 SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
22966 OptionTerminalCommaEmpty::from_syntax_node(db, node),
22967 )),
22968 SyntaxKind::TerminalComma => {
22969 Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
22970 }
22971 _ => None,
22972 }
22973 }
22974 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22975 match self {
22976 OptionTerminalComma::Empty(x) => x.as_syntax_node(),
22977 OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
22978 }
22979 }
22980 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22981 OptionTerminalCommaPtr(self.as_syntax_node().stable_ptr(db))
22982 }
22983}
22984impl<'db> OptionTerminalComma<'db> {
22985 pub fn is_variant(kind: SyntaxKind) -> bool {
22987 matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
22988 }
22989}
22990#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22991pub struct OptionTerminalCommaEmpty<'db> {
22992 node: SyntaxNode<'db>,
22993}
22994impl<'db> OptionTerminalCommaEmpty<'db> {
22995 pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
22996 let children = [];
22997 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22998 OptionTerminalCommaEmptyGreen(
22999 GreenNode {
23000 kind: SyntaxKind::OptionTerminalCommaEmpty,
23001 details: GreenNodeDetails::Node { children: children.into(), width },
23002 }
23003 .intern(db),
23004 )
23005 }
23006}
23007impl<'db> OptionTerminalCommaEmpty<'db> {}
23008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23009pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23010impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23011impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23012 type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23013 fn untyped(self) -> SyntaxStablePtrId<'db> {
23014 self.0
23015 }
23016 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23017 OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23018 }
23019}
23020impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23021 fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23022 ptr.untyped()
23023 }
23024}
23025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23026pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23027impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23028 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23029 type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23030 type Green = OptionTerminalCommaEmptyGreen<'db>;
23031 fn missing(db: &'db dyn Database) -> Self::Green {
23032 OptionTerminalCommaEmptyGreen(
23033 GreenNode {
23034 kind: SyntaxKind::OptionTerminalCommaEmpty,
23035 details: GreenNodeDetails::Node {
23036 children: [].into(),
23037 width: TextWidth::default(),
23038 },
23039 }
23040 .intern(db),
23041 )
23042 }
23043 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23044 let kind = node.kind(db);
23045 assert_eq!(
23046 kind,
23047 SyntaxKind::OptionTerminalCommaEmpty,
23048 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23049 kind,
23050 SyntaxKind::OptionTerminalCommaEmpty
23051 );
23052 Self { node }
23053 }
23054 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23055 let kind = node.kind(db);
23056 if kind == SyntaxKind::OptionTerminalCommaEmpty {
23057 Some(Self::from_syntax_node(db, node))
23058 } else {
23059 None
23060 }
23061 }
23062 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23063 self.node
23064 }
23065 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23066 OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23067 }
23068}
23069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23070pub enum MacroRepetitionOperator<'db> {
23071 ZeroOrOne(TerminalQuestionMark<'db>),
23072 OneOrMore(TerminalPlus<'db>),
23073 ZeroOrMore(TerminalMul<'db>),
23074 Missing(MacroRepetitionOperatorMissing<'db>),
23075}
23076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23077pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23078impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23079 type SyntaxNode = MacroRepetitionOperator<'db>;
23080 fn untyped(self) -> SyntaxStablePtrId<'db> {
23081 self.0
23082 }
23083 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23084 MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23085 }
23086}
23087impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23088 fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23089 ptr.untyped()
23090 }
23091}
23092impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23093 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23094 Self(value.0)
23095 }
23096}
23097impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23098 fn from(value: TerminalPlusPtr<'db>) -> Self {
23099 Self(value.0)
23100 }
23101}
23102impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23103 fn from(value: TerminalMulPtr<'db>) -> Self {
23104 Self(value.0)
23105 }
23106}
23107impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23108 fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23109 Self(value.0)
23110 }
23111}
23112impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23113 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23114 Self(value.0)
23115 }
23116}
23117impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23118 fn from(value: TerminalPlusGreen<'db>) -> Self {
23119 Self(value.0)
23120 }
23121}
23122impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23123 fn from(value: TerminalMulGreen<'db>) -> Self {
23124 Self(value.0)
23125 }
23126}
23127impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23128 fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23129 Self(value.0)
23130 }
23131}
23132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23133pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23134impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23135 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23136 type StablePtr = MacroRepetitionOperatorPtr<'db>;
23137 type Green = MacroRepetitionOperatorGreen<'db>;
23138 fn missing(db: &'db dyn Database) -> Self::Green {
23139 MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23140 }
23141 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23142 let kind = node.kind(db);
23143 match kind {
23144 SyntaxKind::TerminalQuestionMark => {
23145 MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23146 }
23147 SyntaxKind::TerminalPlus => {
23148 MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23149 }
23150 SyntaxKind::TerminalMul => {
23151 MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23152 }
23153 SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23154 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23155 ),
23156 _ => panic!(
23157 "Unexpected syntax kind {:?} when constructing {}.",
23158 kind, "MacroRepetitionOperator"
23159 ),
23160 }
23161 }
23162 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23163 let kind = node.kind(db);
23164 match kind {
23165 SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23166 TerminalQuestionMark::from_syntax_node(db, node),
23167 )),
23168 SyntaxKind::TerminalPlus => {
23169 Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23170 }
23171 SyntaxKind::TerminalMul => {
23172 Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23173 }
23174 SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23175 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23176 )),
23177 _ => None,
23178 }
23179 }
23180 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23181 match self {
23182 MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23183 MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23184 MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23185 MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23186 }
23187 }
23188 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23189 MacroRepetitionOperatorPtr(self.as_syntax_node().stable_ptr(db))
23190 }
23191}
23192impl<'db> MacroRepetitionOperator<'db> {
23193 pub fn is_variant(kind: SyntaxKind) -> bool {
23195 matches!(
23196 kind,
23197 SyntaxKind::TerminalQuestionMark
23198 | SyntaxKind::TerminalPlus
23199 | SyntaxKind::TerminalMul
23200 | SyntaxKind::MacroRepetitionOperatorMissing
23201 )
23202 }
23203}
23204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23205pub struct MacroRepetitionOperatorMissing<'db> {
23206 node: SyntaxNode<'db>,
23207}
23208impl<'db> MacroRepetitionOperatorMissing<'db> {
23209 pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23210 let children = [];
23211 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23212 MacroRepetitionOperatorMissingGreen(
23213 GreenNode {
23214 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23215 details: GreenNodeDetails::Node { children: children.into(), width },
23216 }
23217 .intern(db),
23218 )
23219 }
23220}
23221impl<'db> MacroRepetitionOperatorMissing<'db> {}
23222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23223pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23224impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23225impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23226 type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23227 fn untyped(self) -> SyntaxStablePtrId<'db> {
23228 self.0
23229 }
23230 fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23231 MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23232 }
23233}
23234impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23235 fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23236 ptr.untyped()
23237 }
23238}
23239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23240pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23241impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23242 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23243 type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23244 type Green = MacroRepetitionOperatorMissingGreen<'db>;
23245 fn missing(db: &'db dyn Database) -> Self::Green {
23246 MacroRepetitionOperatorMissingGreen(
23247 GreenNode {
23248 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23249 details: GreenNodeDetails::Node {
23250 children: [].into(),
23251 width: TextWidth::default(),
23252 },
23253 }
23254 .intern(db),
23255 )
23256 }
23257 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23258 let kind = node.kind(db);
23259 assert_eq!(
23260 kind,
23261 SyntaxKind::MacroRepetitionOperatorMissing,
23262 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23263 kind,
23264 SyntaxKind::MacroRepetitionOperatorMissing
23265 );
23266 Self { node }
23267 }
23268 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23269 let kind = node.kind(db);
23270 if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23271 Some(Self::from_syntax_node(db, node))
23272 } else {
23273 None
23274 }
23275 }
23276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23277 self.node
23278 }
23279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23280 MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23281 }
23282}
23283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23284pub struct ParamIdent<'db> {
23285 node: SyntaxNode<'db>,
23286}
23287impl<'db> ParamIdent<'db> {
23288 pub const INDEX_IDENT: usize = 0;
23289 pub fn new_green(
23290 db: &'db dyn Database,
23291 ident: TerminalIdentifierGreen<'db>,
23292 ) -> ParamIdentGreen<'db> {
23293 let children = [ident.0];
23294 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23295 ParamIdentGreen(
23296 GreenNode {
23297 kind: SyntaxKind::ParamIdent,
23298 details: GreenNodeDetails::Node { children: children.into(), width },
23299 }
23300 .intern(db),
23301 )
23302 }
23303}
23304impl<'db> ParamIdent<'db> {
23305 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23306 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23307 }
23308}
23309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23310pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23311impl<'db> ParamIdentPtr<'db> {}
23312impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23313 type SyntaxNode = ParamIdent<'db>;
23314 fn untyped(self) -> SyntaxStablePtrId<'db> {
23315 self.0
23316 }
23317 fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23318 ParamIdent::from_syntax_node(db, self.0.lookup(db))
23319 }
23320}
23321impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23322 fn from(ptr: ParamIdentPtr<'db>) -> Self {
23323 ptr.untyped()
23324 }
23325}
23326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23327pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23328impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23329 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23330 type StablePtr = ParamIdentPtr<'db>;
23331 type Green = ParamIdentGreen<'db>;
23332 fn missing(db: &'db dyn Database) -> Self::Green {
23333 ParamIdentGreen(
23334 GreenNode {
23335 kind: SyntaxKind::ParamIdent,
23336 details: GreenNodeDetails::Node {
23337 children: [TerminalIdentifier::missing(db).0].into(),
23338 width: TextWidth::default(),
23339 },
23340 }
23341 .intern(db),
23342 )
23343 }
23344 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23345 let kind = node.kind(db);
23346 assert_eq!(
23347 kind,
23348 SyntaxKind::ParamIdent,
23349 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23350 kind,
23351 SyntaxKind::ParamIdent
23352 );
23353 Self { node }
23354 }
23355 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23356 let kind = node.kind(db);
23357 if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23358 }
23359 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23360 self.node
23361 }
23362 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23363 ParamIdentPtr(self.node.stable_ptr(db))
23364 }
23365}
23366#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23367pub struct ParamExpr<'db> {
23368 node: SyntaxNode<'db>,
23369}
23370impl<'db> ParamExpr<'db> {
23371 pub const INDEX_EXPR: usize = 0;
23372 pub fn new_green(
23373 db: &'db dyn Database,
23374 expr: TerminalIdentifierGreen<'db>,
23375 ) -> ParamExprGreen<'db> {
23376 let children = [expr.0];
23377 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23378 ParamExprGreen(
23379 GreenNode {
23380 kind: SyntaxKind::ParamExpr,
23381 details: GreenNodeDetails::Node { children: children.into(), width },
23382 }
23383 .intern(db),
23384 )
23385 }
23386}
23387impl<'db> ParamExpr<'db> {
23388 pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23389 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23390 }
23391}
23392#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23393pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23394impl<'db> ParamExprPtr<'db> {}
23395impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23396 type SyntaxNode = ParamExpr<'db>;
23397 fn untyped(self) -> SyntaxStablePtrId<'db> {
23398 self.0
23399 }
23400 fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23401 ParamExpr::from_syntax_node(db, self.0.lookup(db))
23402 }
23403}
23404impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23405 fn from(ptr: ParamExprPtr<'db>) -> Self {
23406 ptr.untyped()
23407 }
23408}
23409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23410pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23411impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23412 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23413 type StablePtr = ParamExprPtr<'db>;
23414 type Green = ParamExprGreen<'db>;
23415 fn missing(db: &'db dyn Database) -> Self::Green {
23416 ParamExprGreen(
23417 GreenNode {
23418 kind: SyntaxKind::ParamExpr,
23419 details: GreenNodeDetails::Node {
23420 children: [TerminalIdentifier::missing(db).0].into(),
23421 width: TextWidth::default(),
23422 },
23423 }
23424 .intern(db),
23425 )
23426 }
23427 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23428 let kind = node.kind(db);
23429 assert_eq!(
23430 kind,
23431 SyntaxKind::ParamExpr,
23432 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23433 kind,
23434 SyntaxKind::ParamExpr
23435 );
23436 Self { node }
23437 }
23438 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23439 let kind = node.kind(db);
23440 if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23441 }
23442 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23443 self.node
23444 }
23445 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23446 ParamExprPtr(self.node.stable_ptr(db))
23447 }
23448}
23449#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23450pub enum MacroParamKind<'db> {
23451 Identifier(ParamIdent<'db>),
23452 Expr(ParamExpr<'db>),
23453 Missing(MacroParamKindMissing<'db>),
23454}
23455#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23456pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23457impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23458 type SyntaxNode = MacroParamKind<'db>;
23459 fn untyped(self) -> SyntaxStablePtrId<'db> {
23460 self.0
23461 }
23462 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23463 MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23464 }
23465}
23466impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23467 fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23468 ptr.untyped()
23469 }
23470}
23471impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23472 fn from(value: ParamIdentPtr<'db>) -> Self {
23473 Self(value.0)
23474 }
23475}
23476impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23477 fn from(value: ParamExprPtr<'db>) -> Self {
23478 Self(value.0)
23479 }
23480}
23481impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23482 fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23483 Self(value.0)
23484 }
23485}
23486impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23487 fn from(value: ParamIdentGreen<'db>) -> Self {
23488 Self(value.0)
23489 }
23490}
23491impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23492 fn from(value: ParamExprGreen<'db>) -> Self {
23493 Self(value.0)
23494 }
23495}
23496impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23497 fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23498 Self(value.0)
23499 }
23500}
23501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23502pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23503impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23504 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23505 type StablePtr = MacroParamKindPtr<'db>;
23506 type Green = MacroParamKindGreen<'db>;
23507 fn missing(db: &'db dyn Database) -> Self::Green {
23508 MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23509 }
23510 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23511 let kind = node.kind(db);
23512 match kind {
23513 SyntaxKind::ParamIdent => {
23514 MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23515 }
23516 SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23517 SyntaxKind::MacroParamKindMissing => {
23518 MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23519 }
23520 _ => {
23521 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23522 }
23523 }
23524 }
23525 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23526 let kind = node.kind(db);
23527 match kind {
23528 SyntaxKind::ParamIdent => {
23529 Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23530 }
23531 SyntaxKind::ParamExpr => {
23532 Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23533 }
23534 SyntaxKind::MacroParamKindMissing => {
23535 Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23536 }
23537 _ => None,
23538 }
23539 }
23540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23541 match self {
23542 MacroParamKind::Identifier(x) => x.as_syntax_node(),
23543 MacroParamKind::Expr(x) => x.as_syntax_node(),
23544 MacroParamKind::Missing(x) => x.as_syntax_node(),
23545 }
23546 }
23547 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23548 MacroParamKindPtr(self.as_syntax_node().stable_ptr(db))
23549 }
23550}
23551impl<'db> MacroParamKind<'db> {
23552 pub fn is_variant(kind: SyntaxKind) -> bool {
23554 matches!(
23555 kind,
23556 SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23557 )
23558 }
23559}
23560#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23561pub struct MacroParamKindMissing<'db> {
23562 node: SyntaxNode<'db>,
23563}
23564impl<'db> MacroParamKindMissing<'db> {
23565 pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23566 let children = [];
23567 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23568 MacroParamKindMissingGreen(
23569 GreenNode {
23570 kind: SyntaxKind::MacroParamKindMissing,
23571 details: GreenNodeDetails::Node { children: children.into(), width },
23572 }
23573 .intern(db),
23574 )
23575 }
23576}
23577impl<'db> MacroParamKindMissing<'db> {}
23578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23579pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23580impl<'db> MacroParamKindMissingPtr<'db> {}
23581impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23582 type SyntaxNode = MacroParamKindMissing<'db>;
23583 fn untyped(self) -> SyntaxStablePtrId<'db> {
23584 self.0
23585 }
23586 fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23587 MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23588 }
23589}
23590impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23591 fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23592 ptr.untyped()
23593 }
23594}
23595#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23596pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23597impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23598 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23599 type StablePtr = MacroParamKindMissingPtr<'db>;
23600 type Green = MacroParamKindMissingGreen<'db>;
23601 fn missing(db: &'db dyn Database) -> Self::Green {
23602 MacroParamKindMissingGreen(
23603 GreenNode {
23604 kind: SyntaxKind::MacroParamKindMissing,
23605 details: GreenNodeDetails::Node {
23606 children: [].into(),
23607 width: TextWidth::default(),
23608 },
23609 }
23610 .intern(db),
23611 )
23612 }
23613 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23614 let kind = node.kind(db);
23615 assert_eq!(
23616 kind,
23617 SyntaxKind::MacroParamKindMissing,
23618 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23619 kind,
23620 SyntaxKind::MacroParamKindMissing
23621 );
23622 Self { node }
23623 }
23624 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23625 let kind = node.kind(db);
23626 if kind == SyntaxKind::MacroParamKindMissing {
23627 Some(Self::from_syntax_node(db, node))
23628 } else {
23629 None
23630 }
23631 }
23632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23633 self.node
23634 }
23635 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23636 MacroParamKindMissingPtr(self.node.stable_ptr(db))
23637 }
23638}
23639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23640pub enum MacroElement<'db> {
23641 Token(TokenTreeLeaf<'db>),
23642 Param(MacroParam<'db>),
23643 Subtree(MacroWrapper<'db>),
23644 Repetition(MacroRepetition<'db>),
23645}
23646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23647pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
23648impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
23649 type SyntaxNode = MacroElement<'db>;
23650 fn untyped(self) -> SyntaxStablePtrId<'db> {
23651 self.0
23652 }
23653 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23654 MacroElement::from_syntax_node(db, self.0.lookup(db))
23655 }
23656}
23657impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
23658 fn from(ptr: MacroElementPtr<'db>) -> Self {
23659 ptr.untyped()
23660 }
23661}
23662impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
23663 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
23664 Self(value.0)
23665 }
23666}
23667impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
23668 fn from(value: MacroParamPtr<'db>) -> Self {
23669 Self(value.0)
23670 }
23671}
23672impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
23673 fn from(value: MacroWrapperPtr<'db>) -> Self {
23674 Self(value.0)
23675 }
23676}
23677impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
23678 fn from(value: MacroRepetitionPtr<'db>) -> Self {
23679 Self(value.0)
23680 }
23681}
23682impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
23683 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
23684 Self(value.0)
23685 }
23686}
23687impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
23688 fn from(value: MacroParamGreen<'db>) -> Self {
23689 Self(value.0)
23690 }
23691}
23692impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
23693 fn from(value: MacroWrapperGreen<'db>) -> Self {
23694 Self(value.0)
23695 }
23696}
23697impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
23698 fn from(value: MacroRepetitionGreen<'db>) -> Self {
23699 Self(value.0)
23700 }
23701}
23702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23703pub struct MacroElementGreen<'db>(pub GreenId<'db>);
23704impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
23705 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23706 type StablePtr = MacroElementPtr<'db>;
23707 type Green = MacroElementGreen<'db>;
23708 fn missing(db: &'db dyn Database) -> Self::Green {
23709 panic!("No missing variant.");
23710 }
23711 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23712 let kind = node.kind(db);
23713 match kind {
23714 SyntaxKind::TokenTreeLeaf => {
23715 MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
23716 }
23717 SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
23718 SyntaxKind::MacroWrapper => {
23719 MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
23720 }
23721 SyntaxKind::MacroRepetition => {
23722 MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
23723 }
23724 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
23725 }
23726 }
23727 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23728 let kind = node.kind(db);
23729 match kind {
23730 SyntaxKind::TokenTreeLeaf => {
23731 Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
23732 }
23733 SyntaxKind::MacroParam => {
23734 Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
23735 }
23736 SyntaxKind::MacroWrapper => {
23737 Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
23738 }
23739 SyntaxKind::MacroRepetition => {
23740 Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
23741 }
23742 _ => None,
23743 }
23744 }
23745 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23746 match self {
23747 MacroElement::Token(x) => x.as_syntax_node(),
23748 MacroElement::Param(x) => x.as_syntax_node(),
23749 MacroElement::Subtree(x) => x.as_syntax_node(),
23750 MacroElement::Repetition(x) => x.as_syntax_node(),
23751 }
23752 }
23753 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23754 MacroElementPtr(self.as_syntax_node().stable_ptr(db))
23755 }
23756}
23757impl<'db> MacroElement<'db> {
23758 pub fn is_variant(kind: SyntaxKind) -> bool {
23760 matches!(
23761 kind,
23762 SyntaxKind::TokenTreeLeaf
23763 | SyntaxKind::MacroParam
23764 | SyntaxKind::MacroWrapper
23765 | SyntaxKind::MacroRepetition
23766 )
23767 }
23768}
23769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23770pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
23771impl<'db> Deref for MacroElements<'db> {
23772 type Target = ElementList<'db, MacroElement<'db>, 1>;
23773 fn deref(&self) -> &Self::Target {
23774 &self.0
23775 }
23776}
23777impl<'db> MacroElements<'db> {
23778 pub fn new_green(
23779 db: &'db dyn Database,
23780 children: &[MacroElementGreen<'db>],
23781 ) -> MacroElementsGreen<'db> {
23782 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
23783 MacroElementsGreen(
23784 GreenNode {
23785 kind: SyntaxKind::MacroElements,
23786 details: GreenNodeDetails::Node {
23787 children: children.iter().map(|x| x.0).collect(),
23788 width,
23789 },
23790 }
23791 .intern(db),
23792 )
23793 }
23794}
23795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23796pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
23797impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
23798 type SyntaxNode = MacroElements<'db>;
23799 fn untyped(self) -> SyntaxStablePtrId<'db> {
23800 self.0
23801 }
23802 fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
23803 MacroElements::from_syntax_node(db, self.0.lookup(db))
23804 }
23805}
23806impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
23807 fn from(ptr: MacroElementsPtr<'db>) -> Self {
23808 ptr.untyped()
23809 }
23810}
23811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23812pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
23813impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
23814 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
23815 type StablePtr = MacroElementsPtr<'db>;
23816 type Green = MacroElementsGreen<'db>;
23817 fn missing(db: &'db dyn Database) -> Self::Green {
23818 MacroElementsGreen(
23819 GreenNode {
23820 kind: SyntaxKind::MacroElements,
23821 details: GreenNodeDetails::Node {
23822 children: [].into(),
23823 width: TextWidth::default(),
23824 },
23825 }
23826 .intern(db),
23827 )
23828 }
23829 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23830 Self(ElementList::new(node))
23831 }
23832 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23833 if node.kind(db) == SyntaxKind::MacroElements {
23834 Some(Self(ElementList::new(node)))
23835 } else {
23836 None
23837 }
23838 }
23839 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23840 self.node
23841 }
23842 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23843 MacroElementsPtr(self.node.stable_ptr(db))
23844 }
23845}
23846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23847pub struct MacroWrapper<'db> {
23848 node: SyntaxNode<'db>,
23849}
23850impl<'db> MacroWrapper<'db> {
23851 pub const INDEX_SUBTREE: usize = 0;
23852 pub fn new_green(
23853 db: &'db dyn Database,
23854 subtree: WrappedMacroGreen<'db>,
23855 ) -> MacroWrapperGreen<'db> {
23856 let children = [subtree.0];
23857 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23858 MacroWrapperGreen(
23859 GreenNode {
23860 kind: SyntaxKind::MacroWrapper,
23861 details: GreenNodeDetails::Node { children: children.into(), width },
23862 }
23863 .intern(db),
23864 )
23865 }
23866}
23867impl<'db> MacroWrapper<'db> {
23868 pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
23869 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
23870 }
23871}
23872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23873pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
23874impl<'db> MacroWrapperPtr<'db> {}
23875impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
23876 type SyntaxNode = MacroWrapper<'db>;
23877 fn untyped(self) -> SyntaxStablePtrId<'db> {
23878 self.0
23879 }
23880 fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
23881 MacroWrapper::from_syntax_node(db, self.0.lookup(db))
23882 }
23883}
23884impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
23885 fn from(ptr: MacroWrapperPtr<'db>) -> Self {
23886 ptr.untyped()
23887 }
23888}
23889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23890pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
23891impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
23892 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
23893 type StablePtr = MacroWrapperPtr<'db>;
23894 type Green = MacroWrapperGreen<'db>;
23895 fn missing(db: &'db dyn Database) -> Self::Green {
23896 MacroWrapperGreen(
23897 GreenNode {
23898 kind: SyntaxKind::MacroWrapper,
23899 details: GreenNodeDetails::Node {
23900 children: [WrappedMacro::missing(db).0].into(),
23901 width: TextWidth::default(),
23902 },
23903 }
23904 .intern(db),
23905 )
23906 }
23907 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23908 let kind = node.kind(db);
23909 assert_eq!(
23910 kind,
23911 SyntaxKind::MacroWrapper,
23912 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23913 kind,
23914 SyntaxKind::MacroWrapper
23915 );
23916 Self { node }
23917 }
23918 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23919 let kind = node.kind(db);
23920 if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
23921 }
23922 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23923 self.node
23924 }
23925 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23926 MacroWrapperPtr(self.node.stable_ptr(db))
23927 }
23928}
23929#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23930pub enum WrappedMacro<'db> {
23931 Parenthesized(ParenthesizedMacro<'db>),
23932 Braced(BracedMacro<'db>),
23933 Bracketed(BracketedMacro<'db>),
23934}
23935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23936pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
23937impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
23938 type SyntaxNode = WrappedMacro<'db>;
23939 fn untyped(self) -> SyntaxStablePtrId<'db> {
23940 self.0
23941 }
23942 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23943 WrappedMacro::from_syntax_node(db, self.0.lookup(db))
23944 }
23945}
23946impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
23947 fn from(ptr: WrappedMacroPtr<'db>) -> Self {
23948 ptr.untyped()
23949 }
23950}
23951impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23952 fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
23953 Self(value.0)
23954 }
23955}
23956impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23957 fn from(value: BracedMacroPtr<'db>) -> Self {
23958 Self(value.0)
23959 }
23960}
23961impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23962 fn from(value: BracketedMacroPtr<'db>) -> Self {
23963 Self(value.0)
23964 }
23965}
23966impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23967 fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
23968 Self(value.0)
23969 }
23970}
23971impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23972 fn from(value: BracedMacroGreen<'db>) -> Self {
23973 Self(value.0)
23974 }
23975}
23976impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23977 fn from(value: BracketedMacroGreen<'db>) -> Self {
23978 Self(value.0)
23979 }
23980}
23981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23982pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
23983impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
23984 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23985 type StablePtr = WrappedMacroPtr<'db>;
23986 type Green = WrappedMacroGreen<'db>;
23987 fn missing(db: &'db dyn Database) -> Self::Green {
23988 panic!("No missing variant.");
23989 }
23990 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23991 let kind = node.kind(db);
23992 match kind {
23993 SyntaxKind::ParenthesizedMacro => {
23994 WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
23995 }
23996 SyntaxKind::BracedMacro => {
23997 WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
23998 }
23999 SyntaxKind::BracketedMacro => {
24000 WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24001 }
24002 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24003 }
24004 }
24005 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24006 let kind = node.kind(db);
24007 match kind {
24008 SyntaxKind::ParenthesizedMacro => {
24009 Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24010 }
24011 SyntaxKind::BracedMacro => {
24012 Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24013 }
24014 SyntaxKind::BracketedMacro => {
24015 Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24016 }
24017 _ => None,
24018 }
24019 }
24020 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24021 match self {
24022 WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24023 WrappedMacro::Braced(x) => x.as_syntax_node(),
24024 WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24025 }
24026 }
24027 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24028 WrappedMacroPtr(self.as_syntax_node().stable_ptr(db))
24029 }
24030}
24031impl<'db> WrappedMacro<'db> {
24032 pub fn is_variant(kind: SyntaxKind) -> bool {
24034 matches!(
24035 kind,
24036 SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24037 )
24038 }
24039}
24040#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24041pub struct ParenthesizedMacro<'db> {
24042 node: SyntaxNode<'db>,
24043}
24044impl<'db> ParenthesizedMacro<'db> {
24045 pub const INDEX_LPAREN: usize = 0;
24046 pub const INDEX_ELEMENTS: usize = 1;
24047 pub const INDEX_RPAREN: usize = 2;
24048 pub fn new_green(
24049 db: &'db dyn Database,
24050 lparen: TerminalLParenGreen<'db>,
24051 elements: MacroElementsGreen<'db>,
24052 rparen: TerminalRParenGreen<'db>,
24053 ) -> ParenthesizedMacroGreen<'db> {
24054 let children = [lparen.0, elements.0, rparen.0];
24055 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24056 ParenthesizedMacroGreen(
24057 GreenNode {
24058 kind: SyntaxKind::ParenthesizedMacro,
24059 details: GreenNodeDetails::Node { children: children.into(), width },
24060 }
24061 .intern(db),
24062 )
24063 }
24064}
24065impl<'db> ParenthesizedMacro<'db> {
24066 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24067 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24068 }
24069 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24070 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24071 }
24072 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24073 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24074 }
24075}
24076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24077pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24078impl<'db> ParenthesizedMacroPtr<'db> {}
24079impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24080 type SyntaxNode = ParenthesizedMacro<'db>;
24081 fn untyped(self) -> SyntaxStablePtrId<'db> {
24082 self.0
24083 }
24084 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24085 ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24086 }
24087}
24088impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24089 fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24090 ptr.untyped()
24091 }
24092}
24093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24094pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24095impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24096 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24097 type StablePtr = ParenthesizedMacroPtr<'db>;
24098 type Green = ParenthesizedMacroGreen<'db>;
24099 fn missing(db: &'db dyn Database) -> Self::Green {
24100 ParenthesizedMacroGreen(
24101 GreenNode {
24102 kind: SyntaxKind::ParenthesizedMacro,
24103 details: GreenNodeDetails::Node {
24104 children: [
24105 TerminalLParen::missing(db).0,
24106 MacroElements::missing(db).0,
24107 TerminalRParen::missing(db).0,
24108 ]
24109 .into(),
24110 width: TextWidth::default(),
24111 },
24112 }
24113 .intern(db),
24114 )
24115 }
24116 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24117 let kind = node.kind(db);
24118 assert_eq!(
24119 kind,
24120 SyntaxKind::ParenthesizedMacro,
24121 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24122 kind,
24123 SyntaxKind::ParenthesizedMacro
24124 );
24125 Self { node }
24126 }
24127 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24128 let kind = node.kind(db);
24129 if kind == SyntaxKind::ParenthesizedMacro {
24130 Some(Self::from_syntax_node(db, node))
24131 } else {
24132 None
24133 }
24134 }
24135 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24136 self.node
24137 }
24138 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24139 ParenthesizedMacroPtr(self.node.stable_ptr(db))
24140 }
24141}
24142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24143pub struct BracedMacro<'db> {
24144 node: SyntaxNode<'db>,
24145}
24146impl<'db> BracedMacro<'db> {
24147 pub const INDEX_LBRACE: usize = 0;
24148 pub const INDEX_ELEMENTS: usize = 1;
24149 pub const INDEX_RBRACE: usize = 2;
24150 pub fn new_green(
24151 db: &'db dyn Database,
24152 lbrace: TerminalLBraceGreen<'db>,
24153 elements: MacroElementsGreen<'db>,
24154 rbrace: TerminalRBraceGreen<'db>,
24155 ) -> BracedMacroGreen<'db> {
24156 let children = [lbrace.0, elements.0, rbrace.0];
24157 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24158 BracedMacroGreen(
24159 GreenNode {
24160 kind: SyntaxKind::BracedMacro,
24161 details: GreenNodeDetails::Node { children: children.into(), width },
24162 }
24163 .intern(db),
24164 )
24165 }
24166}
24167impl<'db> BracedMacro<'db> {
24168 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24169 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24170 }
24171 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24172 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24173 }
24174 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24175 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24176 }
24177}
24178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24179pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24180impl<'db> BracedMacroPtr<'db> {}
24181impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24182 type SyntaxNode = BracedMacro<'db>;
24183 fn untyped(self) -> SyntaxStablePtrId<'db> {
24184 self.0
24185 }
24186 fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24187 BracedMacro::from_syntax_node(db, self.0.lookup(db))
24188 }
24189}
24190impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24191 fn from(ptr: BracedMacroPtr<'db>) -> Self {
24192 ptr.untyped()
24193 }
24194}
24195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24196pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24197impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24198 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24199 type StablePtr = BracedMacroPtr<'db>;
24200 type Green = BracedMacroGreen<'db>;
24201 fn missing(db: &'db dyn Database) -> Self::Green {
24202 BracedMacroGreen(
24203 GreenNode {
24204 kind: SyntaxKind::BracedMacro,
24205 details: GreenNodeDetails::Node {
24206 children: [
24207 TerminalLBrace::missing(db).0,
24208 MacroElements::missing(db).0,
24209 TerminalRBrace::missing(db).0,
24210 ]
24211 .into(),
24212 width: TextWidth::default(),
24213 },
24214 }
24215 .intern(db),
24216 )
24217 }
24218 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24219 let kind = node.kind(db);
24220 assert_eq!(
24221 kind,
24222 SyntaxKind::BracedMacro,
24223 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24224 kind,
24225 SyntaxKind::BracedMacro
24226 );
24227 Self { node }
24228 }
24229 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24230 let kind = node.kind(db);
24231 if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24232 }
24233 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24234 self.node
24235 }
24236 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24237 BracedMacroPtr(self.node.stable_ptr(db))
24238 }
24239}
24240#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24241pub struct BracketedMacro<'db> {
24242 node: SyntaxNode<'db>,
24243}
24244impl<'db> BracketedMacro<'db> {
24245 pub const INDEX_LBRACK: usize = 0;
24246 pub const INDEX_ELEMENTS: usize = 1;
24247 pub const INDEX_RBRACK: usize = 2;
24248 pub fn new_green(
24249 db: &'db dyn Database,
24250 lbrack: TerminalLBrackGreen<'db>,
24251 elements: MacroElementsGreen<'db>,
24252 rbrack: TerminalRBrackGreen<'db>,
24253 ) -> BracketedMacroGreen<'db> {
24254 let children = [lbrack.0, elements.0, rbrack.0];
24255 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24256 BracketedMacroGreen(
24257 GreenNode {
24258 kind: SyntaxKind::BracketedMacro,
24259 details: GreenNodeDetails::Node { children: children.into(), width },
24260 }
24261 .intern(db),
24262 )
24263 }
24264}
24265impl<'db> BracketedMacro<'db> {
24266 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24267 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24268 }
24269 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24270 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24271 }
24272 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24273 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24274 }
24275}
24276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24277pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24278impl<'db> BracketedMacroPtr<'db> {}
24279impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24280 type SyntaxNode = BracketedMacro<'db>;
24281 fn untyped(self) -> SyntaxStablePtrId<'db> {
24282 self.0
24283 }
24284 fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24285 BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24286 }
24287}
24288impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24289 fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24290 ptr.untyped()
24291 }
24292}
24293#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24294pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24295impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24296 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24297 type StablePtr = BracketedMacroPtr<'db>;
24298 type Green = BracketedMacroGreen<'db>;
24299 fn missing(db: &'db dyn Database) -> Self::Green {
24300 BracketedMacroGreen(
24301 GreenNode {
24302 kind: SyntaxKind::BracketedMacro,
24303 details: GreenNodeDetails::Node {
24304 children: [
24305 TerminalLBrack::missing(db).0,
24306 MacroElements::missing(db).0,
24307 TerminalRBrack::missing(db).0,
24308 ]
24309 .into(),
24310 width: TextWidth::default(),
24311 },
24312 }
24313 .intern(db),
24314 )
24315 }
24316 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24317 let kind = node.kind(db);
24318 assert_eq!(
24319 kind,
24320 SyntaxKind::BracketedMacro,
24321 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24322 kind,
24323 SyntaxKind::BracketedMacro
24324 );
24325 Self { node }
24326 }
24327 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24328 let kind = node.kind(db);
24329 if kind == SyntaxKind::BracketedMacro {
24330 Some(Self::from_syntax_node(db, node))
24331 } else {
24332 None
24333 }
24334 }
24335 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24336 self.node
24337 }
24338 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24339 BracketedMacroPtr(self.node.stable_ptr(db))
24340 }
24341}
24342#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24343pub struct LegacyExprInlineMacro<'db> {
24344 node: SyntaxNode<'db>,
24345}
24346impl<'db> LegacyExprInlineMacro<'db> {
24347 pub const INDEX_PATH: usize = 0;
24348 pub const INDEX_BANG: usize = 1;
24349 pub const INDEX_ARGUMENTS: usize = 2;
24350 pub fn new_green(
24351 db: &'db dyn Database,
24352 path: ExprPathGreen<'db>,
24353 bang: TerminalNotGreen<'db>,
24354 arguments: WrappedArgListGreen<'db>,
24355 ) -> LegacyExprInlineMacroGreen<'db> {
24356 let children = [path.0, bang.0, arguments.0];
24357 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24358 LegacyExprInlineMacroGreen(
24359 GreenNode {
24360 kind: SyntaxKind::LegacyExprInlineMacro,
24361 details: GreenNodeDetails::Node { children: children.into(), width },
24362 }
24363 .intern(db),
24364 )
24365 }
24366}
24367impl<'db> LegacyExprInlineMacro<'db> {
24368 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24369 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24370 }
24371 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24372 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24373 }
24374 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24375 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24376 }
24377}
24378#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24379pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24380impl<'db> LegacyExprInlineMacroPtr<'db> {}
24381impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24382 type SyntaxNode = LegacyExprInlineMacro<'db>;
24383 fn untyped(self) -> SyntaxStablePtrId<'db> {
24384 self.0
24385 }
24386 fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24387 LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24388 }
24389}
24390impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24391 fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24392 ptr.untyped()
24393 }
24394}
24395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24396pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24397impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24398 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24399 type StablePtr = LegacyExprInlineMacroPtr<'db>;
24400 type Green = LegacyExprInlineMacroGreen<'db>;
24401 fn missing(db: &'db dyn Database) -> Self::Green {
24402 LegacyExprInlineMacroGreen(
24403 GreenNode {
24404 kind: SyntaxKind::LegacyExprInlineMacro,
24405 details: GreenNodeDetails::Node {
24406 children: [
24407 ExprPath::missing(db).0,
24408 TerminalNot::missing(db).0,
24409 WrappedArgList::missing(db).0,
24410 ]
24411 .into(),
24412 width: TextWidth::default(),
24413 },
24414 }
24415 .intern(db),
24416 )
24417 }
24418 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24419 let kind = node.kind(db);
24420 assert_eq!(
24421 kind,
24422 SyntaxKind::LegacyExprInlineMacro,
24423 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24424 kind,
24425 SyntaxKind::LegacyExprInlineMacro
24426 );
24427 Self { node }
24428 }
24429 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24430 let kind = node.kind(db);
24431 if kind == SyntaxKind::LegacyExprInlineMacro {
24432 Some(Self::from_syntax_node(db, node))
24433 } else {
24434 None
24435 }
24436 }
24437 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24438 self.node
24439 }
24440 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24441 LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24442 }
24443}
24444#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24445pub struct LegacyItemInlineMacro<'db> {
24446 node: SyntaxNode<'db>,
24447}
24448impl<'db> LegacyItemInlineMacro<'db> {
24449 pub const INDEX_ATTRIBUTES: usize = 0;
24450 pub const INDEX_PATH: usize = 1;
24451 pub const INDEX_BANG: usize = 2;
24452 pub const INDEX_ARGUMENTS: usize = 3;
24453 pub const INDEX_SEMICOLON: usize = 4;
24454 pub fn new_green(
24455 db: &'db dyn Database,
24456 attributes: AttributeListGreen<'db>,
24457 path: ExprPathGreen<'db>,
24458 bang: TerminalNotGreen<'db>,
24459 arguments: WrappedArgListGreen<'db>,
24460 semicolon: TerminalSemicolonGreen<'db>,
24461 ) -> LegacyItemInlineMacroGreen<'db> {
24462 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24463 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24464 LegacyItemInlineMacroGreen(
24465 GreenNode {
24466 kind: SyntaxKind::LegacyItemInlineMacro,
24467 details: GreenNodeDetails::Node { children: children.into(), width },
24468 }
24469 .intern(db),
24470 )
24471 }
24472}
24473impl<'db> LegacyItemInlineMacro<'db> {
24474 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24475 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24476 }
24477 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24478 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24479 }
24480 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24481 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24482 }
24483 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24484 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24485 }
24486 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24487 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24488 }
24489}
24490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24491pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24492impl<'db> LegacyItemInlineMacroPtr<'db> {}
24493impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24494 type SyntaxNode = LegacyItemInlineMacro<'db>;
24495 fn untyped(self) -> SyntaxStablePtrId<'db> {
24496 self.0
24497 }
24498 fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24499 LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24500 }
24501}
24502impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24503 fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24504 ptr.untyped()
24505 }
24506}
24507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24508pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24509impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24510 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24511 type StablePtr = LegacyItemInlineMacroPtr<'db>;
24512 type Green = LegacyItemInlineMacroGreen<'db>;
24513 fn missing(db: &'db dyn Database) -> Self::Green {
24514 LegacyItemInlineMacroGreen(
24515 GreenNode {
24516 kind: SyntaxKind::LegacyItemInlineMacro,
24517 details: GreenNodeDetails::Node {
24518 children: [
24519 AttributeList::missing(db).0,
24520 ExprPath::missing(db).0,
24521 TerminalNot::missing(db).0,
24522 WrappedArgList::missing(db).0,
24523 TerminalSemicolon::missing(db).0,
24524 ]
24525 .into(),
24526 width: TextWidth::default(),
24527 },
24528 }
24529 .intern(db),
24530 )
24531 }
24532 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24533 let kind = node.kind(db);
24534 assert_eq!(
24535 kind,
24536 SyntaxKind::LegacyItemInlineMacro,
24537 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24538 kind,
24539 SyntaxKind::LegacyItemInlineMacro
24540 );
24541 Self { node }
24542 }
24543 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24544 let kind = node.kind(db);
24545 if kind == SyntaxKind::LegacyItemInlineMacro {
24546 Some(Self::from_syntax_node(db, node))
24547 } else {
24548 None
24549 }
24550 }
24551 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24552 self.node
24553 }
24554 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24555 LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24556 }
24557}
24558#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24559pub struct TriviumSkippedNode<'db> {
24560 node: SyntaxNode<'db>,
24561}
24562impl<'db> TriviumSkippedNode<'db> {
24563 pub const INDEX_NODE: usize = 0;
24564 pub fn new_green(
24565 db: &'db dyn Database,
24566 node: SkippedNodeGreen<'db>,
24567 ) -> TriviumSkippedNodeGreen<'db> {
24568 let children = [node.0];
24569 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24570 TriviumSkippedNodeGreen(
24571 GreenNode {
24572 kind: SyntaxKind::TriviumSkippedNode,
24573 details: GreenNodeDetails::Node { children: children.into(), width },
24574 }
24575 .intern(db),
24576 )
24577 }
24578}
24579impl<'db> TriviumSkippedNode<'db> {
24580 pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24581 SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24582 }
24583}
24584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24585pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24586impl<'db> TriviumSkippedNodePtr<'db> {}
24587impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24588 type SyntaxNode = TriviumSkippedNode<'db>;
24589 fn untyped(self) -> SyntaxStablePtrId<'db> {
24590 self.0
24591 }
24592 fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24593 TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24594 }
24595}
24596impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24597 fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24598 ptr.untyped()
24599 }
24600}
24601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24602pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24603impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24604 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24605 type StablePtr = TriviumSkippedNodePtr<'db>;
24606 type Green = TriviumSkippedNodeGreen<'db>;
24607 fn missing(db: &'db dyn Database) -> Self::Green {
24608 TriviumSkippedNodeGreen(
24609 GreenNode {
24610 kind: SyntaxKind::TriviumSkippedNode,
24611 details: GreenNodeDetails::Node {
24612 children: [SkippedNode::missing(db).0].into(),
24613 width: TextWidth::default(),
24614 },
24615 }
24616 .intern(db),
24617 )
24618 }
24619 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24620 let kind = node.kind(db);
24621 assert_eq!(
24622 kind,
24623 SyntaxKind::TriviumSkippedNode,
24624 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24625 kind,
24626 SyntaxKind::TriviumSkippedNode
24627 );
24628 Self { node }
24629 }
24630 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24631 let kind = node.kind(db);
24632 if kind == SyntaxKind::TriviumSkippedNode {
24633 Some(Self::from_syntax_node(db, node))
24634 } else {
24635 None
24636 }
24637 }
24638 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24639 self.node
24640 }
24641 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24642 TriviumSkippedNodePtr(self.node.stable_ptr(db))
24643 }
24644}
24645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24646pub enum SkippedNode<'db> {
24647 AttributeList(AttributeList<'db>),
24648 VisibilityPub(VisibilityPub<'db>),
24649 ExprPath(ExprPath<'db>),
24650}
24651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24652pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24653impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
24654 type SyntaxNode = SkippedNode<'db>;
24655 fn untyped(self) -> SyntaxStablePtrId<'db> {
24656 self.0
24657 }
24658 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24659 SkippedNode::from_syntax_node(db, self.0.lookup(db))
24660 }
24661}
24662impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24663 fn from(ptr: SkippedNodePtr<'db>) -> Self {
24664 ptr.untyped()
24665 }
24666}
24667impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
24668 fn from(value: AttributeListPtr<'db>) -> Self {
24669 Self(value.0)
24670 }
24671}
24672impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
24673 fn from(value: VisibilityPubPtr<'db>) -> Self {
24674 Self(value.0)
24675 }
24676}
24677impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
24678 fn from(value: ExprPathPtr<'db>) -> Self {
24679 Self(value.0)
24680 }
24681}
24682impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
24683 fn from(value: AttributeListGreen<'db>) -> Self {
24684 Self(value.0)
24685 }
24686}
24687impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
24688 fn from(value: VisibilityPubGreen<'db>) -> Self {
24689 Self(value.0)
24690 }
24691}
24692impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
24693 fn from(value: ExprPathGreen<'db>) -> Self {
24694 Self(value.0)
24695 }
24696}
24697#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24698pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
24699impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
24700 const OPTIONAL_KIND: Option<SyntaxKind> = None;
24701 type StablePtr = SkippedNodePtr<'db>;
24702 type Green = SkippedNodeGreen<'db>;
24703 fn missing(db: &'db dyn Database) -> Self::Green {
24704 panic!("No missing variant.");
24705 }
24706 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24707 let kind = node.kind(db);
24708 match kind {
24709 SyntaxKind::AttributeList => {
24710 SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
24711 }
24712 SyntaxKind::VisibilityPub => {
24713 SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
24714 }
24715 SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
24716 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
24717 }
24718 }
24719 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24720 let kind = node.kind(db);
24721 match kind {
24722 SyntaxKind::AttributeList => {
24723 Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
24724 }
24725 SyntaxKind::VisibilityPub => {
24726 Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
24727 }
24728 SyntaxKind::ExprPath => {
24729 Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
24730 }
24731 _ => None,
24732 }
24733 }
24734 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24735 match self {
24736 SkippedNode::AttributeList(x) => x.as_syntax_node(),
24737 SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
24738 SkippedNode::ExprPath(x) => x.as_syntax_node(),
24739 }
24740 }
24741 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24742 SkippedNodePtr(self.as_syntax_node().stable_ptr(db))
24743 }
24744}
24745impl<'db> SkippedNode<'db> {
24746 pub fn is_variant(kind: SyntaxKind) -> bool {
24748 matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
24749 }
24750}
24751#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24752pub struct TokenIdentifier<'db> {
24753 node: SyntaxNode<'db>,
24754}
24755impl<'db> Token<'db> for TokenIdentifier<'db> {
24756 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
24757 TokenIdentifierGreen(
24758 GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
24759 .intern(db),
24760 )
24761 }
24762 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24763 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
24764 }
24765}
24766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24767pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
24768impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
24769 type SyntaxNode = TokenIdentifier<'db>;
24770 fn untyped(self) -> SyntaxStablePtrId<'db> {
24771 self.0
24772 }
24773 fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
24774 TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
24775 }
24776}
24777impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
24778 fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
24779 ptr.untyped()
24780 }
24781}
24782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24783pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
24784impl<'db> TokenIdentifierGreen<'db> {
24785 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24786 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
24787 }
24788}
24789impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
24790 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
24791 type StablePtr = TokenIdentifierPtr<'db>;
24792 type Green = TokenIdentifierGreen<'db>;
24793 fn missing(db: &'db dyn Database) -> Self::Green {
24794 TokenIdentifierGreen(
24795 GreenNode {
24796 kind: SyntaxKind::TokenMissing,
24797 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
24798 }
24799 .intern(db),
24800 )
24801 }
24802 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24803 match node.green_node(db).details {
24804 GreenNodeDetails::Token(_) => Self { node },
24805 GreenNodeDetails::Node { .. } => {
24806 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
24807 }
24808 }
24809 }
24810 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24811 match node.green_node(db).details {
24812 GreenNodeDetails::Token(_) => Some(Self { node }),
24813 GreenNodeDetails::Node { .. } => None,
24814 }
24815 }
24816 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24817 self.node
24818 }
24819 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24820 TokenIdentifierPtr(self.node.stable_ptr(db))
24821 }
24822}
24823#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24824pub struct TerminalIdentifier<'db> {
24825 node: SyntaxNode<'db>,
24826}
24827impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
24828 const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
24829 type TokenType = TokenIdentifier<'db>;
24830 fn new_green(
24831 db: &'db dyn Database,
24832 leading_trivia: TriviaGreen<'db>,
24833 token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
24834 trailing_trivia: TriviaGreen<'db>,
24835 ) -> Self::Green {
24836 let children = [leading_trivia.0, token.0, trailing_trivia.0];
24837 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24838 TerminalIdentifierGreen(
24839 GreenNode {
24840 kind: SyntaxKind::TerminalIdentifier,
24841 details: GreenNodeDetails::Node { children: children.into(), width },
24842 }
24843 .intern(db),
24844 )
24845 }
24846 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24847 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
24848 unreachable!("Expected a node, not a token");
24849 };
24850 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
24851 }
24852}
24853impl<'db> TerminalIdentifier<'db> {
24854 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
24855 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
24856 }
24857 pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
24858 TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
24859 }
24860 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
24861 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
24862 }
24863}
24864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24865pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
24866impl<'db> TerminalIdentifierPtr<'db> {}
24867impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
24868 type SyntaxNode = TerminalIdentifier<'db>;
24869 fn untyped(self) -> SyntaxStablePtrId<'db> {
24870 self.0
24871 }
24872 fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
24873 TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
24874 }
24875}
24876impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
24877 fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
24878 ptr.untyped()
24879 }
24880}
24881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24882pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
24883impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
24884 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
24885 type StablePtr = TerminalIdentifierPtr<'db>;
24886 type Green = TerminalIdentifierGreen<'db>;
24887 fn missing(db: &'db dyn Database) -> Self::Green {
24888 TerminalIdentifierGreen(
24889 GreenNode {
24890 kind: SyntaxKind::TerminalIdentifier,
24891 details: GreenNodeDetails::Node {
24892 children: [
24893 Trivia::missing(db).0,
24894 TokenIdentifier::missing(db).0,
24895 Trivia::missing(db).0,
24896 ]
24897 .into(),
24898 width: TextWidth::default(),
24899 },
24900 }
24901 .intern(db),
24902 )
24903 }
24904 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24905 let kind = node.kind(db);
24906 assert_eq!(
24907 kind,
24908 SyntaxKind::TerminalIdentifier,
24909 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24910 kind,
24911 SyntaxKind::TerminalIdentifier
24912 );
24913 Self { node }
24914 }
24915 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24916 let kind = node.kind(db);
24917 if kind == SyntaxKind::TerminalIdentifier {
24918 Some(Self::from_syntax_node(db, node))
24919 } else {
24920 None
24921 }
24922 }
24923 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24924 self.node
24925 }
24926 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24927 TerminalIdentifierPtr(self.node.stable_ptr(db))
24928 }
24929}
24930#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24931pub struct TokenLiteralNumber<'db> {
24932 node: SyntaxNode<'db>,
24933}
24934impl<'db> Token<'db> for TokenLiteralNumber<'db> {
24935 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
24936 TokenLiteralNumberGreen(
24937 GreenNode {
24938 kind: SyntaxKind::TokenLiteralNumber,
24939 details: GreenNodeDetails::Token(text),
24940 }
24941 .intern(db),
24942 )
24943 }
24944 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24945 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
24946 }
24947}
24948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24949pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
24950impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
24951 type SyntaxNode = TokenLiteralNumber<'db>;
24952 fn untyped(self) -> SyntaxStablePtrId<'db> {
24953 self.0
24954 }
24955 fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
24956 TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
24957 }
24958}
24959impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
24960 fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
24961 ptr.untyped()
24962 }
24963}
24964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24965pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
24966impl<'db> TokenLiteralNumberGreen<'db> {
24967 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24968 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
24969 }
24970}
24971impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
24972 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
24973 type StablePtr = TokenLiteralNumberPtr<'db>;
24974 type Green = TokenLiteralNumberGreen<'db>;
24975 fn missing(db: &'db dyn Database) -> Self::Green {
24976 TokenLiteralNumberGreen(
24977 GreenNode {
24978 kind: SyntaxKind::TokenMissing,
24979 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
24980 }
24981 .intern(db),
24982 )
24983 }
24984 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24985 match node.green_node(db).details {
24986 GreenNodeDetails::Token(_) => Self { node },
24987 GreenNodeDetails::Node { .. } => panic!(
24988 "Expected a token {:?}, not an internal node",
24989 SyntaxKind::TokenLiteralNumber
24990 ),
24991 }
24992 }
24993 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24994 match node.green_node(db).details {
24995 GreenNodeDetails::Token(_) => Some(Self { node }),
24996 GreenNodeDetails::Node { .. } => None,
24997 }
24998 }
24999 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25000 self.node
25001 }
25002 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25003 TokenLiteralNumberPtr(self.node.stable_ptr(db))
25004 }
25005}
25006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25007pub struct TerminalLiteralNumber<'db> {
25008 node: SyntaxNode<'db>,
25009}
25010impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25011 const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25012 type TokenType = TokenLiteralNumber<'db>;
25013 fn new_green(
25014 db: &'db dyn Database,
25015 leading_trivia: TriviaGreen<'db>,
25016 token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25017 trailing_trivia: TriviaGreen<'db>,
25018 ) -> Self::Green {
25019 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25020 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25021 TerminalLiteralNumberGreen(
25022 GreenNode {
25023 kind: SyntaxKind::TerminalLiteralNumber,
25024 details: GreenNodeDetails::Node { children: children.into(), width },
25025 }
25026 .intern(db),
25027 )
25028 }
25029 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25030 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25031 unreachable!("Expected a node, not a token");
25032 };
25033 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25034 }
25035}
25036impl<'db> TerminalLiteralNumber<'db> {
25037 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25038 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25039 }
25040 pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25041 TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25042 }
25043 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25044 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25045 }
25046}
25047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25048pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25049impl<'db> TerminalLiteralNumberPtr<'db> {}
25050impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25051 type SyntaxNode = TerminalLiteralNumber<'db>;
25052 fn untyped(self) -> SyntaxStablePtrId<'db> {
25053 self.0
25054 }
25055 fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25056 TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25057 }
25058}
25059impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25060 fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25061 ptr.untyped()
25062 }
25063}
25064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25065pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25066impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25067 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25068 type StablePtr = TerminalLiteralNumberPtr<'db>;
25069 type Green = TerminalLiteralNumberGreen<'db>;
25070 fn missing(db: &'db dyn Database) -> Self::Green {
25071 TerminalLiteralNumberGreen(
25072 GreenNode {
25073 kind: SyntaxKind::TerminalLiteralNumber,
25074 details: GreenNodeDetails::Node {
25075 children: [
25076 Trivia::missing(db).0,
25077 TokenLiteralNumber::missing(db).0,
25078 Trivia::missing(db).0,
25079 ]
25080 .into(),
25081 width: TextWidth::default(),
25082 },
25083 }
25084 .intern(db),
25085 )
25086 }
25087 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25088 let kind = node.kind(db);
25089 assert_eq!(
25090 kind,
25091 SyntaxKind::TerminalLiteralNumber,
25092 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25093 kind,
25094 SyntaxKind::TerminalLiteralNumber
25095 );
25096 Self { node }
25097 }
25098 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25099 let kind = node.kind(db);
25100 if kind == SyntaxKind::TerminalLiteralNumber {
25101 Some(Self::from_syntax_node(db, node))
25102 } else {
25103 None
25104 }
25105 }
25106 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25107 self.node
25108 }
25109 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25110 TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25111 }
25112}
25113#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25114pub struct TokenShortString<'db> {
25115 node: SyntaxNode<'db>,
25116}
25117impl<'db> Token<'db> for TokenShortString<'db> {
25118 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25119 TokenShortStringGreen(
25120 GreenNode {
25121 kind: SyntaxKind::TokenShortString,
25122 details: GreenNodeDetails::Token(text),
25123 }
25124 .intern(db),
25125 )
25126 }
25127 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25128 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25129 }
25130}
25131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25132pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25133impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25134 type SyntaxNode = TokenShortString<'db>;
25135 fn untyped(self) -> SyntaxStablePtrId<'db> {
25136 self.0
25137 }
25138 fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25139 TokenShortString::from_syntax_node(db, self.0.lookup(db))
25140 }
25141}
25142impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25143 fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25144 ptr.untyped()
25145 }
25146}
25147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25148pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25149impl<'db> TokenShortStringGreen<'db> {
25150 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25151 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25152 }
25153}
25154impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25155 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25156 type StablePtr = TokenShortStringPtr<'db>;
25157 type Green = TokenShortStringGreen<'db>;
25158 fn missing(db: &'db dyn Database) -> Self::Green {
25159 TokenShortStringGreen(
25160 GreenNode {
25161 kind: SyntaxKind::TokenMissing,
25162 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25163 }
25164 .intern(db),
25165 )
25166 }
25167 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25168 match node.green_node(db).details {
25169 GreenNodeDetails::Token(_) => Self { node },
25170 GreenNodeDetails::Node { .. } => {
25171 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25172 }
25173 }
25174 }
25175 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25176 match node.green_node(db).details {
25177 GreenNodeDetails::Token(_) => Some(Self { node }),
25178 GreenNodeDetails::Node { .. } => None,
25179 }
25180 }
25181 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25182 self.node
25183 }
25184 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25185 TokenShortStringPtr(self.node.stable_ptr(db))
25186 }
25187}
25188#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25189pub struct TerminalShortString<'db> {
25190 node: SyntaxNode<'db>,
25191}
25192impl<'db> Terminal<'db> for TerminalShortString<'db> {
25193 const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25194 type TokenType = TokenShortString<'db>;
25195 fn new_green(
25196 db: &'db dyn Database,
25197 leading_trivia: TriviaGreen<'db>,
25198 token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25199 trailing_trivia: TriviaGreen<'db>,
25200 ) -> Self::Green {
25201 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25202 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25203 TerminalShortStringGreen(
25204 GreenNode {
25205 kind: SyntaxKind::TerminalShortString,
25206 details: GreenNodeDetails::Node { children: children.into(), width },
25207 }
25208 .intern(db),
25209 )
25210 }
25211 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25212 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25213 unreachable!("Expected a node, not a token");
25214 };
25215 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25216 }
25217}
25218impl<'db> TerminalShortString<'db> {
25219 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25220 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25221 }
25222 pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25223 TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25224 }
25225 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25226 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25227 }
25228}
25229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25230pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25231impl<'db> TerminalShortStringPtr<'db> {}
25232impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25233 type SyntaxNode = TerminalShortString<'db>;
25234 fn untyped(self) -> SyntaxStablePtrId<'db> {
25235 self.0
25236 }
25237 fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25238 TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25239 }
25240}
25241impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25242 fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25243 ptr.untyped()
25244 }
25245}
25246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25247pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25248impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25249 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25250 type StablePtr = TerminalShortStringPtr<'db>;
25251 type Green = TerminalShortStringGreen<'db>;
25252 fn missing(db: &'db dyn Database) -> Self::Green {
25253 TerminalShortStringGreen(
25254 GreenNode {
25255 kind: SyntaxKind::TerminalShortString,
25256 details: GreenNodeDetails::Node {
25257 children: [
25258 Trivia::missing(db).0,
25259 TokenShortString::missing(db).0,
25260 Trivia::missing(db).0,
25261 ]
25262 .into(),
25263 width: TextWidth::default(),
25264 },
25265 }
25266 .intern(db),
25267 )
25268 }
25269 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25270 let kind = node.kind(db);
25271 assert_eq!(
25272 kind,
25273 SyntaxKind::TerminalShortString,
25274 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25275 kind,
25276 SyntaxKind::TerminalShortString
25277 );
25278 Self { node }
25279 }
25280 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25281 let kind = node.kind(db);
25282 if kind == SyntaxKind::TerminalShortString {
25283 Some(Self::from_syntax_node(db, node))
25284 } else {
25285 None
25286 }
25287 }
25288 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25289 self.node
25290 }
25291 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25292 TerminalShortStringPtr(self.node.stable_ptr(db))
25293 }
25294}
25295#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25296pub struct TokenString<'db> {
25297 node: SyntaxNode<'db>,
25298}
25299impl<'db> Token<'db> for TokenString<'db> {
25300 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25301 TokenStringGreen(
25302 GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25303 .intern(db),
25304 )
25305 }
25306 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25307 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25308 }
25309}
25310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25311pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25312impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25313 type SyntaxNode = TokenString<'db>;
25314 fn untyped(self) -> SyntaxStablePtrId<'db> {
25315 self.0
25316 }
25317 fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25318 TokenString::from_syntax_node(db, self.0.lookup(db))
25319 }
25320}
25321impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25322 fn from(ptr: TokenStringPtr<'db>) -> Self {
25323 ptr.untyped()
25324 }
25325}
25326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25327pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25328impl<'db> TokenStringGreen<'db> {
25329 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25330 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25331 }
25332}
25333impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25334 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25335 type StablePtr = TokenStringPtr<'db>;
25336 type Green = TokenStringGreen<'db>;
25337 fn missing(db: &'db dyn Database) -> Self::Green {
25338 TokenStringGreen(
25339 GreenNode {
25340 kind: SyntaxKind::TokenMissing,
25341 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25342 }
25343 .intern(db),
25344 )
25345 }
25346 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25347 match node.green_node(db).details {
25348 GreenNodeDetails::Token(_) => Self { node },
25349 GreenNodeDetails::Node { .. } => {
25350 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25351 }
25352 }
25353 }
25354 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25355 match node.green_node(db).details {
25356 GreenNodeDetails::Token(_) => Some(Self { node }),
25357 GreenNodeDetails::Node { .. } => None,
25358 }
25359 }
25360 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25361 self.node
25362 }
25363 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25364 TokenStringPtr(self.node.stable_ptr(db))
25365 }
25366}
25367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25368pub struct TerminalString<'db> {
25369 node: SyntaxNode<'db>,
25370}
25371impl<'db> Terminal<'db> for TerminalString<'db> {
25372 const KIND: SyntaxKind = SyntaxKind::TerminalString;
25373 type TokenType = TokenString<'db>;
25374 fn new_green(
25375 db: &'db dyn Database,
25376 leading_trivia: TriviaGreen<'db>,
25377 token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25378 trailing_trivia: TriviaGreen<'db>,
25379 ) -> Self::Green {
25380 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25381 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25382 TerminalStringGreen(
25383 GreenNode {
25384 kind: SyntaxKind::TerminalString,
25385 details: GreenNodeDetails::Node { children: children.into(), width },
25386 }
25387 .intern(db),
25388 )
25389 }
25390 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25391 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25392 unreachable!("Expected a node, not a token");
25393 };
25394 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25395 }
25396}
25397impl<'db> TerminalString<'db> {
25398 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25399 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25400 }
25401 pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25402 TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25403 }
25404 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25405 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25406 }
25407}
25408#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25409pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25410impl<'db> TerminalStringPtr<'db> {}
25411impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25412 type SyntaxNode = TerminalString<'db>;
25413 fn untyped(self) -> SyntaxStablePtrId<'db> {
25414 self.0
25415 }
25416 fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25417 TerminalString::from_syntax_node(db, self.0.lookup(db))
25418 }
25419}
25420impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25421 fn from(ptr: TerminalStringPtr<'db>) -> Self {
25422 ptr.untyped()
25423 }
25424}
25425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25426pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25427impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25428 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25429 type StablePtr = TerminalStringPtr<'db>;
25430 type Green = TerminalStringGreen<'db>;
25431 fn missing(db: &'db dyn Database) -> Self::Green {
25432 TerminalStringGreen(
25433 GreenNode {
25434 kind: SyntaxKind::TerminalString,
25435 details: GreenNodeDetails::Node {
25436 children: [
25437 Trivia::missing(db).0,
25438 TokenString::missing(db).0,
25439 Trivia::missing(db).0,
25440 ]
25441 .into(),
25442 width: TextWidth::default(),
25443 },
25444 }
25445 .intern(db),
25446 )
25447 }
25448 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25449 let kind = node.kind(db);
25450 assert_eq!(
25451 kind,
25452 SyntaxKind::TerminalString,
25453 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25454 kind,
25455 SyntaxKind::TerminalString
25456 );
25457 Self { node }
25458 }
25459 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25460 let kind = node.kind(db);
25461 if kind == SyntaxKind::TerminalString {
25462 Some(Self::from_syntax_node(db, node))
25463 } else {
25464 None
25465 }
25466 }
25467 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25468 self.node
25469 }
25470 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25471 TerminalStringPtr(self.node.stable_ptr(db))
25472 }
25473}
25474#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25475pub struct TokenAs<'db> {
25476 node: SyntaxNode<'db>,
25477}
25478impl<'db> Token<'db> for TokenAs<'db> {
25479 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25480 TokenAsGreen(
25481 GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25482 .intern(db),
25483 )
25484 }
25485 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25486 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25487 }
25488}
25489#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25490pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25491impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25492 type SyntaxNode = TokenAs<'db>;
25493 fn untyped(self) -> SyntaxStablePtrId<'db> {
25494 self.0
25495 }
25496 fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25497 TokenAs::from_syntax_node(db, self.0.lookup(db))
25498 }
25499}
25500impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25501 fn from(ptr: TokenAsPtr<'db>) -> Self {
25502 ptr.untyped()
25503 }
25504}
25505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25506pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25507impl<'db> TokenAsGreen<'db> {
25508 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25509 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25510 }
25511}
25512impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25513 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25514 type StablePtr = TokenAsPtr<'db>;
25515 type Green = TokenAsGreen<'db>;
25516 fn missing(db: &'db dyn Database) -> Self::Green {
25517 TokenAsGreen(
25518 GreenNode {
25519 kind: SyntaxKind::TokenMissing,
25520 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25521 }
25522 .intern(db),
25523 )
25524 }
25525 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25526 match node.green_node(db).details {
25527 GreenNodeDetails::Token(_) => Self { node },
25528 GreenNodeDetails::Node { .. } => {
25529 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25530 }
25531 }
25532 }
25533 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25534 match node.green_node(db).details {
25535 GreenNodeDetails::Token(_) => Some(Self { node }),
25536 GreenNodeDetails::Node { .. } => None,
25537 }
25538 }
25539 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25540 self.node
25541 }
25542 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25543 TokenAsPtr(self.node.stable_ptr(db))
25544 }
25545}
25546#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25547pub struct TerminalAs<'db> {
25548 node: SyntaxNode<'db>,
25549}
25550impl<'db> Terminal<'db> for TerminalAs<'db> {
25551 const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25552 type TokenType = TokenAs<'db>;
25553 fn new_green(
25554 db: &'db dyn Database,
25555 leading_trivia: TriviaGreen<'db>,
25556 token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25557 trailing_trivia: TriviaGreen<'db>,
25558 ) -> Self::Green {
25559 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25560 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25561 TerminalAsGreen(
25562 GreenNode {
25563 kind: SyntaxKind::TerminalAs,
25564 details: GreenNodeDetails::Node { children: children.into(), width },
25565 }
25566 .intern(db),
25567 )
25568 }
25569 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25570 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25571 unreachable!("Expected a node, not a token");
25572 };
25573 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25574 }
25575}
25576impl<'db> TerminalAs<'db> {
25577 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25578 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25579 }
25580 pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25581 TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25582 }
25583 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25584 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25585 }
25586}
25587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25588pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25589impl<'db> TerminalAsPtr<'db> {}
25590impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25591 type SyntaxNode = TerminalAs<'db>;
25592 fn untyped(self) -> SyntaxStablePtrId<'db> {
25593 self.0
25594 }
25595 fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25596 TerminalAs::from_syntax_node(db, self.0.lookup(db))
25597 }
25598}
25599impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25600 fn from(ptr: TerminalAsPtr<'db>) -> Self {
25601 ptr.untyped()
25602 }
25603}
25604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25605pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
25606impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
25607 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
25608 type StablePtr = TerminalAsPtr<'db>;
25609 type Green = TerminalAsGreen<'db>;
25610 fn missing(db: &'db dyn Database) -> Self::Green {
25611 TerminalAsGreen(
25612 GreenNode {
25613 kind: SyntaxKind::TerminalAs,
25614 details: GreenNodeDetails::Node {
25615 children: [
25616 Trivia::missing(db).0,
25617 TokenAs::missing(db).0,
25618 Trivia::missing(db).0,
25619 ]
25620 .into(),
25621 width: TextWidth::default(),
25622 },
25623 }
25624 .intern(db),
25625 )
25626 }
25627 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25628 let kind = node.kind(db);
25629 assert_eq!(
25630 kind,
25631 SyntaxKind::TerminalAs,
25632 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25633 kind,
25634 SyntaxKind::TerminalAs
25635 );
25636 Self { node }
25637 }
25638 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25639 let kind = node.kind(db);
25640 if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
25641 }
25642 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25643 self.node
25644 }
25645 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25646 TerminalAsPtr(self.node.stable_ptr(db))
25647 }
25648}
25649#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25650pub struct TokenConst<'db> {
25651 node: SyntaxNode<'db>,
25652}
25653impl<'db> Token<'db> for TokenConst<'db> {
25654 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25655 TokenConstGreen(
25656 GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
25657 .intern(db),
25658 )
25659 }
25660 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25661 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25662 }
25663}
25664#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25665pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25666impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
25667 type SyntaxNode = TokenConst<'db>;
25668 fn untyped(self) -> SyntaxStablePtrId<'db> {
25669 self.0
25670 }
25671 fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
25672 TokenConst::from_syntax_node(db, self.0.lookup(db))
25673 }
25674}
25675impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
25676 fn from(ptr: TokenConstPtr<'db>) -> Self {
25677 ptr.untyped()
25678 }
25679}
25680#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25681pub struct TokenConstGreen<'db>(pub GreenId<'db>);
25682impl<'db> TokenConstGreen<'db> {
25683 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25684 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25685 }
25686}
25687impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
25688 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
25689 type StablePtr = TokenConstPtr<'db>;
25690 type Green = TokenConstGreen<'db>;
25691 fn missing(db: &'db dyn Database) -> Self::Green {
25692 TokenConstGreen(
25693 GreenNode {
25694 kind: SyntaxKind::TokenMissing,
25695 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25696 }
25697 .intern(db),
25698 )
25699 }
25700 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25701 match node.green_node(db).details {
25702 GreenNodeDetails::Token(_) => Self { node },
25703 GreenNodeDetails::Node { .. } => {
25704 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
25705 }
25706 }
25707 }
25708 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25709 match node.green_node(db).details {
25710 GreenNodeDetails::Token(_) => Some(Self { node }),
25711 GreenNodeDetails::Node { .. } => None,
25712 }
25713 }
25714 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25715 self.node
25716 }
25717 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25718 TokenConstPtr(self.node.stable_ptr(db))
25719 }
25720}
25721#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25722pub struct TerminalConst<'db> {
25723 node: SyntaxNode<'db>,
25724}
25725impl<'db> Terminal<'db> for TerminalConst<'db> {
25726 const KIND: SyntaxKind = SyntaxKind::TerminalConst;
25727 type TokenType = TokenConst<'db>;
25728 fn new_green(
25729 db: &'db dyn Database,
25730 leading_trivia: TriviaGreen<'db>,
25731 token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25732 trailing_trivia: TriviaGreen<'db>,
25733 ) -> Self::Green {
25734 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25735 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25736 TerminalConstGreen(
25737 GreenNode {
25738 kind: SyntaxKind::TerminalConst,
25739 details: GreenNodeDetails::Node { children: children.into(), width },
25740 }
25741 .intern(db),
25742 )
25743 }
25744 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25745 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25746 unreachable!("Expected a node, not a token");
25747 };
25748 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25749 }
25750}
25751impl<'db> TerminalConst<'db> {
25752 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25753 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25754 }
25755 pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
25756 TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
25757 }
25758 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25759 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25760 }
25761}
25762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25763pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25764impl<'db> TerminalConstPtr<'db> {}
25765impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
25766 type SyntaxNode = TerminalConst<'db>;
25767 fn untyped(self) -> SyntaxStablePtrId<'db> {
25768 self.0
25769 }
25770 fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
25771 TerminalConst::from_syntax_node(db, self.0.lookup(db))
25772 }
25773}
25774impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
25775 fn from(ptr: TerminalConstPtr<'db>) -> Self {
25776 ptr.untyped()
25777 }
25778}
25779#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25780pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
25781impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
25782 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
25783 type StablePtr = TerminalConstPtr<'db>;
25784 type Green = TerminalConstGreen<'db>;
25785 fn missing(db: &'db dyn Database) -> Self::Green {
25786 TerminalConstGreen(
25787 GreenNode {
25788 kind: SyntaxKind::TerminalConst,
25789 details: GreenNodeDetails::Node {
25790 children: [
25791 Trivia::missing(db).0,
25792 TokenConst::missing(db).0,
25793 Trivia::missing(db).0,
25794 ]
25795 .into(),
25796 width: TextWidth::default(),
25797 },
25798 }
25799 .intern(db),
25800 )
25801 }
25802 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25803 let kind = node.kind(db);
25804 assert_eq!(
25805 kind,
25806 SyntaxKind::TerminalConst,
25807 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25808 kind,
25809 SyntaxKind::TerminalConst
25810 );
25811 Self { node }
25812 }
25813 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25814 let kind = node.kind(db);
25815 if kind == SyntaxKind::TerminalConst {
25816 Some(Self::from_syntax_node(db, node))
25817 } else {
25818 None
25819 }
25820 }
25821 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25822 self.node
25823 }
25824 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25825 TerminalConstPtr(self.node.stable_ptr(db))
25826 }
25827}
25828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25829pub struct TokenElse<'db> {
25830 node: SyntaxNode<'db>,
25831}
25832impl<'db> Token<'db> for TokenElse<'db> {
25833 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25834 TokenElseGreen(
25835 GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
25836 .intern(db),
25837 )
25838 }
25839 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25840 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25841 }
25842}
25843#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25844pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
25845impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
25846 type SyntaxNode = TokenElse<'db>;
25847 fn untyped(self) -> SyntaxStablePtrId<'db> {
25848 self.0
25849 }
25850 fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
25851 TokenElse::from_syntax_node(db, self.0.lookup(db))
25852 }
25853}
25854impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
25855 fn from(ptr: TokenElsePtr<'db>) -> Self {
25856 ptr.untyped()
25857 }
25858}
25859#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25860pub struct TokenElseGreen<'db>(pub GreenId<'db>);
25861impl<'db> TokenElseGreen<'db> {
25862 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25863 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25864 }
25865}
25866impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
25867 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
25868 type StablePtr = TokenElsePtr<'db>;
25869 type Green = TokenElseGreen<'db>;
25870 fn missing(db: &'db dyn Database) -> Self::Green {
25871 TokenElseGreen(
25872 GreenNode {
25873 kind: SyntaxKind::TokenMissing,
25874 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25875 }
25876 .intern(db),
25877 )
25878 }
25879 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25880 match node.green_node(db).details {
25881 GreenNodeDetails::Token(_) => Self { node },
25882 GreenNodeDetails::Node { .. } => {
25883 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
25884 }
25885 }
25886 }
25887 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25888 match node.green_node(db).details {
25889 GreenNodeDetails::Token(_) => Some(Self { node }),
25890 GreenNodeDetails::Node { .. } => None,
25891 }
25892 }
25893 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25894 self.node
25895 }
25896 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25897 TokenElsePtr(self.node.stable_ptr(db))
25898 }
25899}
25900#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25901pub struct TerminalElse<'db> {
25902 node: SyntaxNode<'db>,
25903}
25904impl<'db> Terminal<'db> for TerminalElse<'db> {
25905 const KIND: SyntaxKind = SyntaxKind::TerminalElse;
25906 type TokenType = TokenElse<'db>;
25907 fn new_green(
25908 db: &'db dyn Database,
25909 leading_trivia: TriviaGreen<'db>,
25910 token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25911 trailing_trivia: TriviaGreen<'db>,
25912 ) -> Self::Green {
25913 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25914 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25915 TerminalElseGreen(
25916 GreenNode {
25917 kind: SyntaxKind::TerminalElse,
25918 details: GreenNodeDetails::Node { children: children.into(), width },
25919 }
25920 .intern(db),
25921 )
25922 }
25923 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25924 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25925 unreachable!("Expected a node, not a token");
25926 };
25927 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25928 }
25929}
25930impl<'db> TerminalElse<'db> {
25931 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25932 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25933 }
25934 pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
25935 TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
25936 }
25937 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25938 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25939 }
25940}
25941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25942pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
25943impl<'db> TerminalElsePtr<'db> {}
25944impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
25945 type SyntaxNode = TerminalElse<'db>;
25946 fn untyped(self) -> SyntaxStablePtrId<'db> {
25947 self.0
25948 }
25949 fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
25950 TerminalElse::from_syntax_node(db, self.0.lookup(db))
25951 }
25952}
25953impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
25954 fn from(ptr: TerminalElsePtr<'db>) -> Self {
25955 ptr.untyped()
25956 }
25957}
25958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25959pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
25960impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
25961 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
25962 type StablePtr = TerminalElsePtr<'db>;
25963 type Green = TerminalElseGreen<'db>;
25964 fn missing(db: &'db dyn Database) -> Self::Green {
25965 TerminalElseGreen(
25966 GreenNode {
25967 kind: SyntaxKind::TerminalElse,
25968 details: GreenNodeDetails::Node {
25969 children: [
25970 Trivia::missing(db).0,
25971 TokenElse::missing(db).0,
25972 Trivia::missing(db).0,
25973 ]
25974 .into(),
25975 width: TextWidth::default(),
25976 },
25977 }
25978 .intern(db),
25979 )
25980 }
25981 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25982 let kind = node.kind(db);
25983 assert_eq!(
25984 kind,
25985 SyntaxKind::TerminalElse,
25986 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25987 kind,
25988 SyntaxKind::TerminalElse
25989 );
25990 Self { node }
25991 }
25992 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25993 let kind = node.kind(db);
25994 if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
25995 }
25996 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25997 self.node
25998 }
25999 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26000 TerminalElsePtr(self.node.stable_ptr(db))
26001 }
26002}
26003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26004pub struct TokenEnum<'db> {
26005 node: SyntaxNode<'db>,
26006}
26007impl<'db> Token<'db> for TokenEnum<'db> {
26008 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26009 TokenEnumGreen(
26010 GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26011 .intern(db),
26012 )
26013 }
26014 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26015 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26016 }
26017}
26018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26019pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26020impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26021 type SyntaxNode = TokenEnum<'db>;
26022 fn untyped(self) -> SyntaxStablePtrId<'db> {
26023 self.0
26024 }
26025 fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26026 TokenEnum::from_syntax_node(db, self.0.lookup(db))
26027 }
26028}
26029impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26030 fn from(ptr: TokenEnumPtr<'db>) -> Self {
26031 ptr.untyped()
26032 }
26033}
26034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26035pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26036impl<'db> TokenEnumGreen<'db> {
26037 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26038 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26039 }
26040}
26041impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26042 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26043 type StablePtr = TokenEnumPtr<'db>;
26044 type Green = TokenEnumGreen<'db>;
26045 fn missing(db: &'db dyn Database) -> Self::Green {
26046 TokenEnumGreen(
26047 GreenNode {
26048 kind: SyntaxKind::TokenMissing,
26049 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26050 }
26051 .intern(db),
26052 )
26053 }
26054 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26055 match node.green_node(db).details {
26056 GreenNodeDetails::Token(_) => Self { node },
26057 GreenNodeDetails::Node { .. } => {
26058 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26059 }
26060 }
26061 }
26062 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26063 match node.green_node(db).details {
26064 GreenNodeDetails::Token(_) => Some(Self { node }),
26065 GreenNodeDetails::Node { .. } => None,
26066 }
26067 }
26068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26069 self.node
26070 }
26071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26072 TokenEnumPtr(self.node.stable_ptr(db))
26073 }
26074}
26075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26076pub struct TerminalEnum<'db> {
26077 node: SyntaxNode<'db>,
26078}
26079impl<'db> Terminal<'db> for TerminalEnum<'db> {
26080 const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26081 type TokenType = TokenEnum<'db>;
26082 fn new_green(
26083 db: &'db dyn Database,
26084 leading_trivia: TriviaGreen<'db>,
26085 token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26086 trailing_trivia: TriviaGreen<'db>,
26087 ) -> Self::Green {
26088 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26089 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26090 TerminalEnumGreen(
26091 GreenNode {
26092 kind: SyntaxKind::TerminalEnum,
26093 details: GreenNodeDetails::Node { children: children.into(), width },
26094 }
26095 .intern(db),
26096 )
26097 }
26098 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26099 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26100 unreachable!("Expected a node, not a token");
26101 };
26102 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26103 }
26104}
26105impl<'db> TerminalEnum<'db> {
26106 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26107 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26108 }
26109 pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26110 TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26111 }
26112 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26113 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26114 }
26115}
26116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26117pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26118impl<'db> TerminalEnumPtr<'db> {}
26119impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26120 type SyntaxNode = TerminalEnum<'db>;
26121 fn untyped(self) -> SyntaxStablePtrId<'db> {
26122 self.0
26123 }
26124 fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26125 TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26126 }
26127}
26128impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26129 fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26130 ptr.untyped()
26131 }
26132}
26133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26134pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26135impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26136 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26137 type StablePtr = TerminalEnumPtr<'db>;
26138 type Green = TerminalEnumGreen<'db>;
26139 fn missing(db: &'db dyn Database) -> Self::Green {
26140 TerminalEnumGreen(
26141 GreenNode {
26142 kind: SyntaxKind::TerminalEnum,
26143 details: GreenNodeDetails::Node {
26144 children: [
26145 Trivia::missing(db).0,
26146 TokenEnum::missing(db).0,
26147 Trivia::missing(db).0,
26148 ]
26149 .into(),
26150 width: TextWidth::default(),
26151 },
26152 }
26153 .intern(db),
26154 )
26155 }
26156 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26157 let kind = node.kind(db);
26158 assert_eq!(
26159 kind,
26160 SyntaxKind::TerminalEnum,
26161 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26162 kind,
26163 SyntaxKind::TerminalEnum
26164 );
26165 Self { node }
26166 }
26167 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26168 let kind = node.kind(db);
26169 if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26170 }
26171 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26172 self.node
26173 }
26174 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26175 TerminalEnumPtr(self.node.stable_ptr(db))
26176 }
26177}
26178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26179pub struct TokenExtern<'db> {
26180 node: SyntaxNode<'db>,
26181}
26182impl<'db> Token<'db> for TokenExtern<'db> {
26183 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26184 TokenExternGreen(
26185 GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26186 .intern(db),
26187 )
26188 }
26189 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26190 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26191 }
26192}
26193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26194pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26195impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26196 type SyntaxNode = TokenExtern<'db>;
26197 fn untyped(self) -> SyntaxStablePtrId<'db> {
26198 self.0
26199 }
26200 fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26201 TokenExtern::from_syntax_node(db, self.0.lookup(db))
26202 }
26203}
26204impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26205 fn from(ptr: TokenExternPtr<'db>) -> Self {
26206 ptr.untyped()
26207 }
26208}
26209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26210pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26211impl<'db> TokenExternGreen<'db> {
26212 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26213 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26214 }
26215}
26216impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26217 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26218 type StablePtr = TokenExternPtr<'db>;
26219 type Green = TokenExternGreen<'db>;
26220 fn missing(db: &'db dyn Database) -> Self::Green {
26221 TokenExternGreen(
26222 GreenNode {
26223 kind: SyntaxKind::TokenMissing,
26224 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26225 }
26226 .intern(db),
26227 )
26228 }
26229 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26230 match node.green_node(db).details {
26231 GreenNodeDetails::Token(_) => Self { node },
26232 GreenNodeDetails::Node { .. } => {
26233 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26234 }
26235 }
26236 }
26237 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26238 match node.green_node(db).details {
26239 GreenNodeDetails::Token(_) => Some(Self { node }),
26240 GreenNodeDetails::Node { .. } => None,
26241 }
26242 }
26243 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26244 self.node
26245 }
26246 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26247 TokenExternPtr(self.node.stable_ptr(db))
26248 }
26249}
26250#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26251pub struct TerminalExtern<'db> {
26252 node: SyntaxNode<'db>,
26253}
26254impl<'db> Terminal<'db> for TerminalExtern<'db> {
26255 const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26256 type TokenType = TokenExtern<'db>;
26257 fn new_green(
26258 db: &'db dyn Database,
26259 leading_trivia: TriviaGreen<'db>,
26260 token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26261 trailing_trivia: TriviaGreen<'db>,
26262 ) -> Self::Green {
26263 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26264 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26265 TerminalExternGreen(
26266 GreenNode {
26267 kind: SyntaxKind::TerminalExtern,
26268 details: GreenNodeDetails::Node { children: children.into(), width },
26269 }
26270 .intern(db),
26271 )
26272 }
26273 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26274 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26275 unreachable!("Expected a node, not a token");
26276 };
26277 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26278 }
26279}
26280impl<'db> TerminalExtern<'db> {
26281 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26282 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26283 }
26284 pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26285 TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26286 }
26287 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26288 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26289 }
26290}
26291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26292pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26293impl<'db> TerminalExternPtr<'db> {}
26294impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26295 type SyntaxNode = TerminalExtern<'db>;
26296 fn untyped(self) -> SyntaxStablePtrId<'db> {
26297 self.0
26298 }
26299 fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26300 TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26301 }
26302}
26303impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26304 fn from(ptr: TerminalExternPtr<'db>) -> Self {
26305 ptr.untyped()
26306 }
26307}
26308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26309pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26310impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26311 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26312 type StablePtr = TerminalExternPtr<'db>;
26313 type Green = TerminalExternGreen<'db>;
26314 fn missing(db: &'db dyn Database) -> Self::Green {
26315 TerminalExternGreen(
26316 GreenNode {
26317 kind: SyntaxKind::TerminalExtern,
26318 details: GreenNodeDetails::Node {
26319 children: [
26320 Trivia::missing(db).0,
26321 TokenExtern::missing(db).0,
26322 Trivia::missing(db).0,
26323 ]
26324 .into(),
26325 width: TextWidth::default(),
26326 },
26327 }
26328 .intern(db),
26329 )
26330 }
26331 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26332 let kind = node.kind(db);
26333 assert_eq!(
26334 kind,
26335 SyntaxKind::TerminalExtern,
26336 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26337 kind,
26338 SyntaxKind::TerminalExtern
26339 );
26340 Self { node }
26341 }
26342 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26343 let kind = node.kind(db);
26344 if kind == SyntaxKind::TerminalExtern {
26345 Some(Self::from_syntax_node(db, node))
26346 } else {
26347 None
26348 }
26349 }
26350 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26351 self.node
26352 }
26353 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26354 TerminalExternPtr(self.node.stable_ptr(db))
26355 }
26356}
26357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26358pub struct TokenFalse<'db> {
26359 node: SyntaxNode<'db>,
26360}
26361impl<'db> Token<'db> for TokenFalse<'db> {
26362 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26363 TokenFalseGreen(
26364 GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26365 .intern(db),
26366 )
26367 }
26368 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26369 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26370 }
26371}
26372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26373pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26374impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26375 type SyntaxNode = TokenFalse<'db>;
26376 fn untyped(self) -> SyntaxStablePtrId<'db> {
26377 self.0
26378 }
26379 fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26380 TokenFalse::from_syntax_node(db, self.0.lookup(db))
26381 }
26382}
26383impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26384 fn from(ptr: TokenFalsePtr<'db>) -> Self {
26385 ptr.untyped()
26386 }
26387}
26388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26389pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26390impl<'db> TokenFalseGreen<'db> {
26391 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26392 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26393 }
26394}
26395impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26396 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26397 type StablePtr = TokenFalsePtr<'db>;
26398 type Green = TokenFalseGreen<'db>;
26399 fn missing(db: &'db dyn Database) -> Self::Green {
26400 TokenFalseGreen(
26401 GreenNode {
26402 kind: SyntaxKind::TokenMissing,
26403 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26404 }
26405 .intern(db),
26406 )
26407 }
26408 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26409 match node.green_node(db).details {
26410 GreenNodeDetails::Token(_) => Self { node },
26411 GreenNodeDetails::Node { .. } => {
26412 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26413 }
26414 }
26415 }
26416 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26417 match node.green_node(db).details {
26418 GreenNodeDetails::Token(_) => Some(Self { node }),
26419 GreenNodeDetails::Node { .. } => None,
26420 }
26421 }
26422 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26423 self.node
26424 }
26425 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26426 TokenFalsePtr(self.node.stable_ptr(db))
26427 }
26428}
26429#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26430pub struct TerminalFalse<'db> {
26431 node: SyntaxNode<'db>,
26432}
26433impl<'db> Terminal<'db> for TerminalFalse<'db> {
26434 const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26435 type TokenType = TokenFalse<'db>;
26436 fn new_green(
26437 db: &'db dyn Database,
26438 leading_trivia: TriviaGreen<'db>,
26439 token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26440 trailing_trivia: TriviaGreen<'db>,
26441 ) -> Self::Green {
26442 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26443 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26444 TerminalFalseGreen(
26445 GreenNode {
26446 kind: SyntaxKind::TerminalFalse,
26447 details: GreenNodeDetails::Node { children: children.into(), width },
26448 }
26449 .intern(db),
26450 )
26451 }
26452 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26453 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26454 unreachable!("Expected a node, not a token");
26455 };
26456 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26457 }
26458}
26459impl<'db> TerminalFalse<'db> {
26460 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26461 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26462 }
26463 pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26464 TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26465 }
26466 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26467 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26468 }
26469}
26470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26471pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26472impl<'db> TerminalFalsePtr<'db> {}
26473impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26474 type SyntaxNode = TerminalFalse<'db>;
26475 fn untyped(self) -> SyntaxStablePtrId<'db> {
26476 self.0
26477 }
26478 fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26479 TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26480 }
26481}
26482impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26483 fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26484 ptr.untyped()
26485 }
26486}
26487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26488pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26489impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26490 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26491 type StablePtr = TerminalFalsePtr<'db>;
26492 type Green = TerminalFalseGreen<'db>;
26493 fn missing(db: &'db dyn Database) -> Self::Green {
26494 TerminalFalseGreen(
26495 GreenNode {
26496 kind: SyntaxKind::TerminalFalse,
26497 details: GreenNodeDetails::Node {
26498 children: [
26499 Trivia::missing(db).0,
26500 TokenFalse::missing(db).0,
26501 Trivia::missing(db).0,
26502 ]
26503 .into(),
26504 width: TextWidth::default(),
26505 },
26506 }
26507 .intern(db),
26508 )
26509 }
26510 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26511 let kind = node.kind(db);
26512 assert_eq!(
26513 kind,
26514 SyntaxKind::TerminalFalse,
26515 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26516 kind,
26517 SyntaxKind::TerminalFalse
26518 );
26519 Self { node }
26520 }
26521 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26522 let kind = node.kind(db);
26523 if kind == SyntaxKind::TerminalFalse {
26524 Some(Self::from_syntax_node(db, node))
26525 } else {
26526 None
26527 }
26528 }
26529 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26530 self.node
26531 }
26532 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26533 TerminalFalsePtr(self.node.stable_ptr(db))
26534 }
26535}
26536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26537pub struct TokenFunction<'db> {
26538 node: SyntaxNode<'db>,
26539}
26540impl<'db> Token<'db> for TokenFunction<'db> {
26541 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26542 TokenFunctionGreen(
26543 GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26544 .intern(db),
26545 )
26546 }
26547 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26548 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26549 }
26550}
26551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26552pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26553impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26554 type SyntaxNode = TokenFunction<'db>;
26555 fn untyped(self) -> SyntaxStablePtrId<'db> {
26556 self.0
26557 }
26558 fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26559 TokenFunction::from_syntax_node(db, self.0.lookup(db))
26560 }
26561}
26562impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26563 fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26564 ptr.untyped()
26565 }
26566}
26567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26568pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26569impl<'db> TokenFunctionGreen<'db> {
26570 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26571 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26572 }
26573}
26574impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26575 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26576 type StablePtr = TokenFunctionPtr<'db>;
26577 type Green = TokenFunctionGreen<'db>;
26578 fn missing(db: &'db dyn Database) -> Self::Green {
26579 TokenFunctionGreen(
26580 GreenNode {
26581 kind: SyntaxKind::TokenMissing,
26582 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26583 }
26584 .intern(db),
26585 )
26586 }
26587 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26588 match node.green_node(db).details {
26589 GreenNodeDetails::Token(_) => Self { node },
26590 GreenNodeDetails::Node { .. } => {
26591 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26592 }
26593 }
26594 }
26595 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26596 match node.green_node(db).details {
26597 GreenNodeDetails::Token(_) => Some(Self { node }),
26598 GreenNodeDetails::Node { .. } => None,
26599 }
26600 }
26601 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26602 self.node
26603 }
26604 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26605 TokenFunctionPtr(self.node.stable_ptr(db))
26606 }
26607}
26608#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26609pub struct TerminalFunction<'db> {
26610 node: SyntaxNode<'db>,
26611}
26612impl<'db> Terminal<'db> for TerminalFunction<'db> {
26613 const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
26614 type TokenType = TokenFunction<'db>;
26615 fn new_green(
26616 db: &'db dyn Database,
26617 leading_trivia: TriviaGreen<'db>,
26618 token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26619 trailing_trivia: TriviaGreen<'db>,
26620 ) -> Self::Green {
26621 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26622 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26623 TerminalFunctionGreen(
26624 GreenNode {
26625 kind: SyntaxKind::TerminalFunction,
26626 details: GreenNodeDetails::Node { children: children.into(), width },
26627 }
26628 .intern(db),
26629 )
26630 }
26631 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26632 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26633 unreachable!("Expected a node, not a token");
26634 };
26635 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26636 }
26637}
26638impl<'db> TerminalFunction<'db> {
26639 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26640 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26641 }
26642 pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26643 TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
26644 }
26645 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26646 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26647 }
26648}
26649#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26650pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26651impl<'db> TerminalFunctionPtr<'db> {}
26652impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
26653 type SyntaxNode = TerminalFunction<'db>;
26654 fn untyped(self) -> SyntaxStablePtrId<'db> {
26655 self.0
26656 }
26657 fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
26658 TerminalFunction::from_syntax_node(db, self.0.lookup(db))
26659 }
26660}
26661impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26662 fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
26663 ptr.untyped()
26664 }
26665}
26666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26667pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
26668impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
26669 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
26670 type StablePtr = TerminalFunctionPtr<'db>;
26671 type Green = TerminalFunctionGreen<'db>;
26672 fn missing(db: &'db dyn Database) -> Self::Green {
26673 TerminalFunctionGreen(
26674 GreenNode {
26675 kind: SyntaxKind::TerminalFunction,
26676 details: GreenNodeDetails::Node {
26677 children: [
26678 Trivia::missing(db).0,
26679 TokenFunction::missing(db).0,
26680 Trivia::missing(db).0,
26681 ]
26682 .into(),
26683 width: TextWidth::default(),
26684 },
26685 }
26686 .intern(db),
26687 )
26688 }
26689 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26690 let kind = node.kind(db);
26691 assert_eq!(
26692 kind,
26693 SyntaxKind::TerminalFunction,
26694 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26695 kind,
26696 SyntaxKind::TerminalFunction
26697 );
26698 Self { node }
26699 }
26700 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26701 let kind = node.kind(db);
26702 if kind == SyntaxKind::TerminalFunction {
26703 Some(Self::from_syntax_node(db, node))
26704 } else {
26705 None
26706 }
26707 }
26708 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26709 self.node
26710 }
26711 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26712 TerminalFunctionPtr(self.node.stable_ptr(db))
26713 }
26714}
26715#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26716pub struct TokenIf<'db> {
26717 node: SyntaxNode<'db>,
26718}
26719impl<'db> Token<'db> for TokenIf<'db> {
26720 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26721 TokenIfGreen(
26722 GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
26723 .intern(db),
26724 )
26725 }
26726 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26727 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26728 }
26729}
26730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26731pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26732impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
26733 type SyntaxNode = TokenIf<'db>;
26734 fn untyped(self) -> SyntaxStablePtrId<'db> {
26735 self.0
26736 }
26737 fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
26738 TokenIf::from_syntax_node(db, self.0.lookup(db))
26739 }
26740}
26741impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
26742 fn from(ptr: TokenIfPtr<'db>) -> Self {
26743 ptr.untyped()
26744 }
26745}
26746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26747pub struct TokenIfGreen<'db>(pub GreenId<'db>);
26748impl<'db> TokenIfGreen<'db> {
26749 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26750 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26751 }
26752}
26753impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
26754 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
26755 type StablePtr = TokenIfPtr<'db>;
26756 type Green = TokenIfGreen<'db>;
26757 fn missing(db: &'db dyn Database) -> Self::Green {
26758 TokenIfGreen(
26759 GreenNode {
26760 kind: SyntaxKind::TokenMissing,
26761 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26762 }
26763 .intern(db),
26764 )
26765 }
26766 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26767 match node.green_node(db).details {
26768 GreenNodeDetails::Token(_) => Self { node },
26769 GreenNodeDetails::Node { .. } => {
26770 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
26771 }
26772 }
26773 }
26774 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26775 match node.green_node(db).details {
26776 GreenNodeDetails::Token(_) => Some(Self { node }),
26777 GreenNodeDetails::Node { .. } => None,
26778 }
26779 }
26780 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26781 self.node
26782 }
26783 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26784 TokenIfPtr(self.node.stable_ptr(db))
26785 }
26786}
26787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26788pub struct TerminalIf<'db> {
26789 node: SyntaxNode<'db>,
26790}
26791impl<'db> Terminal<'db> for TerminalIf<'db> {
26792 const KIND: SyntaxKind = SyntaxKind::TerminalIf;
26793 type TokenType = TokenIf<'db>;
26794 fn new_green(
26795 db: &'db dyn Database,
26796 leading_trivia: TriviaGreen<'db>,
26797 token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26798 trailing_trivia: TriviaGreen<'db>,
26799 ) -> Self::Green {
26800 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26801 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26802 TerminalIfGreen(
26803 GreenNode {
26804 kind: SyntaxKind::TerminalIf,
26805 details: GreenNodeDetails::Node { children: children.into(), width },
26806 }
26807 .intern(db),
26808 )
26809 }
26810 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26811 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26812 unreachable!("Expected a node, not a token");
26813 };
26814 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26815 }
26816}
26817impl<'db> TerminalIf<'db> {
26818 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26819 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26820 }
26821 pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
26822 TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
26823 }
26824 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26825 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26826 }
26827}
26828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26829pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26830impl<'db> TerminalIfPtr<'db> {}
26831impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
26832 type SyntaxNode = TerminalIf<'db>;
26833 fn untyped(self) -> SyntaxStablePtrId<'db> {
26834 self.0
26835 }
26836 fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
26837 TerminalIf::from_syntax_node(db, self.0.lookup(db))
26838 }
26839}
26840impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
26841 fn from(ptr: TerminalIfPtr<'db>) -> Self {
26842 ptr.untyped()
26843 }
26844}
26845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26846pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
26847impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
26848 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
26849 type StablePtr = TerminalIfPtr<'db>;
26850 type Green = TerminalIfGreen<'db>;
26851 fn missing(db: &'db dyn Database) -> Self::Green {
26852 TerminalIfGreen(
26853 GreenNode {
26854 kind: SyntaxKind::TerminalIf,
26855 details: GreenNodeDetails::Node {
26856 children: [
26857 Trivia::missing(db).0,
26858 TokenIf::missing(db).0,
26859 Trivia::missing(db).0,
26860 ]
26861 .into(),
26862 width: TextWidth::default(),
26863 },
26864 }
26865 .intern(db),
26866 )
26867 }
26868 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26869 let kind = node.kind(db);
26870 assert_eq!(
26871 kind,
26872 SyntaxKind::TerminalIf,
26873 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26874 kind,
26875 SyntaxKind::TerminalIf
26876 );
26877 Self { node }
26878 }
26879 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26880 let kind = node.kind(db);
26881 if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
26882 }
26883 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26884 self.node
26885 }
26886 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26887 TerminalIfPtr(self.node.stable_ptr(db))
26888 }
26889}
26890#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26891pub struct TokenWhile<'db> {
26892 node: SyntaxNode<'db>,
26893}
26894impl<'db> Token<'db> for TokenWhile<'db> {
26895 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26896 TokenWhileGreen(
26897 GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
26898 .intern(db),
26899 )
26900 }
26901 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26902 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26903 }
26904}
26905#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26906pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
26907impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
26908 type SyntaxNode = TokenWhile<'db>;
26909 fn untyped(self) -> SyntaxStablePtrId<'db> {
26910 self.0
26911 }
26912 fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
26913 TokenWhile::from_syntax_node(db, self.0.lookup(db))
26914 }
26915}
26916impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
26917 fn from(ptr: TokenWhilePtr<'db>) -> Self {
26918 ptr.untyped()
26919 }
26920}
26921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26922pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
26923impl<'db> TokenWhileGreen<'db> {
26924 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26925 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26926 }
26927}
26928impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
26929 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
26930 type StablePtr = TokenWhilePtr<'db>;
26931 type Green = TokenWhileGreen<'db>;
26932 fn missing(db: &'db dyn Database) -> Self::Green {
26933 TokenWhileGreen(
26934 GreenNode {
26935 kind: SyntaxKind::TokenMissing,
26936 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26937 }
26938 .intern(db),
26939 )
26940 }
26941 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26942 match node.green_node(db).details {
26943 GreenNodeDetails::Token(_) => Self { node },
26944 GreenNodeDetails::Node { .. } => {
26945 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
26946 }
26947 }
26948 }
26949 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26950 match node.green_node(db).details {
26951 GreenNodeDetails::Token(_) => Some(Self { node }),
26952 GreenNodeDetails::Node { .. } => None,
26953 }
26954 }
26955 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26956 self.node
26957 }
26958 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26959 TokenWhilePtr(self.node.stable_ptr(db))
26960 }
26961}
26962#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26963pub struct TerminalWhile<'db> {
26964 node: SyntaxNode<'db>,
26965}
26966impl<'db> Terminal<'db> for TerminalWhile<'db> {
26967 const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
26968 type TokenType = TokenWhile<'db>;
26969 fn new_green(
26970 db: &'db dyn Database,
26971 leading_trivia: TriviaGreen<'db>,
26972 token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26973 trailing_trivia: TriviaGreen<'db>,
26974 ) -> Self::Green {
26975 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26976 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26977 TerminalWhileGreen(
26978 GreenNode {
26979 kind: SyntaxKind::TerminalWhile,
26980 details: GreenNodeDetails::Node { children: children.into(), width },
26981 }
26982 .intern(db),
26983 )
26984 }
26985 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26986 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26987 unreachable!("Expected a node, not a token");
26988 };
26989 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26990 }
26991}
26992impl<'db> TerminalWhile<'db> {
26993 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26994 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26995 }
26996 pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
26997 TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
26998 }
26999 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27000 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27001 }
27002}
27003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27004pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27005impl<'db> TerminalWhilePtr<'db> {}
27006impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27007 type SyntaxNode = TerminalWhile<'db>;
27008 fn untyped(self) -> SyntaxStablePtrId<'db> {
27009 self.0
27010 }
27011 fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27012 TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27013 }
27014}
27015impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27016 fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27017 ptr.untyped()
27018 }
27019}
27020#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27021pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27022impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27023 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27024 type StablePtr = TerminalWhilePtr<'db>;
27025 type Green = TerminalWhileGreen<'db>;
27026 fn missing(db: &'db dyn Database) -> Self::Green {
27027 TerminalWhileGreen(
27028 GreenNode {
27029 kind: SyntaxKind::TerminalWhile,
27030 details: GreenNodeDetails::Node {
27031 children: [
27032 Trivia::missing(db).0,
27033 TokenWhile::missing(db).0,
27034 Trivia::missing(db).0,
27035 ]
27036 .into(),
27037 width: TextWidth::default(),
27038 },
27039 }
27040 .intern(db),
27041 )
27042 }
27043 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27044 let kind = node.kind(db);
27045 assert_eq!(
27046 kind,
27047 SyntaxKind::TerminalWhile,
27048 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27049 kind,
27050 SyntaxKind::TerminalWhile
27051 );
27052 Self { node }
27053 }
27054 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27055 let kind = node.kind(db);
27056 if kind == SyntaxKind::TerminalWhile {
27057 Some(Self::from_syntax_node(db, node))
27058 } else {
27059 None
27060 }
27061 }
27062 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27063 self.node
27064 }
27065 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27066 TerminalWhilePtr(self.node.stable_ptr(db))
27067 }
27068}
27069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27070pub struct TokenFor<'db> {
27071 node: SyntaxNode<'db>,
27072}
27073impl<'db> Token<'db> for TokenFor<'db> {
27074 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27075 TokenForGreen(
27076 GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27077 .intern(db),
27078 )
27079 }
27080 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27081 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27082 }
27083}
27084#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27085pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27086impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27087 type SyntaxNode = TokenFor<'db>;
27088 fn untyped(self) -> SyntaxStablePtrId<'db> {
27089 self.0
27090 }
27091 fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27092 TokenFor::from_syntax_node(db, self.0.lookup(db))
27093 }
27094}
27095impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27096 fn from(ptr: TokenForPtr<'db>) -> Self {
27097 ptr.untyped()
27098 }
27099}
27100#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27101pub struct TokenForGreen<'db>(pub GreenId<'db>);
27102impl<'db> TokenForGreen<'db> {
27103 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27104 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27105 }
27106}
27107impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27108 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27109 type StablePtr = TokenForPtr<'db>;
27110 type Green = TokenForGreen<'db>;
27111 fn missing(db: &'db dyn Database) -> Self::Green {
27112 TokenForGreen(
27113 GreenNode {
27114 kind: SyntaxKind::TokenMissing,
27115 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27116 }
27117 .intern(db),
27118 )
27119 }
27120 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27121 match node.green_node(db).details {
27122 GreenNodeDetails::Token(_) => Self { node },
27123 GreenNodeDetails::Node { .. } => {
27124 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27125 }
27126 }
27127 }
27128 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27129 match node.green_node(db).details {
27130 GreenNodeDetails::Token(_) => Some(Self { node }),
27131 GreenNodeDetails::Node { .. } => None,
27132 }
27133 }
27134 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27135 self.node
27136 }
27137 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27138 TokenForPtr(self.node.stable_ptr(db))
27139 }
27140}
27141#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27142pub struct TerminalFor<'db> {
27143 node: SyntaxNode<'db>,
27144}
27145impl<'db> Terminal<'db> for TerminalFor<'db> {
27146 const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27147 type TokenType = TokenFor<'db>;
27148 fn new_green(
27149 db: &'db dyn Database,
27150 leading_trivia: TriviaGreen<'db>,
27151 token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27152 trailing_trivia: TriviaGreen<'db>,
27153 ) -> Self::Green {
27154 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27155 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27156 TerminalForGreen(
27157 GreenNode {
27158 kind: SyntaxKind::TerminalFor,
27159 details: GreenNodeDetails::Node { children: children.into(), width },
27160 }
27161 .intern(db),
27162 )
27163 }
27164 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27165 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27166 unreachable!("Expected a node, not a token");
27167 };
27168 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27169 }
27170}
27171impl<'db> TerminalFor<'db> {
27172 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27173 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27174 }
27175 pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27176 TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27177 }
27178 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27179 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27180 }
27181}
27182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27183pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27184impl<'db> TerminalForPtr<'db> {}
27185impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27186 type SyntaxNode = TerminalFor<'db>;
27187 fn untyped(self) -> SyntaxStablePtrId<'db> {
27188 self.0
27189 }
27190 fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27191 TerminalFor::from_syntax_node(db, self.0.lookup(db))
27192 }
27193}
27194impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27195 fn from(ptr: TerminalForPtr<'db>) -> Self {
27196 ptr.untyped()
27197 }
27198}
27199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27200pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27201impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27202 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27203 type StablePtr = TerminalForPtr<'db>;
27204 type Green = TerminalForGreen<'db>;
27205 fn missing(db: &'db dyn Database) -> Self::Green {
27206 TerminalForGreen(
27207 GreenNode {
27208 kind: SyntaxKind::TerminalFor,
27209 details: GreenNodeDetails::Node {
27210 children: [
27211 Trivia::missing(db).0,
27212 TokenFor::missing(db).0,
27213 Trivia::missing(db).0,
27214 ]
27215 .into(),
27216 width: TextWidth::default(),
27217 },
27218 }
27219 .intern(db),
27220 )
27221 }
27222 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27223 let kind = node.kind(db);
27224 assert_eq!(
27225 kind,
27226 SyntaxKind::TerminalFor,
27227 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27228 kind,
27229 SyntaxKind::TerminalFor
27230 );
27231 Self { node }
27232 }
27233 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27234 let kind = node.kind(db);
27235 if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27236 }
27237 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27238 self.node
27239 }
27240 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27241 TerminalForPtr(self.node.stable_ptr(db))
27242 }
27243}
27244#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27245pub struct TokenLoop<'db> {
27246 node: SyntaxNode<'db>,
27247}
27248impl<'db> Token<'db> for TokenLoop<'db> {
27249 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27250 TokenLoopGreen(
27251 GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27252 .intern(db),
27253 )
27254 }
27255 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27256 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27257 }
27258}
27259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27260pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27261impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27262 type SyntaxNode = TokenLoop<'db>;
27263 fn untyped(self) -> SyntaxStablePtrId<'db> {
27264 self.0
27265 }
27266 fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27267 TokenLoop::from_syntax_node(db, self.0.lookup(db))
27268 }
27269}
27270impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27271 fn from(ptr: TokenLoopPtr<'db>) -> Self {
27272 ptr.untyped()
27273 }
27274}
27275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27276pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27277impl<'db> TokenLoopGreen<'db> {
27278 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27279 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27280 }
27281}
27282impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27283 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27284 type StablePtr = TokenLoopPtr<'db>;
27285 type Green = TokenLoopGreen<'db>;
27286 fn missing(db: &'db dyn Database) -> Self::Green {
27287 TokenLoopGreen(
27288 GreenNode {
27289 kind: SyntaxKind::TokenMissing,
27290 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27291 }
27292 .intern(db),
27293 )
27294 }
27295 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27296 match node.green_node(db).details {
27297 GreenNodeDetails::Token(_) => Self { node },
27298 GreenNodeDetails::Node { .. } => {
27299 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27300 }
27301 }
27302 }
27303 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27304 match node.green_node(db).details {
27305 GreenNodeDetails::Token(_) => Some(Self { node }),
27306 GreenNodeDetails::Node { .. } => None,
27307 }
27308 }
27309 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27310 self.node
27311 }
27312 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27313 TokenLoopPtr(self.node.stable_ptr(db))
27314 }
27315}
27316#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27317pub struct TerminalLoop<'db> {
27318 node: SyntaxNode<'db>,
27319}
27320impl<'db> Terminal<'db> for TerminalLoop<'db> {
27321 const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27322 type TokenType = TokenLoop<'db>;
27323 fn new_green(
27324 db: &'db dyn Database,
27325 leading_trivia: TriviaGreen<'db>,
27326 token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27327 trailing_trivia: TriviaGreen<'db>,
27328 ) -> Self::Green {
27329 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27330 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27331 TerminalLoopGreen(
27332 GreenNode {
27333 kind: SyntaxKind::TerminalLoop,
27334 details: GreenNodeDetails::Node { children: children.into(), width },
27335 }
27336 .intern(db),
27337 )
27338 }
27339 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27340 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27341 unreachable!("Expected a node, not a token");
27342 };
27343 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27344 }
27345}
27346impl<'db> TerminalLoop<'db> {
27347 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27348 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27349 }
27350 pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27351 TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27352 }
27353 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27354 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27355 }
27356}
27357#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27358pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27359impl<'db> TerminalLoopPtr<'db> {}
27360impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27361 type SyntaxNode = TerminalLoop<'db>;
27362 fn untyped(self) -> SyntaxStablePtrId<'db> {
27363 self.0
27364 }
27365 fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27366 TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27367 }
27368}
27369impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27370 fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27371 ptr.untyped()
27372 }
27373}
27374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27375pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27376impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27377 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27378 type StablePtr = TerminalLoopPtr<'db>;
27379 type Green = TerminalLoopGreen<'db>;
27380 fn missing(db: &'db dyn Database) -> Self::Green {
27381 TerminalLoopGreen(
27382 GreenNode {
27383 kind: SyntaxKind::TerminalLoop,
27384 details: GreenNodeDetails::Node {
27385 children: [
27386 Trivia::missing(db).0,
27387 TokenLoop::missing(db).0,
27388 Trivia::missing(db).0,
27389 ]
27390 .into(),
27391 width: TextWidth::default(),
27392 },
27393 }
27394 .intern(db),
27395 )
27396 }
27397 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27398 let kind = node.kind(db);
27399 assert_eq!(
27400 kind,
27401 SyntaxKind::TerminalLoop,
27402 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27403 kind,
27404 SyntaxKind::TerminalLoop
27405 );
27406 Self { node }
27407 }
27408 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27409 let kind = node.kind(db);
27410 if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27411 }
27412 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27413 self.node
27414 }
27415 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27416 TerminalLoopPtr(self.node.stable_ptr(db))
27417 }
27418}
27419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27420pub struct TokenImpl<'db> {
27421 node: SyntaxNode<'db>,
27422}
27423impl<'db> Token<'db> for TokenImpl<'db> {
27424 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27425 TokenImplGreen(
27426 GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27427 .intern(db),
27428 )
27429 }
27430 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27431 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27432 }
27433}
27434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27435pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27436impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27437 type SyntaxNode = TokenImpl<'db>;
27438 fn untyped(self) -> SyntaxStablePtrId<'db> {
27439 self.0
27440 }
27441 fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27442 TokenImpl::from_syntax_node(db, self.0.lookup(db))
27443 }
27444}
27445impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27446 fn from(ptr: TokenImplPtr<'db>) -> Self {
27447 ptr.untyped()
27448 }
27449}
27450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27451pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27452impl<'db> TokenImplGreen<'db> {
27453 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27454 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27455 }
27456}
27457impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27458 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27459 type StablePtr = TokenImplPtr<'db>;
27460 type Green = TokenImplGreen<'db>;
27461 fn missing(db: &'db dyn Database) -> Self::Green {
27462 TokenImplGreen(
27463 GreenNode {
27464 kind: SyntaxKind::TokenMissing,
27465 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27466 }
27467 .intern(db),
27468 )
27469 }
27470 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27471 match node.green_node(db).details {
27472 GreenNodeDetails::Token(_) => Self { node },
27473 GreenNodeDetails::Node { .. } => {
27474 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27475 }
27476 }
27477 }
27478 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27479 match node.green_node(db).details {
27480 GreenNodeDetails::Token(_) => Some(Self { node }),
27481 GreenNodeDetails::Node { .. } => None,
27482 }
27483 }
27484 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27485 self.node
27486 }
27487 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27488 TokenImplPtr(self.node.stable_ptr(db))
27489 }
27490}
27491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27492pub struct TerminalImpl<'db> {
27493 node: SyntaxNode<'db>,
27494}
27495impl<'db> Terminal<'db> for TerminalImpl<'db> {
27496 const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27497 type TokenType = TokenImpl<'db>;
27498 fn new_green(
27499 db: &'db dyn Database,
27500 leading_trivia: TriviaGreen<'db>,
27501 token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27502 trailing_trivia: TriviaGreen<'db>,
27503 ) -> Self::Green {
27504 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27505 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27506 TerminalImplGreen(
27507 GreenNode {
27508 kind: SyntaxKind::TerminalImpl,
27509 details: GreenNodeDetails::Node { children: children.into(), width },
27510 }
27511 .intern(db),
27512 )
27513 }
27514 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27515 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27516 unreachable!("Expected a node, not a token");
27517 };
27518 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27519 }
27520}
27521impl<'db> TerminalImpl<'db> {
27522 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27523 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27524 }
27525 pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27526 TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27527 }
27528 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27529 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27530 }
27531}
27532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27533pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27534impl<'db> TerminalImplPtr<'db> {}
27535impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27536 type SyntaxNode = TerminalImpl<'db>;
27537 fn untyped(self) -> SyntaxStablePtrId<'db> {
27538 self.0
27539 }
27540 fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27541 TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27542 }
27543}
27544impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27545 fn from(ptr: TerminalImplPtr<'db>) -> Self {
27546 ptr.untyped()
27547 }
27548}
27549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27550pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27551impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27552 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27553 type StablePtr = TerminalImplPtr<'db>;
27554 type Green = TerminalImplGreen<'db>;
27555 fn missing(db: &'db dyn Database) -> Self::Green {
27556 TerminalImplGreen(
27557 GreenNode {
27558 kind: SyntaxKind::TerminalImpl,
27559 details: GreenNodeDetails::Node {
27560 children: [
27561 Trivia::missing(db).0,
27562 TokenImpl::missing(db).0,
27563 Trivia::missing(db).0,
27564 ]
27565 .into(),
27566 width: TextWidth::default(),
27567 },
27568 }
27569 .intern(db),
27570 )
27571 }
27572 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27573 let kind = node.kind(db);
27574 assert_eq!(
27575 kind,
27576 SyntaxKind::TerminalImpl,
27577 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27578 kind,
27579 SyntaxKind::TerminalImpl
27580 );
27581 Self { node }
27582 }
27583 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27584 let kind = node.kind(db);
27585 if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27586 }
27587 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27588 self.node
27589 }
27590 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27591 TerminalImplPtr(self.node.stable_ptr(db))
27592 }
27593}
27594#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27595pub struct TokenImplicits<'db> {
27596 node: SyntaxNode<'db>,
27597}
27598impl<'db> Token<'db> for TokenImplicits<'db> {
27599 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27600 TokenImplicitsGreen(
27601 GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
27602 .intern(db),
27603 )
27604 }
27605 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27606 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27607 }
27608}
27609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27610pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27611impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
27612 type SyntaxNode = TokenImplicits<'db>;
27613 fn untyped(self) -> SyntaxStablePtrId<'db> {
27614 self.0
27615 }
27616 fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27617 TokenImplicits::from_syntax_node(db, self.0.lookup(db))
27618 }
27619}
27620impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27621 fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
27622 ptr.untyped()
27623 }
27624}
27625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27626pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
27627impl<'db> TokenImplicitsGreen<'db> {
27628 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27629 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27630 }
27631}
27632impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
27633 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
27634 type StablePtr = TokenImplicitsPtr<'db>;
27635 type Green = TokenImplicitsGreen<'db>;
27636 fn missing(db: &'db dyn Database) -> Self::Green {
27637 TokenImplicitsGreen(
27638 GreenNode {
27639 kind: SyntaxKind::TokenMissing,
27640 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27641 }
27642 .intern(db),
27643 )
27644 }
27645 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27646 match node.green_node(db).details {
27647 GreenNodeDetails::Token(_) => Self { node },
27648 GreenNodeDetails::Node { .. } => {
27649 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
27650 }
27651 }
27652 }
27653 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27654 match node.green_node(db).details {
27655 GreenNodeDetails::Token(_) => Some(Self { node }),
27656 GreenNodeDetails::Node { .. } => None,
27657 }
27658 }
27659 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27660 self.node
27661 }
27662 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27663 TokenImplicitsPtr(self.node.stable_ptr(db))
27664 }
27665}
27666#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27667pub struct TerminalImplicits<'db> {
27668 node: SyntaxNode<'db>,
27669}
27670impl<'db> Terminal<'db> for TerminalImplicits<'db> {
27671 const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
27672 type TokenType = TokenImplicits<'db>;
27673 fn new_green(
27674 db: &'db dyn Database,
27675 leading_trivia: TriviaGreen<'db>,
27676 token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27677 trailing_trivia: TriviaGreen<'db>,
27678 ) -> Self::Green {
27679 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27680 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27681 TerminalImplicitsGreen(
27682 GreenNode {
27683 kind: SyntaxKind::TerminalImplicits,
27684 details: GreenNodeDetails::Node { children: children.into(), width },
27685 }
27686 .intern(db),
27687 )
27688 }
27689 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27690 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27691 unreachable!("Expected a node, not a token");
27692 };
27693 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27694 }
27695}
27696impl<'db> TerminalImplicits<'db> {
27697 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27698 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27699 }
27700 pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27701 TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
27702 }
27703 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27704 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27705 }
27706}
27707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27708pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27709impl<'db> TerminalImplicitsPtr<'db> {}
27710impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
27711 type SyntaxNode = TerminalImplicits<'db>;
27712 fn untyped(self) -> SyntaxStablePtrId<'db> {
27713 self.0
27714 }
27715 fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
27716 TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
27717 }
27718}
27719impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27720 fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
27721 ptr.untyped()
27722 }
27723}
27724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27725pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
27726impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
27727 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
27728 type StablePtr = TerminalImplicitsPtr<'db>;
27729 type Green = TerminalImplicitsGreen<'db>;
27730 fn missing(db: &'db dyn Database) -> Self::Green {
27731 TerminalImplicitsGreen(
27732 GreenNode {
27733 kind: SyntaxKind::TerminalImplicits,
27734 details: GreenNodeDetails::Node {
27735 children: [
27736 Trivia::missing(db).0,
27737 TokenImplicits::missing(db).0,
27738 Trivia::missing(db).0,
27739 ]
27740 .into(),
27741 width: TextWidth::default(),
27742 },
27743 }
27744 .intern(db),
27745 )
27746 }
27747 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27748 let kind = node.kind(db);
27749 assert_eq!(
27750 kind,
27751 SyntaxKind::TerminalImplicits,
27752 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27753 kind,
27754 SyntaxKind::TerminalImplicits
27755 );
27756 Self { node }
27757 }
27758 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27759 let kind = node.kind(db);
27760 if kind == SyntaxKind::TerminalImplicits {
27761 Some(Self::from_syntax_node(db, node))
27762 } else {
27763 None
27764 }
27765 }
27766 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27767 self.node
27768 }
27769 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27770 TerminalImplicitsPtr(self.node.stable_ptr(db))
27771 }
27772}
27773#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27774pub struct TokenLet<'db> {
27775 node: SyntaxNode<'db>,
27776}
27777impl<'db> Token<'db> for TokenLet<'db> {
27778 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27779 TokenLetGreen(
27780 GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
27781 .intern(db),
27782 )
27783 }
27784 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27785 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27786 }
27787}
27788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27789pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
27790impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
27791 type SyntaxNode = TokenLet<'db>;
27792 fn untyped(self) -> SyntaxStablePtrId<'db> {
27793 self.0
27794 }
27795 fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
27796 TokenLet::from_syntax_node(db, self.0.lookup(db))
27797 }
27798}
27799impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
27800 fn from(ptr: TokenLetPtr<'db>) -> Self {
27801 ptr.untyped()
27802 }
27803}
27804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27805pub struct TokenLetGreen<'db>(pub GreenId<'db>);
27806impl<'db> TokenLetGreen<'db> {
27807 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27808 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27809 }
27810}
27811impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
27812 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
27813 type StablePtr = TokenLetPtr<'db>;
27814 type Green = TokenLetGreen<'db>;
27815 fn missing(db: &'db dyn Database) -> Self::Green {
27816 TokenLetGreen(
27817 GreenNode {
27818 kind: SyntaxKind::TokenMissing,
27819 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27820 }
27821 .intern(db),
27822 )
27823 }
27824 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27825 match node.green_node(db).details {
27826 GreenNodeDetails::Token(_) => Self { node },
27827 GreenNodeDetails::Node { .. } => {
27828 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
27829 }
27830 }
27831 }
27832 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27833 match node.green_node(db).details {
27834 GreenNodeDetails::Token(_) => Some(Self { node }),
27835 GreenNodeDetails::Node { .. } => None,
27836 }
27837 }
27838 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27839 self.node
27840 }
27841 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27842 TokenLetPtr(self.node.stable_ptr(db))
27843 }
27844}
27845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27846pub struct TerminalLet<'db> {
27847 node: SyntaxNode<'db>,
27848}
27849impl<'db> Terminal<'db> for TerminalLet<'db> {
27850 const KIND: SyntaxKind = SyntaxKind::TerminalLet;
27851 type TokenType = TokenLet<'db>;
27852 fn new_green(
27853 db: &'db dyn Database,
27854 leading_trivia: TriviaGreen<'db>,
27855 token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27856 trailing_trivia: TriviaGreen<'db>,
27857 ) -> Self::Green {
27858 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27859 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27860 TerminalLetGreen(
27861 GreenNode {
27862 kind: SyntaxKind::TerminalLet,
27863 details: GreenNodeDetails::Node { children: children.into(), width },
27864 }
27865 .intern(db),
27866 )
27867 }
27868 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27869 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27870 unreachable!("Expected a node, not a token");
27871 };
27872 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27873 }
27874}
27875impl<'db> TerminalLet<'db> {
27876 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27877 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27878 }
27879 pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
27880 TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
27881 }
27882 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27883 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27884 }
27885}
27886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27887pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
27888impl<'db> TerminalLetPtr<'db> {}
27889impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
27890 type SyntaxNode = TerminalLet<'db>;
27891 fn untyped(self) -> SyntaxStablePtrId<'db> {
27892 self.0
27893 }
27894 fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
27895 TerminalLet::from_syntax_node(db, self.0.lookup(db))
27896 }
27897}
27898impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
27899 fn from(ptr: TerminalLetPtr<'db>) -> Self {
27900 ptr.untyped()
27901 }
27902}
27903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27904pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
27905impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
27906 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
27907 type StablePtr = TerminalLetPtr<'db>;
27908 type Green = TerminalLetGreen<'db>;
27909 fn missing(db: &'db dyn Database) -> Self::Green {
27910 TerminalLetGreen(
27911 GreenNode {
27912 kind: SyntaxKind::TerminalLet,
27913 details: GreenNodeDetails::Node {
27914 children: [
27915 Trivia::missing(db).0,
27916 TokenLet::missing(db).0,
27917 Trivia::missing(db).0,
27918 ]
27919 .into(),
27920 width: TextWidth::default(),
27921 },
27922 }
27923 .intern(db),
27924 )
27925 }
27926 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27927 let kind = node.kind(db);
27928 assert_eq!(
27929 kind,
27930 SyntaxKind::TerminalLet,
27931 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27932 kind,
27933 SyntaxKind::TerminalLet
27934 );
27935 Self { node }
27936 }
27937 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27938 let kind = node.kind(db);
27939 if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
27940 }
27941 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27942 self.node
27943 }
27944 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27945 TerminalLetPtr(self.node.stable_ptr(db))
27946 }
27947}
27948#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27949pub struct TokenMacro<'db> {
27950 node: SyntaxNode<'db>,
27951}
27952impl<'db> Token<'db> for TokenMacro<'db> {
27953 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27954 TokenMacroGreen(
27955 GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
27956 .intern(db),
27957 )
27958 }
27959 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27960 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27961 }
27962}
27963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27964pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
27965impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
27966 type SyntaxNode = TokenMacro<'db>;
27967 fn untyped(self) -> SyntaxStablePtrId<'db> {
27968 self.0
27969 }
27970 fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
27971 TokenMacro::from_syntax_node(db, self.0.lookup(db))
27972 }
27973}
27974impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
27975 fn from(ptr: TokenMacroPtr<'db>) -> Self {
27976 ptr.untyped()
27977 }
27978}
27979#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27980pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
27981impl<'db> TokenMacroGreen<'db> {
27982 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27983 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27984 }
27985}
27986impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
27987 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
27988 type StablePtr = TokenMacroPtr<'db>;
27989 type Green = TokenMacroGreen<'db>;
27990 fn missing(db: &'db dyn Database) -> Self::Green {
27991 TokenMacroGreen(
27992 GreenNode {
27993 kind: SyntaxKind::TokenMissing,
27994 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27995 }
27996 .intern(db),
27997 )
27998 }
27999 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28000 match node.green_node(db).details {
28001 GreenNodeDetails::Token(_) => Self { node },
28002 GreenNodeDetails::Node { .. } => {
28003 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28004 }
28005 }
28006 }
28007 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28008 match node.green_node(db).details {
28009 GreenNodeDetails::Token(_) => Some(Self { node }),
28010 GreenNodeDetails::Node { .. } => None,
28011 }
28012 }
28013 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28014 self.node
28015 }
28016 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28017 TokenMacroPtr(self.node.stable_ptr(db))
28018 }
28019}
28020#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28021pub struct TerminalMacro<'db> {
28022 node: SyntaxNode<'db>,
28023}
28024impl<'db> Terminal<'db> for TerminalMacro<'db> {
28025 const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28026 type TokenType = TokenMacro<'db>;
28027 fn new_green(
28028 db: &'db dyn Database,
28029 leading_trivia: TriviaGreen<'db>,
28030 token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28031 trailing_trivia: TriviaGreen<'db>,
28032 ) -> Self::Green {
28033 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28034 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28035 TerminalMacroGreen(
28036 GreenNode {
28037 kind: SyntaxKind::TerminalMacro,
28038 details: GreenNodeDetails::Node { children: children.into(), width },
28039 }
28040 .intern(db),
28041 )
28042 }
28043 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28044 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28045 unreachable!("Expected a node, not a token");
28046 };
28047 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28048 }
28049}
28050impl<'db> TerminalMacro<'db> {
28051 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28052 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28053 }
28054 pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28055 TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28056 }
28057 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28058 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28059 }
28060}
28061#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28062pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28063impl<'db> TerminalMacroPtr<'db> {}
28064impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28065 type SyntaxNode = TerminalMacro<'db>;
28066 fn untyped(self) -> SyntaxStablePtrId<'db> {
28067 self.0
28068 }
28069 fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28070 TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28071 }
28072}
28073impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28074 fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28075 ptr.untyped()
28076 }
28077}
28078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28079pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28080impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28081 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28082 type StablePtr = TerminalMacroPtr<'db>;
28083 type Green = TerminalMacroGreen<'db>;
28084 fn missing(db: &'db dyn Database) -> Self::Green {
28085 TerminalMacroGreen(
28086 GreenNode {
28087 kind: SyntaxKind::TerminalMacro,
28088 details: GreenNodeDetails::Node {
28089 children: [
28090 Trivia::missing(db).0,
28091 TokenMacro::missing(db).0,
28092 Trivia::missing(db).0,
28093 ]
28094 .into(),
28095 width: TextWidth::default(),
28096 },
28097 }
28098 .intern(db),
28099 )
28100 }
28101 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28102 let kind = node.kind(db);
28103 assert_eq!(
28104 kind,
28105 SyntaxKind::TerminalMacro,
28106 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28107 kind,
28108 SyntaxKind::TerminalMacro
28109 );
28110 Self { node }
28111 }
28112 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28113 let kind = node.kind(db);
28114 if kind == SyntaxKind::TerminalMacro {
28115 Some(Self::from_syntax_node(db, node))
28116 } else {
28117 None
28118 }
28119 }
28120 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28121 self.node
28122 }
28123 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28124 TerminalMacroPtr(self.node.stable_ptr(db))
28125 }
28126}
28127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28128pub struct TokenMatch<'db> {
28129 node: SyntaxNode<'db>,
28130}
28131impl<'db> Token<'db> for TokenMatch<'db> {
28132 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28133 TokenMatchGreen(
28134 GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28135 .intern(db),
28136 )
28137 }
28138 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28139 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28140 }
28141}
28142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28143pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28144impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28145 type SyntaxNode = TokenMatch<'db>;
28146 fn untyped(self) -> SyntaxStablePtrId<'db> {
28147 self.0
28148 }
28149 fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28150 TokenMatch::from_syntax_node(db, self.0.lookup(db))
28151 }
28152}
28153impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28154 fn from(ptr: TokenMatchPtr<'db>) -> Self {
28155 ptr.untyped()
28156 }
28157}
28158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28159pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28160impl<'db> TokenMatchGreen<'db> {
28161 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28162 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28163 }
28164}
28165impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28166 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28167 type StablePtr = TokenMatchPtr<'db>;
28168 type Green = TokenMatchGreen<'db>;
28169 fn missing(db: &'db dyn Database) -> Self::Green {
28170 TokenMatchGreen(
28171 GreenNode {
28172 kind: SyntaxKind::TokenMissing,
28173 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28174 }
28175 .intern(db),
28176 )
28177 }
28178 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28179 match node.green_node(db).details {
28180 GreenNodeDetails::Token(_) => Self { node },
28181 GreenNodeDetails::Node { .. } => {
28182 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28183 }
28184 }
28185 }
28186 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28187 match node.green_node(db).details {
28188 GreenNodeDetails::Token(_) => Some(Self { node }),
28189 GreenNodeDetails::Node { .. } => None,
28190 }
28191 }
28192 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28193 self.node
28194 }
28195 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28196 TokenMatchPtr(self.node.stable_ptr(db))
28197 }
28198}
28199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28200pub struct TerminalMatch<'db> {
28201 node: SyntaxNode<'db>,
28202}
28203impl<'db> Terminal<'db> for TerminalMatch<'db> {
28204 const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28205 type TokenType = TokenMatch<'db>;
28206 fn new_green(
28207 db: &'db dyn Database,
28208 leading_trivia: TriviaGreen<'db>,
28209 token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28210 trailing_trivia: TriviaGreen<'db>,
28211 ) -> Self::Green {
28212 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28213 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28214 TerminalMatchGreen(
28215 GreenNode {
28216 kind: SyntaxKind::TerminalMatch,
28217 details: GreenNodeDetails::Node { children: children.into(), width },
28218 }
28219 .intern(db),
28220 )
28221 }
28222 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28223 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28224 unreachable!("Expected a node, not a token");
28225 };
28226 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28227 }
28228}
28229impl<'db> TerminalMatch<'db> {
28230 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28231 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28232 }
28233 pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28234 TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28235 }
28236 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28237 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28238 }
28239}
28240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28241pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28242impl<'db> TerminalMatchPtr<'db> {}
28243impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28244 type SyntaxNode = TerminalMatch<'db>;
28245 fn untyped(self) -> SyntaxStablePtrId<'db> {
28246 self.0
28247 }
28248 fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28249 TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28250 }
28251}
28252impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28253 fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28254 ptr.untyped()
28255 }
28256}
28257#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28258pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28259impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28260 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28261 type StablePtr = TerminalMatchPtr<'db>;
28262 type Green = TerminalMatchGreen<'db>;
28263 fn missing(db: &'db dyn Database) -> Self::Green {
28264 TerminalMatchGreen(
28265 GreenNode {
28266 kind: SyntaxKind::TerminalMatch,
28267 details: GreenNodeDetails::Node {
28268 children: [
28269 Trivia::missing(db).0,
28270 TokenMatch::missing(db).0,
28271 Trivia::missing(db).0,
28272 ]
28273 .into(),
28274 width: TextWidth::default(),
28275 },
28276 }
28277 .intern(db),
28278 )
28279 }
28280 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28281 let kind = node.kind(db);
28282 assert_eq!(
28283 kind,
28284 SyntaxKind::TerminalMatch,
28285 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28286 kind,
28287 SyntaxKind::TerminalMatch
28288 );
28289 Self { node }
28290 }
28291 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28292 let kind = node.kind(db);
28293 if kind == SyntaxKind::TerminalMatch {
28294 Some(Self::from_syntax_node(db, node))
28295 } else {
28296 None
28297 }
28298 }
28299 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28300 self.node
28301 }
28302 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28303 TerminalMatchPtr(self.node.stable_ptr(db))
28304 }
28305}
28306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28307pub struct TokenModule<'db> {
28308 node: SyntaxNode<'db>,
28309}
28310impl<'db> Token<'db> for TokenModule<'db> {
28311 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28312 TokenModuleGreen(
28313 GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28314 .intern(db),
28315 )
28316 }
28317 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28318 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28319 }
28320}
28321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28322pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28323impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28324 type SyntaxNode = TokenModule<'db>;
28325 fn untyped(self) -> SyntaxStablePtrId<'db> {
28326 self.0
28327 }
28328 fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28329 TokenModule::from_syntax_node(db, self.0.lookup(db))
28330 }
28331}
28332impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28333 fn from(ptr: TokenModulePtr<'db>) -> Self {
28334 ptr.untyped()
28335 }
28336}
28337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28338pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28339impl<'db> TokenModuleGreen<'db> {
28340 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28341 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28342 }
28343}
28344impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28345 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28346 type StablePtr = TokenModulePtr<'db>;
28347 type Green = TokenModuleGreen<'db>;
28348 fn missing(db: &'db dyn Database) -> Self::Green {
28349 TokenModuleGreen(
28350 GreenNode {
28351 kind: SyntaxKind::TokenMissing,
28352 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28353 }
28354 .intern(db),
28355 )
28356 }
28357 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28358 match node.green_node(db).details {
28359 GreenNodeDetails::Token(_) => Self { node },
28360 GreenNodeDetails::Node { .. } => {
28361 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28362 }
28363 }
28364 }
28365 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28366 match node.green_node(db).details {
28367 GreenNodeDetails::Token(_) => Some(Self { node }),
28368 GreenNodeDetails::Node { .. } => None,
28369 }
28370 }
28371 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28372 self.node
28373 }
28374 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28375 TokenModulePtr(self.node.stable_ptr(db))
28376 }
28377}
28378#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28379pub struct TerminalModule<'db> {
28380 node: SyntaxNode<'db>,
28381}
28382impl<'db> Terminal<'db> for TerminalModule<'db> {
28383 const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28384 type TokenType = TokenModule<'db>;
28385 fn new_green(
28386 db: &'db dyn Database,
28387 leading_trivia: TriviaGreen<'db>,
28388 token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28389 trailing_trivia: TriviaGreen<'db>,
28390 ) -> Self::Green {
28391 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28392 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28393 TerminalModuleGreen(
28394 GreenNode {
28395 kind: SyntaxKind::TerminalModule,
28396 details: GreenNodeDetails::Node { children: children.into(), width },
28397 }
28398 .intern(db),
28399 )
28400 }
28401 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28402 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28403 unreachable!("Expected a node, not a token");
28404 };
28405 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28406 }
28407}
28408impl<'db> TerminalModule<'db> {
28409 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28410 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28411 }
28412 pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28413 TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28414 }
28415 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28416 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28417 }
28418}
28419#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28420pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28421impl<'db> TerminalModulePtr<'db> {}
28422impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28423 type SyntaxNode = TerminalModule<'db>;
28424 fn untyped(self) -> SyntaxStablePtrId<'db> {
28425 self.0
28426 }
28427 fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28428 TerminalModule::from_syntax_node(db, self.0.lookup(db))
28429 }
28430}
28431impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28432 fn from(ptr: TerminalModulePtr<'db>) -> Self {
28433 ptr.untyped()
28434 }
28435}
28436#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28437pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28438impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28439 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28440 type StablePtr = TerminalModulePtr<'db>;
28441 type Green = TerminalModuleGreen<'db>;
28442 fn missing(db: &'db dyn Database) -> Self::Green {
28443 TerminalModuleGreen(
28444 GreenNode {
28445 kind: SyntaxKind::TerminalModule,
28446 details: GreenNodeDetails::Node {
28447 children: [
28448 Trivia::missing(db).0,
28449 TokenModule::missing(db).0,
28450 Trivia::missing(db).0,
28451 ]
28452 .into(),
28453 width: TextWidth::default(),
28454 },
28455 }
28456 .intern(db),
28457 )
28458 }
28459 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28460 let kind = node.kind(db);
28461 assert_eq!(
28462 kind,
28463 SyntaxKind::TerminalModule,
28464 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28465 kind,
28466 SyntaxKind::TerminalModule
28467 );
28468 Self { node }
28469 }
28470 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28471 let kind = node.kind(db);
28472 if kind == SyntaxKind::TerminalModule {
28473 Some(Self::from_syntax_node(db, node))
28474 } else {
28475 None
28476 }
28477 }
28478 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28479 self.node
28480 }
28481 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28482 TerminalModulePtr(self.node.stable_ptr(db))
28483 }
28484}
28485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28486pub struct TokenMut<'db> {
28487 node: SyntaxNode<'db>,
28488}
28489impl<'db> Token<'db> for TokenMut<'db> {
28490 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28491 TokenMutGreen(
28492 GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28493 .intern(db),
28494 )
28495 }
28496 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28497 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28498 }
28499}
28500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28501pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28502impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28503 type SyntaxNode = TokenMut<'db>;
28504 fn untyped(self) -> SyntaxStablePtrId<'db> {
28505 self.0
28506 }
28507 fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28508 TokenMut::from_syntax_node(db, self.0.lookup(db))
28509 }
28510}
28511impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28512 fn from(ptr: TokenMutPtr<'db>) -> Self {
28513 ptr.untyped()
28514 }
28515}
28516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28517pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28518impl<'db> TokenMutGreen<'db> {
28519 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28520 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28521 }
28522}
28523impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28524 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28525 type StablePtr = TokenMutPtr<'db>;
28526 type Green = TokenMutGreen<'db>;
28527 fn missing(db: &'db dyn Database) -> Self::Green {
28528 TokenMutGreen(
28529 GreenNode {
28530 kind: SyntaxKind::TokenMissing,
28531 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28532 }
28533 .intern(db),
28534 )
28535 }
28536 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28537 match node.green_node(db).details {
28538 GreenNodeDetails::Token(_) => Self { node },
28539 GreenNodeDetails::Node { .. } => {
28540 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28541 }
28542 }
28543 }
28544 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28545 match node.green_node(db).details {
28546 GreenNodeDetails::Token(_) => Some(Self { node }),
28547 GreenNodeDetails::Node { .. } => None,
28548 }
28549 }
28550 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28551 self.node
28552 }
28553 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28554 TokenMutPtr(self.node.stable_ptr(db))
28555 }
28556}
28557#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28558pub struct TerminalMut<'db> {
28559 node: SyntaxNode<'db>,
28560}
28561impl<'db> Terminal<'db> for TerminalMut<'db> {
28562 const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28563 type TokenType = TokenMut<'db>;
28564 fn new_green(
28565 db: &'db dyn Database,
28566 leading_trivia: TriviaGreen<'db>,
28567 token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28568 trailing_trivia: TriviaGreen<'db>,
28569 ) -> Self::Green {
28570 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28571 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28572 TerminalMutGreen(
28573 GreenNode {
28574 kind: SyntaxKind::TerminalMut,
28575 details: GreenNodeDetails::Node { children: children.into(), width },
28576 }
28577 .intern(db),
28578 )
28579 }
28580 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28581 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28582 unreachable!("Expected a node, not a token");
28583 };
28584 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28585 }
28586}
28587impl<'db> TerminalMut<'db> {
28588 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28589 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28590 }
28591 pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
28592 TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
28593 }
28594 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28595 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28596 }
28597}
28598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28599pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28600impl<'db> TerminalMutPtr<'db> {}
28601impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
28602 type SyntaxNode = TerminalMut<'db>;
28603 fn untyped(self) -> SyntaxStablePtrId<'db> {
28604 self.0
28605 }
28606 fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
28607 TerminalMut::from_syntax_node(db, self.0.lookup(db))
28608 }
28609}
28610impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
28611 fn from(ptr: TerminalMutPtr<'db>) -> Self {
28612 ptr.untyped()
28613 }
28614}
28615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28616pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
28617impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
28618 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
28619 type StablePtr = TerminalMutPtr<'db>;
28620 type Green = TerminalMutGreen<'db>;
28621 fn missing(db: &'db dyn Database) -> Self::Green {
28622 TerminalMutGreen(
28623 GreenNode {
28624 kind: SyntaxKind::TerminalMut,
28625 details: GreenNodeDetails::Node {
28626 children: [
28627 Trivia::missing(db).0,
28628 TokenMut::missing(db).0,
28629 Trivia::missing(db).0,
28630 ]
28631 .into(),
28632 width: TextWidth::default(),
28633 },
28634 }
28635 .intern(db),
28636 )
28637 }
28638 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28639 let kind = node.kind(db);
28640 assert_eq!(
28641 kind,
28642 SyntaxKind::TerminalMut,
28643 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28644 kind,
28645 SyntaxKind::TerminalMut
28646 );
28647 Self { node }
28648 }
28649 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28650 let kind = node.kind(db);
28651 if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
28652 }
28653 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28654 self.node
28655 }
28656 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28657 TerminalMutPtr(self.node.stable_ptr(db))
28658 }
28659}
28660#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28661pub struct TokenNoPanic<'db> {
28662 node: SyntaxNode<'db>,
28663}
28664impl<'db> Token<'db> for TokenNoPanic<'db> {
28665 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28666 TokenNoPanicGreen(
28667 GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
28668 .intern(db),
28669 )
28670 }
28671 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28672 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28673 }
28674}
28675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28676pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28677impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
28678 type SyntaxNode = TokenNoPanic<'db>;
28679 fn untyped(self) -> SyntaxStablePtrId<'db> {
28680 self.0
28681 }
28682 fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28683 TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
28684 }
28685}
28686impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28687 fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
28688 ptr.untyped()
28689 }
28690}
28691#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28692pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
28693impl<'db> TokenNoPanicGreen<'db> {
28694 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28695 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28696 }
28697}
28698impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
28699 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
28700 type StablePtr = TokenNoPanicPtr<'db>;
28701 type Green = TokenNoPanicGreen<'db>;
28702 fn missing(db: &'db dyn Database) -> Self::Green {
28703 TokenNoPanicGreen(
28704 GreenNode {
28705 kind: SyntaxKind::TokenMissing,
28706 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28707 }
28708 .intern(db),
28709 )
28710 }
28711 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28712 match node.green_node(db).details {
28713 GreenNodeDetails::Token(_) => Self { node },
28714 GreenNodeDetails::Node { .. } => {
28715 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
28716 }
28717 }
28718 }
28719 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28720 match node.green_node(db).details {
28721 GreenNodeDetails::Token(_) => Some(Self { node }),
28722 GreenNodeDetails::Node { .. } => None,
28723 }
28724 }
28725 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28726 self.node
28727 }
28728 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28729 TokenNoPanicPtr(self.node.stable_ptr(db))
28730 }
28731}
28732#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28733pub struct TerminalNoPanic<'db> {
28734 node: SyntaxNode<'db>,
28735}
28736impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
28737 const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
28738 type TokenType = TokenNoPanic<'db>;
28739 fn new_green(
28740 db: &'db dyn Database,
28741 leading_trivia: TriviaGreen<'db>,
28742 token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28743 trailing_trivia: TriviaGreen<'db>,
28744 ) -> Self::Green {
28745 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28746 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28747 TerminalNoPanicGreen(
28748 GreenNode {
28749 kind: SyntaxKind::TerminalNoPanic,
28750 details: GreenNodeDetails::Node { children: children.into(), width },
28751 }
28752 .intern(db),
28753 )
28754 }
28755 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28756 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28757 unreachable!("Expected a node, not a token");
28758 };
28759 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28760 }
28761}
28762impl<'db> TerminalNoPanic<'db> {
28763 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28764 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28765 }
28766 pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28767 TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
28768 }
28769 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28770 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28771 }
28772}
28773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28774pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28775impl<'db> TerminalNoPanicPtr<'db> {}
28776impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
28777 type SyntaxNode = TerminalNoPanic<'db>;
28778 fn untyped(self) -> SyntaxStablePtrId<'db> {
28779 self.0
28780 }
28781 fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
28782 TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
28783 }
28784}
28785impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28786 fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
28787 ptr.untyped()
28788 }
28789}
28790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28791pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
28792impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
28793 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
28794 type StablePtr = TerminalNoPanicPtr<'db>;
28795 type Green = TerminalNoPanicGreen<'db>;
28796 fn missing(db: &'db dyn Database) -> Self::Green {
28797 TerminalNoPanicGreen(
28798 GreenNode {
28799 kind: SyntaxKind::TerminalNoPanic,
28800 details: GreenNodeDetails::Node {
28801 children: [
28802 Trivia::missing(db).0,
28803 TokenNoPanic::missing(db).0,
28804 Trivia::missing(db).0,
28805 ]
28806 .into(),
28807 width: TextWidth::default(),
28808 },
28809 }
28810 .intern(db),
28811 )
28812 }
28813 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28814 let kind = node.kind(db);
28815 assert_eq!(
28816 kind,
28817 SyntaxKind::TerminalNoPanic,
28818 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28819 kind,
28820 SyntaxKind::TerminalNoPanic
28821 );
28822 Self { node }
28823 }
28824 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28825 let kind = node.kind(db);
28826 if kind == SyntaxKind::TerminalNoPanic {
28827 Some(Self::from_syntax_node(db, node))
28828 } else {
28829 None
28830 }
28831 }
28832 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28833 self.node
28834 }
28835 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28836 TerminalNoPanicPtr(self.node.stable_ptr(db))
28837 }
28838}
28839#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28840pub struct TokenOf<'db> {
28841 node: SyntaxNode<'db>,
28842}
28843impl<'db> Token<'db> for TokenOf<'db> {
28844 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28845 TokenOfGreen(
28846 GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
28847 .intern(db),
28848 )
28849 }
28850 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28851 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28852 }
28853}
28854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28855pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
28856impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
28857 type SyntaxNode = TokenOf<'db>;
28858 fn untyped(self) -> SyntaxStablePtrId<'db> {
28859 self.0
28860 }
28861 fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
28862 TokenOf::from_syntax_node(db, self.0.lookup(db))
28863 }
28864}
28865impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
28866 fn from(ptr: TokenOfPtr<'db>) -> Self {
28867 ptr.untyped()
28868 }
28869}
28870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28871pub struct TokenOfGreen<'db>(pub GreenId<'db>);
28872impl<'db> TokenOfGreen<'db> {
28873 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28874 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28875 }
28876}
28877impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
28878 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
28879 type StablePtr = TokenOfPtr<'db>;
28880 type Green = TokenOfGreen<'db>;
28881 fn missing(db: &'db dyn Database) -> Self::Green {
28882 TokenOfGreen(
28883 GreenNode {
28884 kind: SyntaxKind::TokenMissing,
28885 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28886 }
28887 .intern(db),
28888 )
28889 }
28890 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28891 match node.green_node(db).details {
28892 GreenNodeDetails::Token(_) => Self { node },
28893 GreenNodeDetails::Node { .. } => {
28894 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
28895 }
28896 }
28897 }
28898 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28899 match node.green_node(db).details {
28900 GreenNodeDetails::Token(_) => Some(Self { node }),
28901 GreenNodeDetails::Node { .. } => None,
28902 }
28903 }
28904 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28905 self.node
28906 }
28907 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28908 TokenOfPtr(self.node.stable_ptr(db))
28909 }
28910}
28911#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28912pub struct TerminalOf<'db> {
28913 node: SyntaxNode<'db>,
28914}
28915impl<'db> Terminal<'db> for TerminalOf<'db> {
28916 const KIND: SyntaxKind = SyntaxKind::TerminalOf;
28917 type TokenType = TokenOf<'db>;
28918 fn new_green(
28919 db: &'db dyn Database,
28920 leading_trivia: TriviaGreen<'db>,
28921 token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28922 trailing_trivia: TriviaGreen<'db>,
28923 ) -> Self::Green {
28924 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28925 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28926 TerminalOfGreen(
28927 GreenNode {
28928 kind: SyntaxKind::TerminalOf,
28929 details: GreenNodeDetails::Node { children: children.into(), width },
28930 }
28931 .intern(db),
28932 )
28933 }
28934 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28935 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28936 unreachable!("Expected a node, not a token");
28937 };
28938 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28939 }
28940}
28941impl<'db> TerminalOf<'db> {
28942 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28943 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28944 }
28945 pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
28946 TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
28947 }
28948 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28949 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28950 }
28951}
28952#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28953pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
28954impl<'db> TerminalOfPtr<'db> {}
28955impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
28956 type SyntaxNode = TerminalOf<'db>;
28957 fn untyped(self) -> SyntaxStablePtrId<'db> {
28958 self.0
28959 }
28960 fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
28961 TerminalOf::from_syntax_node(db, self.0.lookup(db))
28962 }
28963}
28964impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
28965 fn from(ptr: TerminalOfPtr<'db>) -> Self {
28966 ptr.untyped()
28967 }
28968}
28969#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28970pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
28971impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
28972 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
28973 type StablePtr = TerminalOfPtr<'db>;
28974 type Green = TerminalOfGreen<'db>;
28975 fn missing(db: &'db dyn Database) -> Self::Green {
28976 TerminalOfGreen(
28977 GreenNode {
28978 kind: SyntaxKind::TerminalOf,
28979 details: GreenNodeDetails::Node {
28980 children: [
28981 Trivia::missing(db).0,
28982 TokenOf::missing(db).0,
28983 Trivia::missing(db).0,
28984 ]
28985 .into(),
28986 width: TextWidth::default(),
28987 },
28988 }
28989 .intern(db),
28990 )
28991 }
28992 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28993 let kind = node.kind(db);
28994 assert_eq!(
28995 kind,
28996 SyntaxKind::TerminalOf,
28997 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28998 kind,
28999 SyntaxKind::TerminalOf
29000 );
29001 Self { node }
29002 }
29003 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29004 let kind = node.kind(db);
29005 if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29006 }
29007 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29008 self.node
29009 }
29010 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29011 TerminalOfPtr(self.node.stable_ptr(db))
29012 }
29013}
29014#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29015pub struct TokenRef<'db> {
29016 node: SyntaxNode<'db>,
29017}
29018impl<'db> Token<'db> for TokenRef<'db> {
29019 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29020 TokenRefGreen(
29021 GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29022 .intern(db),
29023 )
29024 }
29025 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29026 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29027 }
29028}
29029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29030pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29031impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29032 type SyntaxNode = TokenRef<'db>;
29033 fn untyped(self) -> SyntaxStablePtrId<'db> {
29034 self.0
29035 }
29036 fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29037 TokenRef::from_syntax_node(db, self.0.lookup(db))
29038 }
29039}
29040impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29041 fn from(ptr: TokenRefPtr<'db>) -> Self {
29042 ptr.untyped()
29043 }
29044}
29045#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29046pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29047impl<'db> TokenRefGreen<'db> {
29048 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29049 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29050 }
29051}
29052impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29053 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29054 type StablePtr = TokenRefPtr<'db>;
29055 type Green = TokenRefGreen<'db>;
29056 fn missing(db: &'db dyn Database) -> Self::Green {
29057 TokenRefGreen(
29058 GreenNode {
29059 kind: SyntaxKind::TokenMissing,
29060 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29061 }
29062 .intern(db),
29063 )
29064 }
29065 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29066 match node.green_node(db).details {
29067 GreenNodeDetails::Token(_) => Self { node },
29068 GreenNodeDetails::Node { .. } => {
29069 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29070 }
29071 }
29072 }
29073 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29074 match node.green_node(db).details {
29075 GreenNodeDetails::Token(_) => Some(Self { node }),
29076 GreenNodeDetails::Node { .. } => None,
29077 }
29078 }
29079 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29080 self.node
29081 }
29082 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29083 TokenRefPtr(self.node.stable_ptr(db))
29084 }
29085}
29086#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29087pub struct TerminalRef<'db> {
29088 node: SyntaxNode<'db>,
29089}
29090impl<'db> Terminal<'db> for TerminalRef<'db> {
29091 const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29092 type TokenType = TokenRef<'db>;
29093 fn new_green(
29094 db: &'db dyn Database,
29095 leading_trivia: TriviaGreen<'db>,
29096 token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29097 trailing_trivia: TriviaGreen<'db>,
29098 ) -> Self::Green {
29099 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29100 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29101 TerminalRefGreen(
29102 GreenNode {
29103 kind: SyntaxKind::TerminalRef,
29104 details: GreenNodeDetails::Node { children: children.into(), width },
29105 }
29106 .intern(db),
29107 )
29108 }
29109 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29110 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29111 unreachable!("Expected a node, not a token");
29112 };
29113 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29114 }
29115}
29116impl<'db> TerminalRef<'db> {
29117 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29118 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29119 }
29120 pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29121 TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29122 }
29123 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29124 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29125 }
29126}
29127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29128pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29129impl<'db> TerminalRefPtr<'db> {}
29130impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29131 type SyntaxNode = TerminalRef<'db>;
29132 fn untyped(self) -> SyntaxStablePtrId<'db> {
29133 self.0
29134 }
29135 fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29136 TerminalRef::from_syntax_node(db, self.0.lookup(db))
29137 }
29138}
29139impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29140 fn from(ptr: TerminalRefPtr<'db>) -> Self {
29141 ptr.untyped()
29142 }
29143}
29144#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29145pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29146impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29147 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29148 type StablePtr = TerminalRefPtr<'db>;
29149 type Green = TerminalRefGreen<'db>;
29150 fn missing(db: &'db dyn Database) -> Self::Green {
29151 TerminalRefGreen(
29152 GreenNode {
29153 kind: SyntaxKind::TerminalRef,
29154 details: GreenNodeDetails::Node {
29155 children: [
29156 Trivia::missing(db).0,
29157 TokenRef::missing(db).0,
29158 Trivia::missing(db).0,
29159 ]
29160 .into(),
29161 width: TextWidth::default(),
29162 },
29163 }
29164 .intern(db),
29165 )
29166 }
29167 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29168 let kind = node.kind(db);
29169 assert_eq!(
29170 kind,
29171 SyntaxKind::TerminalRef,
29172 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29173 kind,
29174 SyntaxKind::TerminalRef
29175 );
29176 Self { node }
29177 }
29178 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29179 let kind = node.kind(db);
29180 if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29181 }
29182 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29183 self.node
29184 }
29185 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29186 TerminalRefPtr(self.node.stable_ptr(db))
29187 }
29188}
29189#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29190pub struct TokenContinue<'db> {
29191 node: SyntaxNode<'db>,
29192}
29193impl<'db> Token<'db> for TokenContinue<'db> {
29194 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29195 TokenContinueGreen(
29196 GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29197 .intern(db),
29198 )
29199 }
29200 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29201 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29202 }
29203}
29204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29205pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29206impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29207 type SyntaxNode = TokenContinue<'db>;
29208 fn untyped(self) -> SyntaxStablePtrId<'db> {
29209 self.0
29210 }
29211 fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29212 TokenContinue::from_syntax_node(db, self.0.lookup(db))
29213 }
29214}
29215impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29216 fn from(ptr: TokenContinuePtr<'db>) -> Self {
29217 ptr.untyped()
29218 }
29219}
29220#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29221pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29222impl<'db> TokenContinueGreen<'db> {
29223 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29224 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29225 }
29226}
29227impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29228 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29229 type StablePtr = TokenContinuePtr<'db>;
29230 type Green = TokenContinueGreen<'db>;
29231 fn missing(db: &'db dyn Database) -> Self::Green {
29232 TokenContinueGreen(
29233 GreenNode {
29234 kind: SyntaxKind::TokenMissing,
29235 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29236 }
29237 .intern(db),
29238 )
29239 }
29240 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29241 match node.green_node(db).details {
29242 GreenNodeDetails::Token(_) => Self { node },
29243 GreenNodeDetails::Node { .. } => {
29244 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29245 }
29246 }
29247 }
29248 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29249 match node.green_node(db).details {
29250 GreenNodeDetails::Token(_) => Some(Self { node }),
29251 GreenNodeDetails::Node { .. } => None,
29252 }
29253 }
29254 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29255 self.node
29256 }
29257 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29258 TokenContinuePtr(self.node.stable_ptr(db))
29259 }
29260}
29261#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29262pub struct TerminalContinue<'db> {
29263 node: SyntaxNode<'db>,
29264}
29265impl<'db> Terminal<'db> for TerminalContinue<'db> {
29266 const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29267 type TokenType = TokenContinue<'db>;
29268 fn new_green(
29269 db: &'db dyn Database,
29270 leading_trivia: TriviaGreen<'db>,
29271 token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29272 trailing_trivia: TriviaGreen<'db>,
29273 ) -> Self::Green {
29274 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29275 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29276 TerminalContinueGreen(
29277 GreenNode {
29278 kind: SyntaxKind::TerminalContinue,
29279 details: GreenNodeDetails::Node { children: children.into(), width },
29280 }
29281 .intern(db),
29282 )
29283 }
29284 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29285 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29286 unreachable!("Expected a node, not a token");
29287 };
29288 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29289 }
29290}
29291impl<'db> TerminalContinue<'db> {
29292 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29293 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29294 }
29295 pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29296 TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29297 }
29298 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29299 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29300 }
29301}
29302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29303pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29304impl<'db> TerminalContinuePtr<'db> {}
29305impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29306 type SyntaxNode = TerminalContinue<'db>;
29307 fn untyped(self) -> SyntaxStablePtrId<'db> {
29308 self.0
29309 }
29310 fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29311 TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29312 }
29313}
29314impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29315 fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29316 ptr.untyped()
29317 }
29318}
29319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29320pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29321impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29322 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29323 type StablePtr = TerminalContinuePtr<'db>;
29324 type Green = TerminalContinueGreen<'db>;
29325 fn missing(db: &'db dyn Database) -> Self::Green {
29326 TerminalContinueGreen(
29327 GreenNode {
29328 kind: SyntaxKind::TerminalContinue,
29329 details: GreenNodeDetails::Node {
29330 children: [
29331 Trivia::missing(db).0,
29332 TokenContinue::missing(db).0,
29333 Trivia::missing(db).0,
29334 ]
29335 .into(),
29336 width: TextWidth::default(),
29337 },
29338 }
29339 .intern(db),
29340 )
29341 }
29342 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29343 let kind = node.kind(db);
29344 assert_eq!(
29345 kind,
29346 SyntaxKind::TerminalContinue,
29347 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29348 kind,
29349 SyntaxKind::TerminalContinue
29350 );
29351 Self { node }
29352 }
29353 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29354 let kind = node.kind(db);
29355 if kind == SyntaxKind::TerminalContinue {
29356 Some(Self::from_syntax_node(db, node))
29357 } else {
29358 None
29359 }
29360 }
29361 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29362 self.node
29363 }
29364 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29365 TerminalContinuePtr(self.node.stable_ptr(db))
29366 }
29367}
29368#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29369pub struct TokenReturn<'db> {
29370 node: SyntaxNode<'db>,
29371}
29372impl<'db> Token<'db> for TokenReturn<'db> {
29373 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29374 TokenReturnGreen(
29375 GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29376 .intern(db),
29377 )
29378 }
29379 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29380 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29381 }
29382}
29383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29384pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29385impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29386 type SyntaxNode = TokenReturn<'db>;
29387 fn untyped(self) -> SyntaxStablePtrId<'db> {
29388 self.0
29389 }
29390 fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29391 TokenReturn::from_syntax_node(db, self.0.lookup(db))
29392 }
29393}
29394impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29395 fn from(ptr: TokenReturnPtr<'db>) -> Self {
29396 ptr.untyped()
29397 }
29398}
29399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29400pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29401impl<'db> TokenReturnGreen<'db> {
29402 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29403 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29404 }
29405}
29406impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29407 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29408 type StablePtr = TokenReturnPtr<'db>;
29409 type Green = TokenReturnGreen<'db>;
29410 fn missing(db: &'db dyn Database) -> Self::Green {
29411 TokenReturnGreen(
29412 GreenNode {
29413 kind: SyntaxKind::TokenMissing,
29414 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29415 }
29416 .intern(db),
29417 )
29418 }
29419 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29420 match node.green_node(db).details {
29421 GreenNodeDetails::Token(_) => Self { node },
29422 GreenNodeDetails::Node { .. } => {
29423 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29424 }
29425 }
29426 }
29427 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29428 match node.green_node(db).details {
29429 GreenNodeDetails::Token(_) => Some(Self { node }),
29430 GreenNodeDetails::Node { .. } => None,
29431 }
29432 }
29433 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29434 self.node
29435 }
29436 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29437 TokenReturnPtr(self.node.stable_ptr(db))
29438 }
29439}
29440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29441pub struct TerminalReturn<'db> {
29442 node: SyntaxNode<'db>,
29443}
29444impl<'db> Terminal<'db> for TerminalReturn<'db> {
29445 const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29446 type TokenType = TokenReturn<'db>;
29447 fn new_green(
29448 db: &'db dyn Database,
29449 leading_trivia: TriviaGreen<'db>,
29450 token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29451 trailing_trivia: TriviaGreen<'db>,
29452 ) -> Self::Green {
29453 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29454 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29455 TerminalReturnGreen(
29456 GreenNode {
29457 kind: SyntaxKind::TerminalReturn,
29458 details: GreenNodeDetails::Node { children: children.into(), width },
29459 }
29460 .intern(db),
29461 )
29462 }
29463 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29464 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29465 unreachable!("Expected a node, not a token");
29466 };
29467 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29468 }
29469}
29470impl<'db> TerminalReturn<'db> {
29471 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29472 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29473 }
29474 pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29475 TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29476 }
29477 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29478 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29479 }
29480}
29481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29482pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29483impl<'db> TerminalReturnPtr<'db> {}
29484impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29485 type SyntaxNode = TerminalReturn<'db>;
29486 fn untyped(self) -> SyntaxStablePtrId<'db> {
29487 self.0
29488 }
29489 fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29490 TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29491 }
29492}
29493impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29494 fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29495 ptr.untyped()
29496 }
29497}
29498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29499pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29500impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29501 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29502 type StablePtr = TerminalReturnPtr<'db>;
29503 type Green = TerminalReturnGreen<'db>;
29504 fn missing(db: &'db dyn Database) -> Self::Green {
29505 TerminalReturnGreen(
29506 GreenNode {
29507 kind: SyntaxKind::TerminalReturn,
29508 details: GreenNodeDetails::Node {
29509 children: [
29510 Trivia::missing(db).0,
29511 TokenReturn::missing(db).0,
29512 Trivia::missing(db).0,
29513 ]
29514 .into(),
29515 width: TextWidth::default(),
29516 },
29517 }
29518 .intern(db),
29519 )
29520 }
29521 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29522 let kind = node.kind(db);
29523 assert_eq!(
29524 kind,
29525 SyntaxKind::TerminalReturn,
29526 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29527 kind,
29528 SyntaxKind::TerminalReturn
29529 );
29530 Self { node }
29531 }
29532 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29533 let kind = node.kind(db);
29534 if kind == SyntaxKind::TerminalReturn {
29535 Some(Self::from_syntax_node(db, node))
29536 } else {
29537 None
29538 }
29539 }
29540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29541 self.node
29542 }
29543 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29544 TerminalReturnPtr(self.node.stable_ptr(db))
29545 }
29546}
29547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29548pub struct TokenBreak<'db> {
29549 node: SyntaxNode<'db>,
29550}
29551impl<'db> Token<'db> for TokenBreak<'db> {
29552 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29553 TokenBreakGreen(
29554 GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29555 .intern(db),
29556 )
29557 }
29558 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29559 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29560 }
29561}
29562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29563pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29564impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29565 type SyntaxNode = TokenBreak<'db>;
29566 fn untyped(self) -> SyntaxStablePtrId<'db> {
29567 self.0
29568 }
29569 fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29570 TokenBreak::from_syntax_node(db, self.0.lookup(db))
29571 }
29572}
29573impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29574 fn from(ptr: TokenBreakPtr<'db>) -> Self {
29575 ptr.untyped()
29576 }
29577}
29578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29579pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
29580impl<'db> TokenBreakGreen<'db> {
29581 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29582 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29583 }
29584}
29585impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
29586 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
29587 type StablePtr = TokenBreakPtr<'db>;
29588 type Green = TokenBreakGreen<'db>;
29589 fn missing(db: &'db dyn Database) -> Self::Green {
29590 TokenBreakGreen(
29591 GreenNode {
29592 kind: SyntaxKind::TokenMissing,
29593 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29594 }
29595 .intern(db),
29596 )
29597 }
29598 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29599 match node.green_node(db).details {
29600 GreenNodeDetails::Token(_) => Self { node },
29601 GreenNodeDetails::Node { .. } => {
29602 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
29603 }
29604 }
29605 }
29606 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29607 match node.green_node(db).details {
29608 GreenNodeDetails::Token(_) => Some(Self { node }),
29609 GreenNodeDetails::Node { .. } => None,
29610 }
29611 }
29612 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29613 self.node
29614 }
29615 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29616 TokenBreakPtr(self.node.stable_ptr(db))
29617 }
29618}
29619#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29620pub struct TerminalBreak<'db> {
29621 node: SyntaxNode<'db>,
29622}
29623impl<'db> Terminal<'db> for TerminalBreak<'db> {
29624 const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
29625 type TokenType = TokenBreak<'db>;
29626 fn new_green(
29627 db: &'db dyn Database,
29628 leading_trivia: TriviaGreen<'db>,
29629 token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29630 trailing_trivia: TriviaGreen<'db>,
29631 ) -> Self::Green {
29632 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29633 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29634 TerminalBreakGreen(
29635 GreenNode {
29636 kind: SyntaxKind::TerminalBreak,
29637 details: GreenNodeDetails::Node { children: children.into(), width },
29638 }
29639 .intern(db),
29640 )
29641 }
29642 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29643 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29644 unreachable!("Expected a node, not a token");
29645 };
29646 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29647 }
29648}
29649impl<'db> TerminalBreak<'db> {
29650 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29651 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29652 }
29653 pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29654 TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
29655 }
29656 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29657 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29658 }
29659}
29660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29661pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29662impl<'db> TerminalBreakPtr<'db> {}
29663impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
29664 type SyntaxNode = TerminalBreak<'db>;
29665 fn untyped(self) -> SyntaxStablePtrId<'db> {
29666 self.0
29667 }
29668 fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
29669 TerminalBreak::from_syntax_node(db, self.0.lookup(db))
29670 }
29671}
29672impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29673 fn from(ptr: TerminalBreakPtr<'db>) -> Self {
29674 ptr.untyped()
29675 }
29676}
29677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29678pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
29679impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
29680 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
29681 type StablePtr = TerminalBreakPtr<'db>;
29682 type Green = TerminalBreakGreen<'db>;
29683 fn missing(db: &'db dyn Database) -> Self::Green {
29684 TerminalBreakGreen(
29685 GreenNode {
29686 kind: SyntaxKind::TerminalBreak,
29687 details: GreenNodeDetails::Node {
29688 children: [
29689 Trivia::missing(db).0,
29690 TokenBreak::missing(db).0,
29691 Trivia::missing(db).0,
29692 ]
29693 .into(),
29694 width: TextWidth::default(),
29695 },
29696 }
29697 .intern(db),
29698 )
29699 }
29700 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29701 let kind = node.kind(db);
29702 assert_eq!(
29703 kind,
29704 SyntaxKind::TerminalBreak,
29705 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29706 kind,
29707 SyntaxKind::TerminalBreak
29708 );
29709 Self { node }
29710 }
29711 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29712 let kind = node.kind(db);
29713 if kind == SyntaxKind::TerminalBreak {
29714 Some(Self::from_syntax_node(db, node))
29715 } else {
29716 None
29717 }
29718 }
29719 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29720 self.node
29721 }
29722 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29723 TerminalBreakPtr(self.node.stable_ptr(db))
29724 }
29725}
29726#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29727pub struct TokenStruct<'db> {
29728 node: SyntaxNode<'db>,
29729}
29730impl<'db> Token<'db> for TokenStruct<'db> {
29731 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29732 TokenStructGreen(
29733 GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
29734 .intern(db),
29735 )
29736 }
29737 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29738 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29739 }
29740}
29741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29742pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29743impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
29744 type SyntaxNode = TokenStruct<'db>;
29745 fn untyped(self) -> SyntaxStablePtrId<'db> {
29746 self.0
29747 }
29748 fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
29749 TokenStruct::from_syntax_node(db, self.0.lookup(db))
29750 }
29751}
29752impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
29753 fn from(ptr: TokenStructPtr<'db>) -> Self {
29754 ptr.untyped()
29755 }
29756}
29757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29758pub struct TokenStructGreen<'db>(pub GreenId<'db>);
29759impl<'db> TokenStructGreen<'db> {
29760 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29761 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29762 }
29763}
29764impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
29765 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
29766 type StablePtr = TokenStructPtr<'db>;
29767 type Green = TokenStructGreen<'db>;
29768 fn missing(db: &'db dyn Database) -> Self::Green {
29769 TokenStructGreen(
29770 GreenNode {
29771 kind: SyntaxKind::TokenMissing,
29772 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29773 }
29774 .intern(db),
29775 )
29776 }
29777 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29778 match node.green_node(db).details {
29779 GreenNodeDetails::Token(_) => Self { node },
29780 GreenNodeDetails::Node { .. } => {
29781 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
29782 }
29783 }
29784 }
29785 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29786 match node.green_node(db).details {
29787 GreenNodeDetails::Token(_) => Some(Self { node }),
29788 GreenNodeDetails::Node { .. } => None,
29789 }
29790 }
29791 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29792 self.node
29793 }
29794 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29795 TokenStructPtr(self.node.stable_ptr(db))
29796 }
29797}
29798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29799pub struct TerminalStruct<'db> {
29800 node: SyntaxNode<'db>,
29801}
29802impl<'db> Terminal<'db> for TerminalStruct<'db> {
29803 const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
29804 type TokenType = TokenStruct<'db>;
29805 fn new_green(
29806 db: &'db dyn Database,
29807 leading_trivia: TriviaGreen<'db>,
29808 token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29809 trailing_trivia: TriviaGreen<'db>,
29810 ) -> Self::Green {
29811 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29812 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29813 TerminalStructGreen(
29814 GreenNode {
29815 kind: SyntaxKind::TerminalStruct,
29816 details: GreenNodeDetails::Node { children: children.into(), width },
29817 }
29818 .intern(db),
29819 )
29820 }
29821 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29822 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29823 unreachable!("Expected a node, not a token");
29824 };
29825 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29826 }
29827}
29828impl<'db> TerminalStruct<'db> {
29829 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29830 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29831 }
29832 pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
29833 TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
29834 }
29835 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29836 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29837 }
29838}
29839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29840pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29841impl<'db> TerminalStructPtr<'db> {}
29842impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
29843 type SyntaxNode = TerminalStruct<'db>;
29844 fn untyped(self) -> SyntaxStablePtrId<'db> {
29845 self.0
29846 }
29847 fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
29848 TerminalStruct::from_syntax_node(db, self.0.lookup(db))
29849 }
29850}
29851impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
29852 fn from(ptr: TerminalStructPtr<'db>) -> Self {
29853 ptr.untyped()
29854 }
29855}
29856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29857pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
29858impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
29859 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
29860 type StablePtr = TerminalStructPtr<'db>;
29861 type Green = TerminalStructGreen<'db>;
29862 fn missing(db: &'db dyn Database) -> Self::Green {
29863 TerminalStructGreen(
29864 GreenNode {
29865 kind: SyntaxKind::TerminalStruct,
29866 details: GreenNodeDetails::Node {
29867 children: [
29868 Trivia::missing(db).0,
29869 TokenStruct::missing(db).0,
29870 Trivia::missing(db).0,
29871 ]
29872 .into(),
29873 width: TextWidth::default(),
29874 },
29875 }
29876 .intern(db),
29877 )
29878 }
29879 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29880 let kind = node.kind(db);
29881 assert_eq!(
29882 kind,
29883 SyntaxKind::TerminalStruct,
29884 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29885 kind,
29886 SyntaxKind::TerminalStruct
29887 );
29888 Self { node }
29889 }
29890 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29891 let kind = node.kind(db);
29892 if kind == SyntaxKind::TerminalStruct {
29893 Some(Self::from_syntax_node(db, node))
29894 } else {
29895 None
29896 }
29897 }
29898 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29899 self.node
29900 }
29901 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29902 TerminalStructPtr(self.node.stable_ptr(db))
29903 }
29904}
29905#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29906pub struct TokenTrait<'db> {
29907 node: SyntaxNode<'db>,
29908}
29909impl<'db> Token<'db> for TokenTrait<'db> {
29910 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29911 TokenTraitGreen(
29912 GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
29913 .intern(db),
29914 )
29915 }
29916 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29917 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29918 }
29919}
29920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29921pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
29922impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
29923 type SyntaxNode = TokenTrait<'db>;
29924 fn untyped(self) -> SyntaxStablePtrId<'db> {
29925 self.0
29926 }
29927 fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
29928 TokenTrait::from_syntax_node(db, self.0.lookup(db))
29929 }
29930}
29931impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
29932 fn from(ptr: TokenTraitPtr<'db>) -> Self {
29933 ptr.untyped()
29934 }
29935}
29936#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29937pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
29938impl<'db> TokenTraitGreen<'db> {
29939 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29940 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29941 }
29942}
29943impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
29944 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
29945 type StablePtr = TokenTraitPtr<'db>;
29946 type Green = TokenTraitGreen<'db>;
29947 fn missing(db: &'db dyn Database) -> Self::Green {
29948 TokenTraitGreen(
29949 GreenNode {
29950 kind: SyntaxKind::TokenMissing,
29951 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29952 }
29953 .intern(db),
29954 )
29955 }
29956 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29957 match node.green_node(db).details {
29958 GreenNodeDetails::Token(_) => Self { node },
29959 GreenNodeDetails::Node { .. } => {
29960 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
29961 }
29962 }
29963 }
29964 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29965 match node.green_node(db).details {
29966 GreenNodeDetails::Token(_) => Some(Self { node }),
29967 GreenNodeDetails::Node { .. } => None,
29968 }
29969 }
29970 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29971 self.node
29972 }
29973 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29974 TokenTraitPtr(self.node.stable_ptr(db))
29975 }
29976}
29977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29978pub struct TerminalTrait<'db> {
29979 node: SyntaxNode<'db>,
29980}
29981impl<'db> Terminal<'db> for TerminalTrait<'db> {
29982 const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
29983 type TokenType = TokenTrait<'db>;
29984 fn new_green(
29985 db: &'db dyn Database,
29986 leading_trivia: TriviaGreen<'db>,
29987 token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29988 trailing_trivia: TriviaGreen<'db>,
29989 ) -> Self::Green {
29990 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29991 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29992 TerminalTraitGreen(
29993 GreenNode {
29994 kind: SyntaxKind::TerminalTrait,
29995 details: GreenNodeDetails::Node { children: children.into(), width },
29996 }
29997 .intern(db),
29998 )
29999 }
30000 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30001 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30002 unreachable!("Expected a node, not a token");
30003 };
30004 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30005 }
30006}
30007impl<'db> TerminalTrait<'db> {
30008 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30009 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30010 }
30011 pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30012 TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30013 }
30014 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30015 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30016 }
30017}
30018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30019pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30020impl<'db> TerminalTraitPtr<'db> {}
30021impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30022 type SyntaxNode = TerminalTrait<'db>;
30023 fn untyped(self) -> SyntaxStablePtrId<'db> {
30024 self.0
30025 }
30026 fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30027 TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30028 }
30029}
30030impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30031 fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30032 ptr.untyped()
30033 }
30034}
30035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30036pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30037impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30038 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30039 type StablePtr = TerminalTraitPtr<'db>;
30040 type Green = TerminalTraitGreen<'db>;
30041 fn missing(db: &'db dyn Database) -> Self::Green {
30042 TerminalTraitGreen(
30043 GreenNode {
30044 kind: SyntaxKind::TerminalTrait,
30045 details: GreenNodeDetails::Node {
30046 children: [
30047 Trivia::missing(db).0,
30048 TokenTrait::missing(db).0,
30049 Trivia::missing(db).0,
30050 ]
30051 .into(),
30052 width: TextWidth::default(),
30053 },
30054 }
30055 .intern(db),
30056 )
30057 }
30058 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30059 let kind = node.kind(db);
30060 assert_eq!(
30061 kind,
30062 SyntaxKind::TerminalTrait,
30063 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30064 kind,
30065 SyntaxKind::TerminalTrait
30066 );
30067 Self { node }
30068 }
30069 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30070 let kind = node.kind(db);
30071 if kind == SyntaxKind::TerminalTrait {
30072 Some(Self::from_syntax_node(db, node))
30073 } else {
30074 None
30075 }
30076 }
30077 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30078 self.node
30079 }
30080 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30081 TerminalTraitPtr(self.node.stable_ptr(db))
30082 }
30083}
30084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30085pub struct TokenTrue<'db> {
30086 node: SyntaxNode<'db>,
30087}
30088impl<'db> Token<'db> for TokenTrue<'db> {
30089 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30090 TokenTrueGreen(
30091 GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30092 .intern(db),
30093 )
30094 }
30095 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30096 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30097 }
30098}
30099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30100pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30101impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30102 type SyntaxNode = TokenTrue<'db>;
30103 fn untyped(self) -> SyntaxStablePtrId<'db> {
30104 self.0
30105 }
30106 fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30107 TokenTrue::from_syntax_node(db, self.0.lookup(db))
30108 }
30109}
30110impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30111 fn from(ptr: TokenTruePtr<'db>) -> Self {
30112 ptr.untyped()
30113 }
30114}
30115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30116pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30117impl<'db> TokenTrueGreen<'db> {
30118 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30119 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30120 }
30121}
30122impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30123 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30124 type StablePtr = TokenTruePtr<'db>;
30125 type Green = TokenTrueGreen<'db>;
30126 fn missing(db: &'db dyn Database) -> Self::Green {
30127 TokenTrueGreen(
30128 GreenNode {
30129 kind: SyntaxKind::TokenMissing,
30130 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30131 }
30132 .intern(db),
30133 )
30134 }
30135 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30136 match node.green_node(db).details {
30137 GreenNodeDetails::Token(_) => Self { node },
30138 GreenNodeDetails::Node { .. } => {
30139 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30140 }
30141 }
30142 }
30143 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30144 match node.green_node(db).details {
30145 GreenNodeDetails::Token(_) => Some(Self { node }),
30146 GreenNodeDetails::Node { .. } => None,
30147 }
30148 }
30149 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30150 self.node
30151 }
30152 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30153 TokenTruePtr(self.node.stable_ptr(db))
30154 }
30155}
30156#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30157pub struct TerminalTrue<'db> {
30158 node: SyntaxNode<'db>,
30159}
30160impl<'db> Terminal<'db> for TerminalTrue<'db> {
30161 const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30162 type TokenType = TokenTrue<'db>;
30163 fn new_green(
30164 db: &'db dyn Database,
30165 leading_trivia: TriviaGreen<'db>,
30166 token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30167 trailing_trivia: TriviaGreen<'db>,
30168 ) -> Self::Green {
30169 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30170 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30171 TerminalTrueGreen(
30172 GreenNode {
30173 kind: SyntaxKind::TerminalTrue,
30174 details: GreenNodeDetails::Node { children: children.into(), width },
30175 }
30176 .intern(db),
30177 )
30178 }
30179 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30180 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30181 unreachable!("Expected a node, not a token");
30182 };
30183 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30184 }
30185}
30186impl<'db> TerminalTrue<'db> {
30187 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30188 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30189 }
30190 pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30191 TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30192 }
30193 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30194 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30195 }
30196}
30197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30198pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30199impl<'db> TerminalTruePtr<'db> {}
30200impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30201 type SyntaxNode = TerminalTrue<'db>;
30202 fn untyped(self) -> SyntaxStablePtrId<'db> {
30203 self.0
30204 }
30205 fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30206 TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30207 }
30208}
30209impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30210 fn from(ptr: TerminalTruePtr<'db>) -> Self {
30211 ptr.untyped()
30212 }
30213}
30214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30215pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30216impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30217 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30218 type StablePtr = TerminalTruePtr<'db>;
30219 type Green = TerminalTrueGreen<'db>;
30220 fn missing(db: &'db dyn Database) -> Self::Green {
30221 TerminalTrueGreen(
30222 GreenNode {
30223 kind: SyntaxKind::TerminalTrue,
30224 details: GreenNodeDetails::Node {
30225 children: [
30226 Trivia::missing(db).0,
30227 TokenTrue::missing(db).0,
30228 Trivia::missing(db).0,
30229 ]
30230 .into(),
30231 width: TextWidth::default(),
30232 },
30233 }
30234 .intern(db),
30235 )
30236 }
30237 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30238 let kind = node.kind(db);
30239 assert_eq!(
30240 kind,
30241 SyntaxKind::TerminalTrue,
30242 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30243 kind,
30244 SyntaxKind::TerminalTrue
30245 );
30246 Self { node }
30247 }
30248 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30249 let kind = node.kind(db);
30250 if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30251 }
30252 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30253 self.node
30254 }
30255 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30256 TerminalTruePtr(self.node.stable_ptr(db))
30257 }
30258}
30259#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30260pub struct TokenType<'db> {
30261 node: SyntaxNode<'db>,
30262}
30263impl<'db> Token<'db> for TokenType<'db> {
30264 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30265 TokenTypeGreen(
30266 GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30267 .intern(db),
30268 )
30269 }
30270 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30271 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30272 }
30273}
30274#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30275pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30276impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30277 type SyntaxNode = TokenType<'db>;
30278 fn untyped(self) -> SyntaxStablePtrId<'db> {
30279 self.0
30280 }
30281 fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30282 TokenType::from_syntax_node(db, self.0.lookup(db))
30283 }
30284}
30285impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30286 fn from(ptr: TokenTypePtr<'db>) -> Self {
30287 ptr.untyped()
30288 }
30289}
30290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30291pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30292impl<'db> TokenTypeGreen<'db> {
30293 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30294 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30295 }
30296}
30297impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30298 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30299 type StablePtr = TokenTypePtr<'db>;
30300 type Green = TokenTypeGreen<'db>;
30301 fn missing(db: &'db dyn Database) -> Self::Green {
30302 TokenTypeGreen(
30303 GreenNode {
30304 kind: SyntaxKind::TokenMissing,
30305 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30306 }
30307 .intern(db),
30308 )
30309 }
30310 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30311 match node.green_node(db).details {
30312 GreenNodeDetails::Token(_) => Self { node },
30313 GreenNodeDetails::Node { .. } => {
30314 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30315 }
30316 }
30317 }
30318 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30319 match node.green_node(db).details {
30320 GreenNodeDetails::Token(_) => Some(Self { node }),
30321 GreenNodeDetails::Node { .. } => None,
30322 }
30323 }
30324 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30325 self.node
30326 }
30327 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30328 TokenTypePtr(self.node.stable_ptr(db))
30329 }
30330}
30331#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30332pub struct TerminalType<'db> {
30333 node: SyntaxNode<'db>,
30334}
30335impl<'db> Terminal<'db> for TerminalType<'db> {
30336 const KIND: SyntaxKind = SyntaxKind::TerminalType;
30337 type TokenType = TokenType<'db>;
30338 fn new_green(
30339 db: &'db dyn Database,
30340 leading_trivia: TriviaGreen<'db>,
30341 token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30342 trailing_trivia: TriviaGreen<'db>,
30343 ) -> Self::Green {
30344 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30345 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30346 TerminalTypeGreen(
30347 GreenNode {
30348 kind: SyntaxKind::TerminalType,
30349 details: GreenNodeDetails::Node { children: children.into(), width },
30350 }
30351 .intern(db),
30352 )
30353 }
30354 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30355 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30356 unreachable!("Expected a node, not a token");
30357 };
30358 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30359 }
30360}
30361impl<'db> TerminalType<'db> {
30362 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30363 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30364 }
30365 pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30366 TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30367 }
30368 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30369 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30370 }
30371}
30372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30373pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30374impl<'db> TerminalTypePtr<'db> {}
30375impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30376 type SyntaxNode = TerminalType<'db>;
30377 fn untyped(self) -> SyntaxStablePtrId<'db> {
30378 self.0
30379 }
30380 fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30381 TerminalType::from_syntax_node(db, self.0.lookup(db))
30382 }
30383}
30384impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30385 fn from(ptr: TerminalTypePtr<'db>) -> Self {
30386 ptr.untyped()
30387 }
30388}
30389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30390pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30391impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30392 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30393 type StablePtr = TerminalTypePtr<'db>;
30394 type Green = TerminalTypeGreen<'db>;
30395 fn missing(db: &'db dyn Database) -> Self::Green {
30396 TerminalTypeGreen(
30397 GreenNode {
30398 kind: SyntaxKind::TerminalType,
30399 details: GreenNodeDetails::Node {
30400 children: [
30401 Trivia::missing(db).0,
30402 TokenType::missing(db).0,
30403 Trivia::missing(db).0,
30404 ]
30405 .into(),
30406 width: TextWidth::default(),
30407 },
30408 }
30409 .intern(db),
30410 )
30411 }
30412 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30413 let kind = node.kind(db);
30414 assert_eq!(
30415 kind,
30416 SyntaxKind::TerminalType,
30417 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30418 kind,
30419 SyntaxKind::TerminalType
30420 );
30421 Self { node }
30422 }
30423 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30424 let kind = node.kind(db);
30425 if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30426 }
30427 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30428 self.node
30429 }
30430 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30431 TerminalTypePtr(self.node.stable_ptr(db))
30432 }
30433}
30434#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30435pub struct TokenUse<'db> {
30436 node: SyntaxNode<'db>,
30437}
30438impl<'db> Token<'db> for TokenUse<'db> {
30439 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30440 TokenUseGreen(
30441 GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30442 .intern(db),
30443 )
30444 }
30445 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30446 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30447 }
30448}
30449#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30450pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30451impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30452 type SyntaxNode = TokenUse<'db>;
30453 fn untyped(self) -> SyntaxStablePtrId<'db> {
30454 self.0
30455 }
30456 fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30457 TokenUse::from_syntax_node(db, self.0.lookup(db))
30458 }
30459}
30460impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30461 fn from(ptr: TokenUsePtr<'db>) -> Self {
30462 ptr.untyped()
30463 }
30464}
30465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30466pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30467impl<'db> TokenUseGreen<'db> {
30468 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30469 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30470 }
30471}
30472impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30473 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30474 type StablePtr = TokenUsePtr<'db>;
30475 type Green = TokenUseGreen<'db>;
30476 fn missing(db: &'db dyn Database) -> Self::Green {
30477 TokenUseGreen(
30478 GreenNode {
30479 kind: SyntaxKind::TokenMissing,
30480 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30481 }
30482 .intern(db),
30483 )
30484 }
30485 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30486 match node.green_node(db).details {
30487 GreenNodeDetails::Token(_) => Self { node },
30488 GreenNodeDetails::Node { .. } => {
30489 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30490 }
30491 }
30492 }
30493 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30494 match node.green_node(db).details {
30495 GreenNodeDetails::Token(_) => Some(Self { node }),
30496 GreenNodeDetails::Node { .. } => None,
30497 }
30498 }
30499 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30500 self.node
30501 }
30502 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30503 TokenUsePtr(self.node.stable_ptr(db))
30504 }
30505}
30506#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30507pub struct TerminalUse<'db> {
30508 node: SyntaxNode<'db>,
30509}
30510impl<'db> Terminal<'db> for TerminalUse<'db> {
30511 const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30512 type TokenType = TokenUse<'db>;
30513 fn new_green(
30514 db: &'db dyn Database,
30515 leading_trivia: TriviaGreen<'db>,
30516 token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30517 trailing_trivia: TriviaGreen<'db>,
30518 ) -> Self::Green {
30519 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30520 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30521 TerminalUseGreen(
30522 GreenNode {
30523 kind: SyntaxKind::TerminalUse,
30524 details: GreenNodeDetails::Node { children: children.into(), width },
30525 }
30526 .intern(db),
30527 )
30528 }
30529 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30530 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30531 unreachable!("Expected a node, not a token");
30532 };
30533 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30534 }
30535}
30536impl<'db> TerminalUse<'db> {
30537 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30538 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30539 }
30540 pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30541 TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30542 }
30543 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30544 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30545 }
30546}
30547#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30548pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30549impl<'db> TerminalUsePtr<'db> {}
30550impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30551 type SyntaxNode = TerminalUse<'db>;
30552 fn untyped(self) -> SyntaxStablePtrId<'db> {
30553 self.0
30554 }
30555 fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30556 TerminalUse::from_syntax_node(db, self.0.lookup(db))
30557 }
30558}
30559impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30560 fn from(ptr: TerminalUsePtr<'db>) -> Self {
30561 ptr.untyped()
30562 }
30563}
30564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30565pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30566impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30567 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30568 type StablePtr = TerminalUsePtr<'db>;
30569 type Green = TerminalUseGreen<'db>;
30570 fn missing(db: &'db dyn Database) -> Self::Green {
30571 TerminalUseGreen(
30572 GreenNode {
30573 kind: SyntaxKind::TerminalUse,
30574 details: GreenNodeDetails::Node {
30575 children: [
30576 Trivia::missing(db).0,
30577 TokenUse::missing(db).0,
30578 Trivia::missing(db).0,
30579 ]
30580 .into(),
30581 width: TextWidth::default(),
30582 },
30583 }
30584 .intern(db),
30585 )
30586 }
30587 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30588 let kind = node.kind(db);
30589 assert_eq!(
30590 kind,
30591 SyntaxKind::TerminalUse,
30592 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30593 kind,
30594 SyntaxKind::TerminalUse
30595 );
30596 Self { node }
30597 }
30598 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30599 let kind = node.kind(db);
30600 if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
30601 }
30602 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30603 self.node
30604 }
30605 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30606 TerminalUsePtr(self.node.stable_ptr(db))
30607 }
30608}
30609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30610pub struct TokenPub<'db> {
30611 node: SyntaxNode<'db>,
30612}
30613impl<'db> Token<'db> for TokenPub<'db> {
30614 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30615 TokenPubGreen(
30616 GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
30617 .intern(db),
30618 )
30619 }
30620 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30621 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30622 }
30623}
30624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30625pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30626impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
30627 type SyntaxNode = TokenPub<'db>;
30628 fn untyped(self) -> SyntaxStablePtrId<'db> {
30629 self.0
30630 }
30631 fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
30632 TokenPub::from_syntax_node(db, self.0.lookup(db))
30633 }
30634}
30635impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
30636 fn from(ptr: TokenPubPtr<'db>) -> Self {
30637 ptr.untyped()
30638 }
30639}
30640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30641pub struct TokenPubGreen<'db>(pub GreenId<'db>);
30642impl<'db> TokenPubGreen<'db> {
30643 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30644 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30645 }
30646}
30647impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
30648 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
30649 type StablePtr = TokenPubPtr<'db>;
30650 type Green = TokenPubGreen<'db>;
30651 fn missing(db: &'db dyn Database) -> Self::Green {
30652 TokenPubGreen(
30653 GreenNode {
30654 kind: SyntaxKind::TokenMissing,
30655 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30656 }
30657 .intern(db),
30658 )
30659 }
30660 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30661 match node.green_node(db).details {
30662 GreenNodeDetails::Token(_) => Self { node },
30663 GreenNodeDetails::Node { .. } => {
30664 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
30665 }
30666 }
30667 }
30668 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30669 match node.green_node(db).details {
30670 GreenNodeDetails::Token(_) => Some(Self { node }),
30671 GreenNodeDetails::Node { .. } => None,
30672 }
30673 }
30674 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30675 self.node
30676 }
30677 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30678 TokenPubPtr(self.node.stable_ptr(db))
30679 }
30680}
30681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30682pub struct TerminalPub<'db> {
30683 node: SyntaxNode<'db>,
30684}
30685impl<'db> Terminal<'db> for TerminalPub<'db> {
30686 const KIND: SyntaxKind = SyntaxKind::TerminalPub;
30687 type TokenType = TokenPub<'db>;
30688 fn new_green(
30689 db: &'db dyn Database,
30690 leading_trivia: TriviaGreen<'db>,
30691 token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30692 trailing_trivia: TriviaGreen<'db>,
30693 ) -> Self::Green {
30694 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30695 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30696 TerminalPubGreen(
30697 GreenNode {
30698 kind: SyntaxKind::TerminalPub,
30699 details: GreenNodeDetails::Node { children: children.into(), width },
30700 }
30701 .intern(db),
30702 )
30703 }
30704 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30705 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30706 unreachable!("Expected a node, not a token");
30707 };
30708 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30709 }
30710}
30711impl<'db> TerminalPub<'db> {
30712 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30713 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30714 }
30715 pub fn token(&self, db: &'db dyn Database) -> TokenPub<'db> {
30716 TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
30717 }
30718 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30719 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30720 }
30721}
30722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30723pub struct TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30724impl<'db> TerminalPubPtr<'db> {}
30725impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
30726 type SyntaxNode = TerminalPub<'db>;
30727 fn untyped(self) -> SyntaxStablePtrId<'db> {
30728 self.0
30729 }
30730 fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
30731 TerminalPub::from_syntax_node(db, self.0.lookup(db))
30732 }
30733}
30734impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
30735 fn from(ptr: TerminalPubPtr<'db>) -> Self {
30736 ptr.untyped()
30737 }
30738}
30739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30740pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
30741impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
30742 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
30743 type StablePtr = TerminalPubPtr<'db>;
30744 type Green = TerminalPubGreen<'db>;
30745 fn missing(db: &'db dyn Database) -> Self::Green {
30746 TerminalPubGreen(
30747 GreenNode {
30748 kind: SyntaxKind::TerminalPub,
30749 details: GreenNodeDetails::Node {
30750 children: [
30751 Trivia::missing(db).0,
30752 TokenPub::missing(db).0,
30753 Trivia::missing(db).0,
30754 ]
30755 .into(),
30756 width: TextWidth::default(),
30757 },
30758 }
30759 .intern(db),
30760 )
30761 }
30762 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30763 let kind = node.kind(db);
30764 assert_eq!(
30765 kind,
30766 SyntaxKind::TerminalPub,
30767 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30768 kind,
30769 SyntaxKind::TerminalPub
30770 );
30771 Self { node }
30772 }
30773 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30774 let kind = node.kind(db);
30775 if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
30776 }
30777 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30778 self.node
30779 }
30780 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30781 TerminalPubPtr(self.node.stable_ptr(db))
30782 }
30783}
30784#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30785pub struct TokenAnd<'db> {
30786 node: SyntaxNode<'db>,
30787}
30788impl<'db> Token<'db> for TokenAnd<'db> {
30789 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30790 TokenAndGreen(
30791 GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
30792 .intern(db),
30793 )
30794 }
30795 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30796 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30797 }
30798}
30799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30800pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30801impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
30802 type SyntaxNode = TokenAnd<'db>;
30803 fn untyped(self) -> SyntaxStablePtrId<'db> {
30804 self.0
30805 }
30806 fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
30807 TokenAnd::from_syntax_node(db, self.0.lookup(db))
30808 }
30809}
30810impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
30811 fn from(ptr: TokenAndPtr<'db>) -> Self {
30812 ptr.untyped()
30813 }
30814}
30815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30816pub struct TokenAndGreen<'db>(pub GreenId<'db>);
30817impl<'db> TokenAndGreen<'db> {
30818 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30819 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30820 }
30821}
30822impl<'db> TypedSyntaxNode<'db> for TokenAnd<'db> {
30823 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
30824 type StablePtr = TokenAndPtr<'db>;
30825 type Green = TokenAndGreen<'db>;
30826 fn missing(db: &'db dyn Database) -> Self::Green {
30827 TokenAndGreen(
30828 GreenNode {
30829 kind: SyntaxKind::TokenMissing,
30830 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30831 }
30832 .intern(db),
30833 )
30834 }
30835 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30836 match node.green_node(db).details {
30837 GreenNodeDetails::Token(_) => Self { node },
30838 GreenNodeDetails::Node { .. } => {
30839 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
30840 }
30841 }
30842 }
30843 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30844 match node.green_node(db).details {
30845 GreenNodeDetails::Token(_) => Some(Self { node }),
30846 GreenNodeDetails::Node { .. } => None,
30847 }
30848 }
30849 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30850 self.node
30851 }
30852 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30853 TokenAndPtr(self.node.stable_ptr(db))
30854 }
30855}
30856#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30857pub struct TerminalAnd<'db> {
30858 node: SyntaxNode<'db>,
30859}
30860impl<'db> Terminal<'db> for TerminalAnd<'db> {
30861 const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
30862 type TokenType = TokenAnd<'db>;
30863 fn new_green(
30864 db: &'db dyn Database,
30865 leading_trivia: TriviaGreen<'db>,
30866 token: <<TerminalAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30867 trailing_trivia: TriviaGreen<'db>,
30868 ) -> Self::Green {
30869 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30870 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30871 TerminalAndGreen(
30872 GreenNode {
30873 kind: SyntaxKind::TerminalAnd,
30874 details: GreenNodeDetails::Node { children: children.into(), width },
30875 }
30876 .intern(db),
30877 )
30878 }
30879 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30880 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30881 unreachable!("Expected a node, not a token");
30882 };
30883 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30884 }
30885}
30886impl<'db> TerminalAnd<'db> {
30887 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30888 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30889 }
30890 pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
30891 TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
30892 }
30893 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30894 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30895 }
30896}
30897#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30898pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30899impl<'db> TerminalAndPtr<'db> {}
30900impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
30901 type SyntaxNode = TerminalAnd<'db>;
30902 fn untyped(self) -> SyntaxStablePtrId<'db> {
30903 self.0
30904 }
30905 fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
30906 TerminalAnd::from_syntax_node(db, self.0.lookup(db))
30907 }
30908}
30909impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
30910 fn from(ptr: TerminalAndPtr<'db>) -> Self {
30911 ptr.untyped()
30912 }
30913}
30914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30915pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
30916impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
30917 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
30918 type StablePtr = TerminalAndPtr<'db>;
30919 type Green = TerminalAndGreen<'db>;
30920 fn missing(db: &'db dyn Database) -> Self::Green {
30921 TerminalAndGreen(
30922 GreenNode {
30923 kind: SyntaxKind::TerminalAnd,
30924 details: GreenNodeDetails::Node {
30925 children: [
30926 Trivia::missing(db).0,
30927 TokenAnd::missing(db).0,
30928 Trivia::missing(db).0,
30929 ]
30930 .into(),
30931 width: TextWidth::default(),
30932 },
30933 }
30934 .intern(db),
30935 )
30936 }
30937 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30938 let kind = node.kind(db);
30939 assert_eq!(
30940 kind,
30941 SyntaxKind::TerminalAnd,
30942 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30943 kind,
30944 SyntaxKind::TerminalAnd
30945 );
30946 Self { node }
30947 }
30948 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30949 let kind = node.kind(db);
30950 if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
30951 }
30952 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30953 self.node
30954 }
30955 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30956 TerminalAndPtr(self.node.stable_ptr(db))
30957 }
30958}
30959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30960pub struct TokenAndAnd<'db> {
30961 node: SyntaxNode<'db>,
30962}
30963impl<'db> Token<'db> for TokenAndAnd<'db> {
30964 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30965 TokenAndAndGreen(
30966 GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
30967 .intern(db),
30968 )
30969 }
30970 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30971 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30972 }
30973}
30974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30975pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30976impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
30977 type SyntaxNode = TokenAndAnd<'db>;
30978 fn untyped(self) -> SyntaxStablePtrId<'db> {
30979 self.0
30980 }
30981 fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
30982 TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
30983 }
30984}
30985impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
30986 fn from(ptr: TokenAndAndPtr<'db>) -> Self {
30987 ptr.untyped()
30988 }
30989}
30990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30991pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
30992impl<'db> TokenAndAndGreen<'db> {
30993 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30994 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30995 }
30996}
30997impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
30998 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
30999 type StablePtr = TokenAndAndPtr<'db>;
31000 type Green = TokenAndAndGreen<'db>;
31001 fn missing(db: &'db dyn Database) -> Self::Green {
31002 TokenAndAndGreen(
31003 GreenNode {
31004 kind: SyntaxKind::TokenMissing,
31005 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31006 }
31007 .intern(db),
31008 )
31009 }
31010 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31011 match node.green_node(db).details {
31012 GreenNodeDetails::Token(_) => Self { node },
31013 GreenNodeDetails::Node { .. } => {
31014 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31015 }
31016 }
31017 }
31018 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31019 match node.green_node(db).details {
31020 GreenNodeDetails::Token(_) => Some(Self { node }),
31021 GreenNodeDetails::Node { .. } => None,
31022 }
31023 }
31024 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31025 self.node
31026 }
31027 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31028 TokenAndAndPtr(self.node.stable_ptr(db))
31029 }
31030}
31031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31032pub struct TerminalAndAnd<'db> {
31033 node: SyntaxNode<'db>,
31034}
31035impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31036 const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31037 type TokenType = TokenAndAnd<'db>;
31038 fn new_green(
31039 db: &'db dyn Database,
31040 leading_trivia: TriviaGreen<'db>,
31041 token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31042 trailing_trivia: TriviaGreen<'db>,
31043 ) -> Self::Green {
31044 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31045 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31046 TerminalAndAndGreen(
31047 GreenNode {
31048 kind: SyntaxKind::TerminalAndAnd,
31049 details: GreenNodeDetails::Node { children: children.into(), width },
31050 }
31051 .intern(db),
31052 )
31053 }
31054 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31055 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31056 unreachable!("Expected a node, not a token");
31057 };
31058 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31059 }
31060}
31061impl<'db> TerminalAndAnd<'db> {
31062 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31063 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31064 }
31065 pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31066 TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31067 }
31068 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31069 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31070 }
31071}
31072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31073pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31074impl<'db> TerminalAndAndPtr<'db> {}
31075impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31076 type SyntaxNode = TerminalAndAnd<'db>;
31077 fn untyped(self) -> SyntaxStablePtrId<'db> {
31078 self.0
31079 }
31080 fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31081 TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31082 }
31083}
31084impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31085 fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31086 ptr.untyped()
31087 }
31088}
31089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31090pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31091impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31092 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31093 type StablePtr = TerminalAndAndPtr<'db>;
31094 type Green = TerminalAndAndGreen<'db>;
31095 fn missing(db: &'db dyn Database) -> Self::Green {
31096 TerminalAndAndGreen(
31097 GreenNode {
31098 kind: SyntaxKind::TerminalAndAnd,
31099 details: GreenNodeDetails::Node {
31100 children: [
31101 Trivia::missing(db).0,
31102 TokenAndAnd::missing(db).0,
31103 Trivia::missing(db).0,
31104 ]
31105 .into(),
31106 width: TextWidth::default(),
31107 },
31108 }
31109 .intern(db),
31110 )
31111 }
31112 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31113 let kind = node.kind(db);
31114 assert_eq!(
31115 kind,
31116 SyntaxKind::TerminalAndAnd,
31117 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31118 kind,
31119 SyntaxKind::TerminalAndAnd
31120 );
31121 Self { node }
31122 }
31123 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31124 let kind = node.kind(db);
31125 if kind == SyntaxKind::TerminalAndAnd {
31126 Some(Self::from_syntax_node(db, node))
31127 } else {
31128 None
31129 }
31130 }
31131 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31132 self.node
31133 }
31134 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31135 TerminalAndAndPtr(self.node.stable_ptr(db))
31136 }
31137}
31138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31139pub struct TokenArrow<'db> {
31140 node: SyntaxNode<'db>,
31141}
31142impl<'db> Token<'db> for TokenArrow<'db> {
31143 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31144 TokenArrowGreen(
31145 GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31146 .intern(db),
31147 )
31148 }
31149 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31150 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31151 }
31152}
31153#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31154pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31155impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31156 type SyntaxNode = TokenArrow<'db>;
31157 fn untyped(self) -> SyntaxStablePtrId<'db> {
31158 self.0
31159 }
31160 fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31161 TokenArrow::from_syntax_node(db, self.0.lookup(db))
31162 }
31163}
31164impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31165 fn from(ptr: TokenArrowPtr<'db>) -> Self {
31166 ptr.untyped()
31167 }
31168}
31169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31170pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31171impl<'db> TokenArrowGreen<'db> {
31172 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31173 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31174 }
31175}
31176impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31177 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31178 type StablePtr = TokenArrowPtr<'db>;
31179 type Green = TokenArrowGreen<'db>;
31180 fn missing(db: &'db dyn Database) -> Self::Green {
31181 TokenArrowGreen(
31182 GreenNode {
31183 kind: SyntaxKind::TokenMissing,
31184 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31185 }
31186 .intern(db),
31187 )
31188 }
31189 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31190 match node.green_node(db).details {
31191 GreenNodeDetails::Token(_) => Self { node },
31192 GreenNodeDetails::Node { .. } => {
31193 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31194 }
31195 }
31196 }
31197 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31198 match node.green_node(db).details {
31199 GreenNodeDetails::Token(_) => Some(Self { node }),
31200 GreenNodeDetails::Node { .. } => None,
31201 }
31202 }
31203 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31204 self.node
31205 }
31206 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31207 TokenArrowPtr(self.node.stable_ptr(db))
31208 }
31209}
31210#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31211pub struct TerminalArrow<'db> {
31212 node: SyntaxNode<'db>,
31213}
31214impl<'db> Terminal<'db> for TerminalArrow<'db> {
31215 const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31216 type TokenType = TokenArrow<'db>;
31217 fn new_green(
31218 db: &'db dyn Database,
31219 leading_trivia: TriviaGreen<'db>,
31220 token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31221 trailing_trivia: TriviaGreen<'db>,
31222 ) -> Self::Green {
31223 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31224 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31225 TerminalArrowGreen(
31226 GreenNode {
31227 kind: SyntaxKind::TerminalArrow,
31228 details: GreenNodeDetails::Node { children: children.into(), width },
31229 }
31230 .intern(db),
31231 )
31232 }
31233 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31234 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31235 unreachable!("Expected a node, not a token");
31236 };
31237 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31238 }
31239}
31240impl<'db> TerminalArrow<'db> {
31241 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31242 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31243 }
31244 pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31245 TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31246 }
31247 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31248 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31249 }
31250}
31251#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31252pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31253impl<'db> TerminalArrowPtr<'db> {}
31254impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31255 type SyntaxNode = TerminalArrow<'db>;
31256 fn untyped(self) -> SyntaxStablePtrId<'db> {
31257 self.0
31258 }
31259 fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31260 TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31261 }
31262}
31263impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31264 fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31265 ptr.untyped()
31266 }
31267}
31268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31269pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31270impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31271 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31272 type StablePtr = TerminalArrowPtr<'db>;
31273 type Green = TerminalArrowGreen<'db>;
31274 fn missing(db: &'db dyn Database) -> Self::Green {
31275 TerminalArrowGreen(
31276 GreenNode {
31277 kind: SyntaxKind::TerminalArrow,
31278 details: GreenNodeDetails::Node {
31279 children: [
31280 Trivia::missing(db).0,
31281 TokenArrow::missing(db).0,
31282 Trivia::missing(db).0,
31283 ]
31284 .into(),
31285 width: TextWidth::default(),
31286 },
31287 }
31288 .intern(db),
31289 )
31290 }
31291 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31292 let kind = node.kind(db);
31293 assert_eq!(
31294 kind,
31295 SyntaxKind::TerminalArrow,
31296 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31297 kind,
31298 SyntaxKind::TerminalArrow
31299 );
31300 Self { node }
31301 }
31302 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31303 let kind = node.kind(db);
31304 if kind == SyntaxKind::TerminalArrow {
31305 Some(Self::from_syntax_node(db, node))
31306 } else {
31307 None
31308 }
31309 }
31310 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31311 self.node
31312 }
31313 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31314 TerminalArrowPtr(self.node.stable_ptr(db))
31315 }
31316}
31317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31318pub struct TokenAt<'db> {
31319 node: SyntaxNode<'db>,
31320}
31321impl<'db> Token<'db> for TokenAt<'db> {
31322 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31323 TokenAtGreen(
31324 GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31325 .intern(db),
31326 )
31327 }
31328 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31329 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31330 }
31331}
31332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31333pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31334impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31335 type SyntaxNode = TokenAt<'db>;
31336 fn untyped(self) -> SyntaxStablePtrId<'db> {
31337 self.0
31338 }
31339 fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31340 TokenAt::from_syntax_node(db, self.0.lookup(db))
31341 }
31342}
31343impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31344 fn from(ptr: TokenAtPtr<'db>) -> Self {
31345 ptr.untyped()
31346 }
31347}
31348#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31349pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31350impl<'db> TokenAtGreen<'db> {
31351 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31352 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31353 }
31354}
31355impl<'db> TypedSyntaxNode<'db> for TokenAt<'db> {
31356 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31357 type StablePtr = TokenAtPtr<'db>;
31358 type Green = TokenAtGreen<'db>;
31359 fn missing(db: &'db dyn Database) -> Self::Green {
31360 TokenAtGreen(
31361 GreenNode {
31362 kind: SyntaxKind::TokenMissing,
31363 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31364 }
31365 .intern(db),
31366 )
31367 }
31368 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31369 match node.green_node(db).details {
31370 GreenNodeDetails::Token(_) => Self { node },
31371 GreenNodeDetails::Node { .. } => {
31372 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31373 }
31374 }
31375 }
31376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31377 match node.green_node(db).details {
31378 GreenNodeDetails::Token(_) => Some(Self { node }),
31379 GreenNodeDetails::Node { .. } => None,
31380 }
31381 }
31382 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31383 self.node
31384 }
31385 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31386 TokenAtPtr(self.node.stable_ptr(db))
31387 }
31388}
31389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31390pub struct TerminalAt<'db> {
31391 node: SyntaxNode<'db>,
31392}
31393impl<'db> Terminal<'db> for TerminalAt<'db> {
31394 const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31395 type TokenType = TokenAt<'db>;
31396 fn new_green(
31397 db: &'db dyn Database,
31398 leading_trivia: TriviaGreen<'db>,
31399 token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31400 trailing_trivia: TriviaGreen<'db>,
31401 ) -> Self::Green {
31402 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31403 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31404 TerminalAtGreen(
31405 GreenNode {
31406 kind: SyntaxKind::TerminalAt,
31407 details: GreenNodeDetails::Node { children: children.into(), width },
31408 }
31409 .intern(db),
31410 )
31411 }
31412 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31413 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31414 unreachable!("Expected a node, not a token");
31415 };
31416 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31417 }
31418}
31419impl<'db> TerminalAt<'db> {
31420 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31421 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31422 }
31423 pub fn token(&self, db: &'db dyn Database) -> TokenAt<'db> {
31424 TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
31425 }
31426 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31427 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31428 }
31429}
31430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31431pub struct TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31432impl<'db> TerminalAtPtr<'db> {}
31433impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31434 type SyntaxNode = TerminalAt<'db>;
31435 fn untyped(self) -> SyntaxStablePtrId<'db> {
31436 self.0
31437 }
31438 fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31439 TerminalAt::from_syntax_node(db, self.0.lookup(db))
31440 }
31441}
31442impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31443 fn from(ptr: TerminalAtPtr<'db>) -> Self {
31444 ptr.untyped()
31445 }
31446}
31447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31448pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31449impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31450 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31451 type StablePtr = TerminalAtPtr<'db>;
31452 type Green = TerminalAtGreen<'db>;
31453 fn missing(db: &'db dyn Database) -> Self::Green {
31454 TerminalAtGreen(
31455 GreenNode {
31456 kind: SyntaxKind::TerminalAt,
31457 details: GreenNodeDetails::Node {
31458 children: [
31459 Trivia::missing(db).0,
31460 TokenAt::missing(db).0,
31461 Trivia::missing(db).0,
31462 ]
31463 .into(),
31464 width: TextWidth::default(),
31465 },
31466 }
31467 .intern(db),
31468 )
31469 }
31470 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31471 let kind = node.kind(db);
31472 assert_eq!(
31473 kind,
31474 SyntaxKind::TerminalAt,
31475 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31476 kind,
31477 SyntaxKind::TerminalAt
31478 );
31479 Self { node }
31480 }
31481 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31482 let kind = node.kind(db);
31483 if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31484 }
31485 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31486 self.node
31487 }
31488 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31489 TerminalAtPtr(self.node.stable_ptr(db))
31490 }
31491}
31492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31493pub struct TokenBadCharacters<'db> {
31494 node: SyntaxNode<'db>,
31495}
31496impl<'db> Token<'db> for TokenBadCharacters<'db> {
31497 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31498 TokenBadCharactersGreen(
31499 GreenNode {
31500 kind: SyntaxKind::TokenBadCharacters,
31501 details: GreenNodeDetails::Token(text),
31502 }
31503 .intern(db),
31504 )
31505 }
31506 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31507 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31508 }
31509}
31510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31511pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31512impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31513 type SyntaxNode = TokenBadCharacters<'db>;
31514 fn untyped(self) -> SyntaxStablePtrId<'db> {
31515 self.0
31516 }
31517 fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31518 TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31519 }
31520}
31521impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31522 fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31523 ptr.untyped()
31524 }
31525}
31526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31527pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31528impl<'db> TokenBadCharactersGreen<'db> {
31529 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31530 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31531 }
31532}
31533impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31534 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31535 type StablePtr = TokenBadCharactersPtr<'db>;
31536 type Green = TokenBadCharactersGreen<'db>;
31537 fn missing(db: &'db dyn Database) -> Self::Green {
31538 TokenBadCharactersGreen(
31539 GreenNode {
31540 kind: SyntaxKind::TokenMissing,
31541 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31542 }
31543 .intern(db),
31544 )
31545 }
31546 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31547 match node.green_node(db).details {
31548 GreenNodeDetails::Token(_) => Self { node },
31549 GreenNodeDetails::Node { .. } => panic!(
31550 "Expected a token {:?}, not an internal node",
31551 SyntaxKind::TokenBadCharacters
31552 ),
31553 }
31554 }
31555 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31556 match node.green_node(db).details {
31557 GreenNodeDetails::Token(_) => Some(Self { node }),
31558 GreenNodeDetails::Node { .. } => None,
31559 }
31560 }
31561 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31562 self.node
31563 }
31564 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31565 TokenBadCharactersPtr(self.node.stable_ptr(db))
31566 }
31567}
31568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31569pub struct TerminalBadCharacters<'db> {
31570 node: SyntaxNode<'db>,
31571}
31572impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
31573 const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
31574 type TokenType = TokenBadCharacters<'db>;
31575 fn new_green(
31576 db: &'db dyn Database,
31577 leading_trivia: TriviaGreen<'db>,
31578 token: <<TerminalBadCharacters<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31579 trailing_trivia: TriviaGreen<'db>,
31580 ) -> Self::Green {
31581 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31582 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31583 TerminalBadCharactersGreen(
31584 GreenNode {
31585 kind: SyntaxKind::TerminalBadCharacters,
31586 details: GreenNodeDetails::Node { children: children.into(), width },
31587 }
31588 .intern(db),
31589 )
31590 }
31591 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31592 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31593 unreachable!("Expected a node, not a token");
31594 };
31595 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31596 }
31597}
31598impl<'db> TerminalBadCharacters<'db> {
31599 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31600 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31601 }
31602 pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31603 TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
31604 }
31605 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31606 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31607 }
31608}
31609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31610pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31611impl<'db> TerminalBadCharactersPtr<'db> {}
31612impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
31613 type SyntaxNode = TerminalBadCharacters<'db>;
31614 fn untyped(self) -> SyntaxStablePtrId<'db> {
31615 self.0
31616 }
31617 fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
31618 TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
31619 }
31620}
31621impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31622 fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
31623 ptr.untyped()
31624 }
31625}
31626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31627pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
31628impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
31629 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
31630 type StablePtr = TerminalBadCharactersPtr<'db>;
31631 type Green = TerminalBadCharactersGreen<'db>;
31632 fn missing(db: &'db dyn Database) -> Self::Green {
31633 TerminalBadCharactersGreen(
31634 GreenNode {
31635 kind: SyntaxKind::TerminalBadCharacters,
31636 details: GreenNodeDetails::Node {
31637 children: [
31638 Trivia::missing(db).0,
31639 TokenBadCharacters::missing(db).0,
31640 Trivia::missing(db).0,
31641 ]
31642 .into(),
31643 width: TextWidth::default(),
31644 },
31645 }
31646 .intern(db),
31647 )
31648 }
31649 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31650 let kind = node.kind(db);
31651 assert_eq!(
31652 kind,
31653 SyntaxKind::TerminalBadCharacters,
31654 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31655 kind,
31656 SyntaxKind::TerminalBadCharacters
31657 );
31658 Self { node }
31659 }
31660 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31661 let kind = node.kind(db);
31662 if kind == SyntaxKind::TerminalBadCharacters {
31663 Some(Self::from_syntax_node(db, node))
31664 } else {
31665 None
31666 }
31667 }
31668 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31669 self.node
31670 }
31671 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31672 TerminalBadCharactersPtr(self.node.stable_ptr(db))
31673 }
31674}
31675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31676pub struct TokenColon<'db> {
31677 node: SyntaxNode<'db>,
31678}
31679impl<'db> Token<'db> for TokenColon<'db> {
31680 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31681 TokenColonGreen(
31682 GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
31683 .intern(db),
31684 )
31685 }
31686 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31687 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31688 }
31689}
31690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31691pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31692impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
31693 type SyntaxNode = TokenColon<'db>;
31694 fn untyped(self) -> SyntaxStablePtrId<'db> {
31695 self.0
31696 }
31697 fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
31698 TokenColon::from_syntax_node(db, self.0.lookup(db))
31699 }
31700}
31701impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
31702 fn from(ptr: TokenColonPtr<'db>) -> Self {
31703 ptr.untyped()
31704 }
31705}
31706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31707pub struct TokenColonGreen<'db>(pub GreenId<'db>);
31708impl<'db> TokenColonGreen<'db> {
31709 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31710 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31711 }
31712}
31713impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
31714 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
31715 type StablePtr = TokenColonPtr<'db>;
31716 type Green = TokenColonGreen<'db>;
31717 fn missing(db: &'db dyn Database) -> Self::Green {
31718 TokenColonGreen(
31719 GreenNode {
31720 kind: SyntaxKind::TokenMissing,
31721 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31722 }
31723 .intern(db),
31724 )
31725 }
31726 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31727 match node.green_node(db).details {
31728 GreenNodeDetails::Token(_) => Self { node },
31729 GreenNodeDetails::Node { .. } => {
31730 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
31731 }
31732 }
31733 }
31734 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31735 match node.green_node(db).details {
31736 GreenNodeDetails::Token(_) => Some(Self { node }),
31737 GreenNodeDetails::Node { .. } => None,
31738 }
31739 }
31740 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31741 self.node
31742 }
31743 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31744 TokenColonPtr(self.node.stable_ptr(db))
31745 }
31746}
31747#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31748pub struct TerminalColon<'db> {
31749 node: SyntaxNode<'db>,
31750}
31751impl<'db> Terminal<'db> for TerminalColon<'db> {
31752 const KIND: SyntaxKind = SyntaxKind::TerminalColon;
31753 type TokenType = TokenColon<'db>;
31754 fn new_green(
31755 db: &'db dyn Database,
31756 leading_trivia: TriviaGreen<'db>,
31757 token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31758 trailing_trivia: TriviaGreen<'db>,
31759 ) -> Self::Green {
31760 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31761 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31762 TerminalColonGreen(
31763 GreenNode {
31764 kind: SyntaxKind::TerminalColon,
31765 details: GreenNodeDetails::Node { children: children.into(), width },
31766 }
31767 .intern(db),
31768 )
31769 }
31770 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31771 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31772 unreachable!("Expected a node, not a token");
31773 };
31774 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31775 }
31776}
31777impl<'db> TerminalColon<'db> {
31778 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31779 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31780 }
31781 pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
31782 TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
31783 }
31784 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31785 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31786 }
31787}
31788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31789pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31790impl<'db> TerminalColonPtr<'db> {}
31791impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
31792 type SyntaxNode = TerminalColon<'db>;
31793 fn untyped(self) -> SyntaxStablePtrId<'db> {
31794 self.0
31795 }
31796 fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
31797 TerminalColon::from_syntax_node(db, self.0.lookup(db))
31798 }
31799}
31800impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
31801 fn from(ptr: TerminalColonPtr<'db>) -> Self {
31802 ptr.untyped()
31803 }
31804}
31805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31806pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
31807impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
31808 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
31809 type StablePtr = TerminalColonPtr<'db>;
31810 type Green = TerminalColonGreen<'db>;
31811 fn missing(db: &'db dyn Database) -> Self::Green {
31812 TerminalColonGreen(
31813 GreenNode {
31814 kind: SyntaxKind::TerminalColon,
31815 details: GreenNodeDetails::Node {
31816 children: [
31817 Trivia::missing(db).0,
31818 TokenColon::missing(db).0,
31819 Trivia::missing(db).0,
31820 ]
31821 .into(),
31822 width: TextWidth::default(),
31823 },
31824 }
31825 .intern(db),
31826 )
31827 }
31828 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31829 let kind = node.kind(db);
31830 assert_eq!(
31831 kind,
31832 SyntaxKind::TerminalColon,
31833 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31834 kind,
31835 SyntaxKind::TerminalColon
31836 );
31837 Self { node }
31838 }
31839 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31840 let kind = node.kind(db);
31841 if kind == SyntaxKind::TerminalColon {
31842 Some(Self::from_syntax_node(db, node))
31843 } else {
31844 None
31845 }
31846 }
31847 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31848 self.node
31849 }
31850 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31851 TerminalColonPtr(self.node.stable_ptr(db))
31852 }
31853}
31854#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31855pub struct TokenColonColon<'db> {
31856 node: SyntaxNode<'db>,
31857}
31858impl<'db> Token<'db> for TokenColonColon<'db> {
31859 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31860 TokenColonColonGreen(
31861 GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
31862 .intern(db),
31863 )
31864 }
31865 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31866 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31867 }
31868}
31869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31870pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31871impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
31872 type SyntaxNode = TokenColonColon<'db>;
31873 fn untyped(self) -> SyntaxStablePtrId<'db> {
31874 self.0
31875 }
31876 fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
31877 TokenColonColon::from_syntax_node(db, self.0.lookup(db))
31878 }
31879}
31880impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
31881 fn from(ptr: TokenColonColonPtr<'db>) -> Self {
31882 ptr.untyped()
31883 }
31884}
31885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31886pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
31887impl<'db> TokenColonColonGreen<'db> {
31888 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31889 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31890 }
31891}
31892impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
31893 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
31894 type StablePtr = TokenColonColonPtr<'db>;
31895 type Green = TokenColonColonGreen<'db>;
31896 fn missing(db: &'db dyn Database) -> Self::Green {
31897 TokenColonColonGreen(
31898 GreenNode {
31899 kind: SyntaxKind::TokenMissing,
31900 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31901 }
31902 .intern(db),
31903 )
31904 }
31905 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31906 match node.green_node(db).details {
31907 GreenNodeDetails::Token(_) => Self { node },
31908 GreenNodeDetails::Node { .. } => {
31909 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
31910 }
31911 }
31912 }
31913 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31914 match node.green_node(db).details {
31915 GreenNodeDetails::Token(_) => Some(Self { node }),
31916 GreenNodeDetails::Node { .. } => None,
31917 }
31918 }
31919 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31920 self.node
31921 }
31922 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31923 TokenColonColonPtr(self.node.stable_ptr(db))
31924 }
31925}
31926#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31927pub struct TerminalColonColon<'db> {
31928 node: SyntaxNode<'db>,
31929}
31930impl<'db> Terminal<'db> for TerminalColonColon<'db> {
31931 const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
31932 type TokenType = TokenColonColon<'db>;
31933 fn new_green(
31934 db: &'db dyn Database,
31935 leading_trivia: TriviaGreen<'db>,
31936 token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31937 trailing_trivia: TriviaGreen<'db>,
31938 ) -> Self::Green {
31939 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31940 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31941 TerminalColonColonGreen(
31942 GreenNode {
31943 kind: SyntaxKind::TerminalColonColon,
31944 details: GreenNodeDetails::Node { children: children.into(), width },
31945 }
31946 .intern(db),
31947 )
31948 }
31949 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31950 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31951 unreachable!("Expected a node, not a token");
31952 };
31953 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31954 }
31955}
31956impl<'db> TerminalColonColon<'db> {
31957 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31958 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31959 }
31960 pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
31961 TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
31962 }
31963 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31964 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31965 }
31966}
31967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31968pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31969impl<'db> TerminalColonColonPtr<'db> {}
31970impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
31971 type SyntaxNode = TerminalColonColon<'db>;
31972 fn untyped(self) -> SyntaxStablePtrId<'db> {
31973 self.0
31974 }
31975 fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
31976 TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
31977 }
31978}
31979impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
31980 fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
31981 ptr.untyped()
31982 }
31983}
31984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31985pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
31986impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
31987 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
31988 type StablePtr = TerminalColonColonPtr<'db>;
31989 type Green = TerminalColonColonGreen<'db>;
31990 fn missing(db: &'db dyn Database) -> Self::Green {
31991 TerminalColonColonGreen(
31992 GreenNode {
31993 kind: SyntaxKind::TerminalColonColon,
31994 details: GreenNodeDetails::Node {
31995 children: [
31996 Trivia::missing(db).0,
31997 TokenColonColon::missing(db).0,
31998 Trivia::missing(db).0,
31999 ]
32000 .into(),
32001 width: TextWidth::default(),
32002 },
32003 }
32004 .intern(db),
32005 )
32006 }
32007 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32008 let kind = node.kind(db);
32009 assert_eq!(
32010 kind,
32011 SyntaxKind::TerminalColonColon,
32012 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32013 kind,
32014 SyntaxKind::TerminalColonColon
32015 );
32016 Self { node }
32017 }
32018 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32019 let kind = node.kind(db);
32020 if kind == SyntaxKind::TerminalColonColon {
32021 Some(Self::from_syntax_node(db, node))
32022 } else {
32023 None
32024 }
32025 }
32026 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32027 self.node
32028 }
32029 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32030 TerminalColonColonPtr(self.node.stable_ptr(db))
32031 }
32032}
32033#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32034pub struct TokenComma<'db> {
32035 node: SyntaxNode<'db>,
32036}
32037impl<'db> Token<'db> for TokenComma<'db> {
32038 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32039 TokenCommaGreen(
32040 GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32041 .intern(db),
32042 )
32043 }
32044 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32045 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32046 }
32047}
32048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32049pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32050impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32051 type SyntaxNode = TokenComma<'db>;
32052 fn untyped(self) -> SyntaxStablePtrId<'db> {
32053 self.0
32054 }
32055 fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32056 TokenComma::from_syntax_node(db, self.0.lookup(db))
32057 }
32058}
32059impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32060 fn from(ptr: TokenCommaPtr<'db>) -> Self {
32061 ptr.untyped()
32062 }
32063}
32064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32065pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32066impl<'db> TokenCommaGreen<'db> {
32067 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32068 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32069 }
32070}
32071impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32072 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32073 type StablePtr = TokenCommaPtr<'db>;
32074 type Green = TokenCommaGreen<'db>;
32075 fn missing(db: &'db dyn Database) -> Self::Green {
32076 TokenCommaGreen(
32077 GreenNode {
32078 kind: SyntaxKind::TokenMissing,
32079 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32080 }
32081 .intern(db),
32082 )
32083 }
32084 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32085 match node.green_node(db).details {
32086 GreenNodeDetails::Token(_) => Self { node },
32087 GreenNodeDetails::Node { .. } => {
32088 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32089 }
32090 }
32091 }
32092 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32093 match node.green_node(db).details {
32094 GreenNodeDetails::Token(_) => Some(Self { node }),
32095 GreenNodeDetails::Node { .. } => None,
32096 }
32097 }
32098 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32099 self.node
32100 }
32101 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32102 TokenCommaPtr(self.node.stable_ptr(db))
32103 }
32104}
32105#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32106pub struct TerminalComma<'db> {
32107 node: SyntaxNode<'db>,
32108}
32109impl<'db> Terminal<'db> for TerminalComma<'db> {
32110 const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32111 type TokenType = TokenComma<'db>;
32112 fn new_green(
32113 db: &'db dyn Database,
32114 leading_trivia: TriviaGreen<'db>,
32115 token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32116 trailing_trivia: TriviaGreen<'db>,
32117 ) -> Self::Green {
32118 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32119 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32120 TerminalCommaGreen(
32121 GreenNode {
32122 kind: SyntaxKind::TerminalComma,
32123 details: GreenNodeDetails::Node { children: children.into(), width },
32124 }
32125 .intern(db),
32126 )
32127 }
32128 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32129 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32130 unreachable!("Expected a node, not a token");
32131 };
32132 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32133 }
32134}
32135impl<'db> TerminalComma<'db> {
32136 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32137 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32138 }
32139 pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32140 TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32141 }
32142 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32143 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32144 }
32145}
32146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32147pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32148impl<'db> TerminalCommaPtr<'db> {}
32149impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32150 type SyntaxNode = TerminalComma<'db>;
32151 fn untyped(self) -> SyntaxStablePtrId<'db> {
32152 self.0
32153 }
32154 fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32155 TerminalComma::from_syntax_node(db, self.0.lookup(db))
32156 }
32157}
32158impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32159 fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32160 ptr.untyped()
32161 }
32162}
32163#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32164pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32165impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32166 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32167 type StablePtr = TerminalCommaPtr<'db>;
32168 type Green = TerminalCommaGreen<'db>;
32169 fn missing(db: &'db dyn Database) -> Self::Green {
32170 TerminalCommaGreen(
32171 GreenNode {
32172 kind: SyntaxKind::TerminalComma,
32173 details: GreenNodeDetails::Node {
32174 children: [
32175 Trivia::missing(db).0,
32176 TokenComma::missing(db).0,
32177 Trivia::missing(db).0,
32178 ]
32179 .into(),
32180 width: TextWidth::default(),
32181 },
32182 }
32183 .intern(db),
32184 )
32185 }
32186 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32187 let kind = node.kind(db);
32188 assert_eq!(
32189 kind,
32190 SyntaxKind::TerminalComma,
32191 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32192 kind,
32193 SyntaxKind::TerminalComma
32194 );
32195 Self { node }
32196 }
32197 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32198 let kind = node.kind(db);
32199 if kind == SyntaxKind::TerminalComma {
32200 Some(Self::from_syntax_node(db, node))
32201 } else {
32202 None
32203 }
32204 }
32205 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32206 self.node
32207 }
32208 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32209 TerminalCommaPtr(self.node.stable_ptr(db))
32210 }
32211}
32212#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32213pub struct TokenDiv<'db> {
32214 node: SyntaxNode<'db>,
32215}
32216impl<'db> Token<'db> for TokenDiv<'db> {
32217 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32218 TokenDivGreen(
32219 GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32220 .intern(db),
32221 )
32222 }
32223 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32224 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32225 }
32226}
32227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32228pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32229impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32230 type SyntaxNode = TokenDiv<'db>;
32231 fn untyped(self) -> SyntaxStablePtrId<'db> {
32232 self.0
32233 }
32234 fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32235 TokenDiv::from_syntax_node(db, self.0.lookup(db))
32236 }
32237}
32238impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32239 fn from(ptr: TokenDivPtr<'db>) -> Self {
32240 ptr.untyped()
32241 }
32242}
32243#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32244pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32245impl<'db> TokenDivGreen<'db> {
32246 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32247 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32248 }
32249}
32250impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32251 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32252 type StablePtr = TokenDivPtr<'db>;
32253 type Green = TokenDivGreen<'db>;
32254 fn missing(db: &'db dyn Database) -> Self::Green {
32255 TokenDivGreen(
32256 GreenNode {
32257 kind: SyntaxKind::TokenMissing,
32258 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32259 }
32260 .intern(db),
32261 )
32262 }
32263 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32264 match node.green_node(db).details {
32265 GreenNodeDetails::Token(_) => Self { node },
32266 GreenNodeDetails::Node { .. } => {
32267 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32268 }
32269 }
32270 }
32271 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32272 match node.green_node(db).details {
32273 GreenNodeDetails::Token(_) => Some(Self { node }),
32274 GreenNodeDetails::Node { .. } => None,
32275 }
32276 }
32277 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32278 self.node
32279 }
32280 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32281 TokenDivPtr(self.node.stable_ptr(db))
32282 }
32283}
32284#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32285pub struct TerminalDiv<'db> {
32286 node: SyntaxNode<'db>,
32287}
32288impl<'db> Terminal<'db> for TerminalDiv<'db> {
32289 const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32290 type TokenType = TokenDiv<'db>;
32291 fn new_green(
32292 db: &'db dyn Database,
32293 leading_trivia: TriviaGreen<'db>,
32294 token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32295 trailing_trivia: TriviaGreen<'db>,
32296 ) -> Self::Green {
32297 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32298 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32299 TerminalDivGreen(
32300 GreenNode {
32301 kind: SyntaxKind::TerminalDiv,
32302 details: GreenNodeDetails::Node { children: children.into(), width },
32303 }
32304 .intern(db),
32305 )
32306 }
32307 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32308 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32309 unreachable!("Expected a node, not a token");
32310 };
32311 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32312 }
32313}
32314impl<'db> TerminalDiv<'db> {
32315 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32316 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32317 }
32318 pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32319 TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32320 }
32321 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32322 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32323 }
32324}
32325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32326pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32327impl<'db> TerminalDivPtr<'db> {}
32328impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32329 type SyntaxNode = TerminalDiv<'db>;
32330 fn untyped(self) -> SyntaxStablePtrId<'db> {
32331 self.0
32332 }
32333 fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32334 TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32335 }
32336}
32337impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32338 fn from(ptr: TerminalDivPtr<'db>) -> Self {
32339 ptr.untyped()
32340 }
32341}
32342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32343pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32344impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32345 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32346 type StablePtr = TerminalDivPtr<'db>;
32347 type Green = TerminalDivGreen<'db>;
32348 fn missing(db: &'db dyn Database) -> Self::Green {
32349 TerminalDivGreen(
32350 GreenNode {
32351 kind: SyntaxKind::TerminalDiv,
32352 details: GreenNodeDetails::Node {
32353 children: [
32354 Trivia::missing(db).0,
32355 TokenDiv::missing(db).0,
32356 Trivia::missing(db).0,
32357 ]
32358 .into(),
32359 width: TextWidth::default(),
32360 },
32361 }
32362 .intern(db),
32363 )
32364 }
32365 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32366 let kind = node.kind(db);
32367 assert_eq!(
32368 kind,
32369 SyntaxKind::TerminalDiv,
32370 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32371 kind,
32372 SyntaxKind::TerminalDiv
32373 );
32374 Self { node }
32375 }
32376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32377 let kind = node.kind(db);
32378 if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32379 }
32380 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32381 self.node
32382 }
32383 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32384 TerminalDivPtr(self.node.stable_ptr(db))
32385 }
32386}
32387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32388pub struct TokenDivEq<'db> {
32389 node: SyntaxNode<'db>,
32390}
32391impl<'db> Token<'db> for TokenDivEq<'db> {
32392 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32393 TokenDivEqGreen(
32394 GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32395 .intern(db),
32396 )
32397 }
32398 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32399 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32400 }
32401}
32402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32403pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32404impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32405 type SyntaxNode = TokenDivEq<'db>;
32406 fn untyped(self) -> SyntaxStablePtrId<'db> {
32407 self.0
32408 }
32409 fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32410 TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32411 }
32412}
32413impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32414 fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32415 ptr.untyped()
32416 }
32417}
32418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32419pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32420impl<'db> TokenDivEqGreen<'db> {
32421 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32422 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32423 }
32424}
32425impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32426 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32427 type StablePtr = TokenDivEqPtr<'db>;
32428 type Green = TokenDivEqGreen<'db>;
32429 fn missing(db: &'db dyn Database) -> Self::Green {
32430 TokenDivEqGreen(
32431 GreenNode {
32432 kind: SyntaxKind::TokenMissing,
32433 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32434 }
32435 .intern(db),
32436 )
32437 }
32438 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32439 match node.green_node(db).details {
32440 GreenNodeDetails::Token(_) => Self { node },
32441 GreenNodeDetails::Node { .. } => {
32442 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32443 }
32444 }
32445 }
32446 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32447 match node.green_node(db).details {
32448 GreenNodeDetails::Token(_) => Some(Self { node }),
32449 GreenNodeDetails::Node { .. } => None,
32450 }
32451 }
32452 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32453 self.node
32454 }
32455 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32456 TokenDivEqPtr(self.node.stable_ptr(db))
32457 }
32458}
32459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32460pub struct TerminalDivEq<'db> {
32461 node: SyntaxNode<'db>,
32462}
32463impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32464 const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32465 type TokenType = TokenDivEq<'db>;
32466 fn new_green(
32467 db: &'db dyn Database,
32468 leading_trivia: TriviaGreen<'db>,
32469 token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32470 trailing_trivia: TriviaGreen<'db>,
32471 ) -> Self::Green {
32472 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32473 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32474 TerminalDivEqGreen(
32475 GreenNode {
32476 kind: SyntaxKind::TerminalDivEq,
32477 details: GreenNodeDetails::Node { children: children.into(), width },
32478 }
32479 .intern(db),
32480 )
32481 }
32482 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32483 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32484 unreachable!("Expected a node, not a token");
32485 };
32486 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32487 }
32488}
32489impl<'db> TerminalDivEq<'db> {
32490 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32491 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32492 }
32493 pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32494 TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32495 }
32496 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32497 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32498 }
32499}
32500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32501pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32502impl<'db> TerminalDivEqPtr<'db> {}
32503impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32504 type SyntaxNode = TerminalDivEq<'db>;
32505 fn untyped(self) -> SyntaxStablePtrId<'db> {
32506 self.0
32507 }
32508 fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32509 TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32510 }
32511}
32512impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32513 fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32514 ptr.untyped()
32515 }
32516}
32517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32518pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32519impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32520 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32521 type StablePtr = TerminalDivEqPtr<'db>;
32522 type Green = TerminalDivEqGreen<'db>;
32523 fn missing(db: &'db dyn Database) -> Self::Green {
32524 TerminalDivEqGreen(
32525 GreenNode {
32526 kind: SyntaxKind::TerminalDivEq,
32527 details: GreenNodeDetails::Node {
32528 children: [
32529 Trivia::missing(db).0,
32530 TokenDivEq::missing(db).0,
32531 Trivia::missing(db).0,
32532 ]
32533 .into(),
32534 width: TextWidth::default(),
32535 },
32536 }
32537 .intern(db),
32538 )
32539 }
32540 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32541 let kind = node.kind(db);
32542 assert_eq!(
32543 kind,
32544 SyntaxKind::TerminalDivEq,
32545 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32546 kind,
32547 SyntaxKind::TerminalDivEq
32548 );
32549 Self { node }
32550 }
32551 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32552 let kind = node.kind(db);
32553 if kind == SyntaxKind::TerminalDivEq {
32554 Some(Self::from_syntax_node(db, node))
32555 } else {
32556 None
32557 }
32558 }
32559 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32560 self.node
32561 }
32562 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32563 TerminalDivEqPtr(self.node.stable_ptr(db))
32564 }
32565}
32566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32567pub struct TokenDollar<'db> {
32568 node: SyntaxNode<'db>,
32569}
32570impl<'db> Token<'db> for TokenDollar<'db> {
32571 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32572 TokenDollarGreen(
32573 GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
32574 .intern(db),
32575 )
32576 }
32577 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32578 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32579 }
32580}
32581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32582pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32583impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
32584 type SyntaxNode = TokenDollar<'db>;
32585 fn untyped(self) -> SyntaxStablePtrId<'db> {
32586 self.0
32587 }
32588 fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32589 TokenDollar::from_syntax_node(db, self.0.lookup(db))
32590 }
32591}
32592impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32593 fn from(ptr: TokenDollarPtr<'db>) -> Self {
32594 ptr.untyped()
32595 }
32596}
32597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32598pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
32599impl<'db> TokenDollarGreen<'db> {
32600 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32601 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32602 }
32603}
32604impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
32605 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
32606 type StablePtr = TokenDollarPtr<'db>;
32607 type Green = TokenDollarGreen<'db>;
32608 fn missing(db: &'db dyn Database) -> Self::Green {
32609 TokenDollarGreen(
32610 GreenNode {
32611 kind: SyntaxKind::TokenMissing,
32612 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32613 }
32614 .intern(db),
32615 )
32616 }
32617 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32618 match node.green_node(db).details {
32619 GreenNodeDetails::Token(_) => Self { node },
32620 GreenNodeDetails::Node { .. } => {
32621 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
32622 }
32623 }
32624 }
32625 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32626 match node.green_node(db).details {
32627 GreenNodeDetails::Token(_) => Some(Self { node }),
32628 GreenNodeDetails::Node { .. } => None,
32629 }
32630 }
32631 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32632 self.node
32633 }
32634 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32635 TokenDollarPtr(self.node.stable_ptr(db))
32636 }
32637}
32638#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32639pub struct TerminalDollar<'db> {
32640 node: SyntaxNode<'db>,
32641}
32642impl<'db> Terminal<'db> for TerminalDollar<'db> {
32643 const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
32644 type TokenType = TokenDollar<'db>;
32645 fn new_green(
32646 db: &'db dyn Database,
32647 leading_trivia: TriviaGreen<'db>,
32648 token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32649 trailing_trivia: TriviaGreen<'db>,
32650 ) -> Self::Green {
32651 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32652 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32653 TerminalDollarGreen(
32654 GreenNode {
32655 kind: SyntaxKind::TerminalDollar,
32656 details: GreenNodeDetails::Node { children: children.into(), width },
32657 }
32658 .intern(db),
32659 )
32660 }
32661 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32662 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32663 unreachable!("Expected a node, not a token");
32664 };
32665 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32666 }
32667}
32668impl<'db> TerminalDollar<'db> {
32669 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32670 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32671 }
32672 pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32673 TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
32674 }
32675 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32676 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32677 }
32678}
32679#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32680pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32681impl<'db> TerminalDollarPtr<'db> {}
32682impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
32683 type SyntaxNode = TerminalDollar<'db>;
32684 fn untyped(self) -> SyntaxStablePtrId<'db> {
32685 self.0
32686 }
32687 fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
32688 TerminalDollar::from_syntax_node(db, self.0.lookup(db))
32689 }
32690}
32691impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32692 fn from(ptr: TerminalDollarPtr<'db>) -> Self {
32693 ptr.untyped()
32694 }
32695}
32696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32697pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
32698impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
32699 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
32700 type StablePtr = TerminalDollarPtr<'db>;
32701 type Green = TerminalDollarGreen<'db>;
32702 fn missing(db: &'db dyn Database) -> Self::Green {
32703 TerminalDollarGreen(
32704 GreenNode {
32705 kind: SyntaxKind::TerminalDollar,
32706 details: GreenNodeDetails::Node {
32707 children: [
32708 Trivia::missing(db).0,
32709 TokenDollar::missing(db).0,
32710 Trivia::missing(db).0,
32711 ]
32712 .into(),
32713 width: TextWidth::default(),
32714 },
32715 }
32716 .intern(db),
32717 )
32718 }
32719 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32720 let kind = node.kind(db);
32721 assert_eq!(
32722 kind,
32723 SyntaxKind::TerminalDollar,
32724 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32725 kind,
32726 SyntaxKind::TerminalDollar
32727 );
32728 Self { node }
32729 }
32730 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32731 let kind = node.kind(db);
32732 if kind == SyntaxKind::TerminalDollar {
32733 Some(Self::from_syntax_node(db, node))
32734 } else {
32735 None
32736 }
32737 }
32738 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32739 self.node
32740 }
32741 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32742 TerminalDollarPtr(self.node.stable_ptr(db))
32743 }
32744}
32745#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32746pub struct TokenDot<'db> {
32747 node: SyntaxNode<'db>,
32748}
32749impl<'db> Token<'db> for TokenDot<'db> {
32750 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32751 TokenDotGreen(
32752 GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
32753 .intern(db),
32754 )
32755 }
32756 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32757 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32758 }
32759}
32760#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32761pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32762impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
32763 type SyntaxNode = TokenDot<'db>;
32764 fn untyped(self) -> SyntaxStablePtrId<'db> {
32765 self.0
32766 }
32767 fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
32768 TokenDot::from_syntax_node(db, self.0.lookup(db))
32769 }
32770}
32771impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
32772 fn from(ptr: TokenDotPtr<'db>) -> Self {
32773 ptr.untyped()
32774 }
32775}
32776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32777pub struct TokenDotGreen<'db>(pub GreenId<'db>);
32778impl<'db> TokenDotGreen<'db> {
32779 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32780 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32781 }
32782}
32783impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
32784 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
32785 type StablePtr = TokenDotPtr<'db>;
32786 type Green = TokenDotGreen<'db>;
32787 fn missing(db: &'db dyn Database) -> Self::Green {
32788 TokenDotGreen(
32789 GreenNode {
32790 kind: SyntaxKind::TokenMissing,
32791 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32792 }
32793 .intern(db),
32794 )
32795 }
32796 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32797 match node.green_node(db).details {
32798 GreenNodeDetails::Token(_) => Self { node },
32799 GreenNodeDetails::Node { .. } => {
32800 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
32801 }
32802 }
32803 }
32804 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32805 match node.green_node(db).details {
32806 GreenNodeDetails::Token(_) => Some(Self { node }),
32807 GreenNodeDetails::Node { .. } => None,
32808 }
32809 }
32810 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32811 self.node
32812 }
32813 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32814 TokenDotPtr(self.node.stable_ptr(db))
32815 }
32816}
32817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32818pub struct TerminalDot<'db> {
32819 node: SyntaxNode<'db>,
32820}
32821impl<'db> Terminal<'db> for TerminalDot<'db> {
32822 const KIND: SyntaxKind = SyntaxKind::TerminalDot;
32823 type TokenType = TokenDot<'db>;
32824 fn new_green(
32825 db: &'db dyn Database,
32826 leading_trivia: TriviaGreen<'db>,
32827 token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32828 trailing_trivia: TriviaGreen<'db>,
32829 ) -> Self::Green {
32830 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32831 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32832 TerminalDotGreen(
32833 GreenNode {
32834 kind: SyntaxKind::TerminalDot,
32835 details: GreenNodeDetails::Node { children: children.into(), width },
32836 }
32837 .intern(db),
32838 )
32839 }
32840 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32841 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32842 unreachable!("Expected a node, not a token");
32843 };
32844 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32845 }
32846}
32847impl<'db> TerminalDot<'db> {
32848 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32849 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32850 }
32851 pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
32852 TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
32853 }
32854 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32855 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32856 }
32857}
32858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32859pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32860impl<'db> TerminalDotPtr<'db> {}
32861impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
32862 type SyntaxNode = TerminalDot<'db>;
32863 fn untyped(self) -> SyntaxStablePtrId<'db> {
32864 self.0
32865 }
32866 fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
32867 TerminalDot::from_syntax_node(db, self.0.lookup(db))
32868 }
32869}
32870impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
32871 fn from(ptr: TerminalDotPtr<'db>) -> Self {
32872 ptr.untyped()
32873 }
32874}
32875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32876pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
32877impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
32878 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
32879 type StablePtr = TerminalDotPtr<'db>;
32880 type Green = TerminalDotGreen<'db>;
32881 fn missing(db: &'db dyn Database) -> Self::Green {
32882 TerminalDotGreen(
32883 GreenNode {
32884 kind: SyntaxKind::TerminalDot,
32885 details: GreenNodeDetails::Node {
32886 children: [
32887 Trivia::missing(db).0,
32888 TokenDot::missing(db).0,
32889 Trivia::missing(db).0,
32890 ]
32891 .into(),
32892 width: TextWidth::default(),
32893 },
32894 }
32895 .intern(db),
32896 )
32897 }
32898 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32899 let kind = node.kind(db);
32900 assert_eq!(
32901 kind,
32902 SyntaxKind::TerminalDot,
32903 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32904 kind,
32905 SyntaxKind::TerminalDot
32906 );
32907 Self { node }
32908 }
32909 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32910 let kind = node.kind(db);
32911 if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
32912 }
32913 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32914 self.node
32915 }
32916 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32917 TerminalDotPtr(self.node.stable_ptr(db))
32918 }
32919}
32920#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32921pub struct TokenDotDot<'db> {
32922 node: SyntaxNode<'db>,
32923}
32924impl<'db> Token<'db> for TokenDotDot<'db> {
32925 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32926 TokenDotDotGreen(
32927 GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
32928 .intern(db),
32929 )
32930 }
32931 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32932 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32933 }
32934}
32935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32936pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32937impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
32938 type SyntaxNode = TokenDotDot<'db>;
32939 fn untyped(self) -> SyntaxStablePtrId<'db> {
32940 self.0
32941 }
32942 fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
32943 TokenDotDot::from_syntax_node(db, self.0.lookup(db))
32944 }
32945}
32946impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
32947 fn from(ptr: TokenDotDotPtr<'db>) -> Self {
32948 ptr.untyped()
32949 }
32950}
32951#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32952pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
32953impl<'db> TokenDotDotGreen<'db> {
32954 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32955 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32956 }
32957}
32958impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
32959 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
32960 type StablePtr = TokenDotDotPtr<'db>;
32961 type Green = TokenDotDotGreen<'db>;
32962 fn missing(db: &'db dyn Database) -> Self::Green {
32963 TokenDotDotGreen(
32964 GreenNode {
32965 kind: SyntaxKind::TokenMissing,
32966 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32967 }
32968 .intern(db),
32969 )
32970 }
32971 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32972 match node.green_node(db).details {
32973 GreenNodeDetails::Token(_) => Self { node },
32974 GreenNodeDetails::Node { .. } => {
32975 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
32976 }
32977 }
32978 }
32979 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32980 match node.green_node(db).details {
32981 GreenNodeDetails::Token(_) => Some(Self { node }),
32982 GreenNodeDetails::Node { .. } => None,
32983 }
32984 }
32985 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32986 self.node
32987 }
32988 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32989 TokenDotDotPtr(self.node.stable_ptr(db))
32990 }
32991}
32992#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32993pub struct TerminalDotDot<'db> {
32994 node: SyntaxNode<'db>,
32995}
32996impl<'db> Terminal<'db> for TerminalDotDot<'db> {
32997 const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
32998 type TokenType = TokenDotDot<'db>;
32999 fn new_green(
33000 db: &'db dyn Database,
33001 leading_trivia: TriviaGreen<'db>,
33002 token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33003 trailing_trivia: TriviaGreen<'db>,
33004 ) -> Self::Green {
33005 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33006 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33007 TerminalDotDotGreen(
33008 GreenNode {
33009 kind: SyntaxKind::TerminalDotDot,
33010 details: GreenNodeDetails::Node { children: children.into(), width },
33011 }
33012 .intern(db),
33013 )
33014 }
33015 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33016 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33017 unreachable!("Expected a node, not a token");
33018 };
33019 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33020 }
33021}
33022impl<'db> TerminalDotDot<'db> {
33023 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33024 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33025 }
33026 pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33027 TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33028 }
33029 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33030 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33031 }
33032}
33033#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33034pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33035impl<'db> TerminalDotDotPtr<'db> {}
33036impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33037 type SyntaxNode = TerminalDotDot<'db>;
33038 fn untyped(self) -> SyntaxStablePtrId<'db> {
33039 self.0
33040 }
33041 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33042 TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33043 }
33044}
33045impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33046 fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33047 ptr.untyped()
33048 }
33049}
33050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33051pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33052impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33053 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33054 type StablePtr = TerminalDotDotPtr<'db>;
33055 type Green = TerminalDotDotGreen<'db>;
33056 fn missing(db: &'db dyn Database) -> Self::Green {
33057 TerminalDotDotGreen(
33058 GreenNode {
33059 kind: SyntaxKind::TerminalDotDot,
33060 details: GreenNodeDetails::Node {
33061 children: [
33062 Trivia::missing(db).0,
33063 TokenDotDot::missing(db).0,
33064 Trivia::missing(db).0,
33065 ]
33066 .into(),
33067 width: TextWidth::default(),
33068 },
33069 }
33070 .intern(db),
33071 )
33072 }
33073 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33074 let kind = node.kind(db);
33075 assert_eq!(
33076 kind,
33077 SyntaxKind::TerminalDotDot,
33078 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33079 kind,
33080 SyntaxKind::TerminalDotDot
33081 );
33082 Self { node }
33083 }
33084 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33085 let kind = node.kind(db);
33086 if kind == SyntaxKind::TerminalDotDot {
33087 Some(Self::from_syntax_node(db, node))
33088 } else {
33089 None
33090 }
33091 }
33092 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33093 self.node
33094 }
33095 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33096 TerminalDotDotPtr(self.node.stable_ptr(db))
33097 }
33098}
33099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33100pub struct TokenDotDotEq<'db> {
33101 node: SyntaxNode<'db>,
33102}
33103impl<'db> Token<'db> for TokenDotDotEq<'db> {
33104 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33105 TokenDotDotEqGreen(
33106 GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33107 .intern(db),
33108 )
33109 }
33110 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33111 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33112 }
33113}
33114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33115pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33116impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33117 type SyntaxNode = TokenDotDotEq<'db>;
33118 fn untyped(self) -> SyntaxStablePtrId<'db> {
33119 self.0
33120 }
33121 fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33122 TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33123 }
33124}
33125impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33126 fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33127 ptr.untyped()
33128 }
33129}
33130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33131pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33132impl<'db> TokenDotDotEqGreen<'db> {
33133 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33134 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33135 }
33136}
33137impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33138 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33139 type StablePtr = TokenDotDotEqPtr<'db>;
33140 type Green = TokenDotDotEqGreen<'db>;
33141 fn missing(db: &'db dyn Database) -> Self::Green {
33142 TokenDotDotEqGreen(
33143 GreenNode {
33144 kind: SyntaxKind::TokenMissing,
33145 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33146 }
33147 .intern(db),
33148 )
33149 }
33150 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33151 match node.green_node(db).details {
33152 GreenNodeDetails::Token(_) => Self { node },
33153 GreenNodeDetails::Node { .. } => {
33154 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33155 }
33156 }
33157 }
33158 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33159 match node.green_node(db).details {
33160 GreenNodeDetails::Token(_) => Some(Self { node }),
33161 GreenNodeDetails::Node { .. } => None,
33162 }
33163 }
33164 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33165 self.node
33166 }
33167 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33168 TokenDotDotEqPtr(self.node.stable_ptr(db))
33169 }
33170}
33171#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33172pub struct TerminalDotDotEq<'db> {
33173 node: SyntaxNode<'db>,
33174}
33175impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33176 const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33177 type TokenType = TokenDotDotEq<'db>;
33178 fn new_green(
33179 db: &'db dyn Database,
33180 leading_trivia: TriviaGreen<'db>,
33181 token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33182 trailing_trivia: TriviaGreen<'db>,
33183 ) -> Self::Green {
33184 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33185 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33186 TerminalDotDotEqGreen(
33187 GreenNode {
33188 kind: SyntaxKind::TerminalDotDotEq,
33189 details: GreenNodeDetails::Node { children: children.into(), width },
33190 }
33191 .intern(db),
33192 )
33193 }
33194 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33195 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33196 unreachable!("Expected a node, not a token");
33197 };
33198 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33199 }
33200}
33201impl<'db> TerminalDotDotEq<'db> {
33202 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33203 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33204 }
33205 pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33206 TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33207 }
33208 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33209 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33210 }
33211}
33212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33213pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33214impl<'db> TerminalDotDotEqPtr<'db> {}
33215impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33216 type SyntaxNode = TerminalDotDotEq<'db>;
33217 fn untyped(self) -> SyntaxStablePtrId<'db> {
33218 self.0
33219 }
33220 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33221 TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33222 }
33223}
33224impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33225 fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33226 ptr.untyped()
33227 }
33228}
33229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33230pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33231impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33232 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33233 type StablePtr = TerminalDotDotEqPtr<'db>;
33234 type Green = TerminalDotDotEqGreen<'db>;
33235 fn missing(db: &'db dyn Database) -> Self::Green {
33236 TerminalDotDotEqGreen(
33237 GreenNode {
33238 kind: SyntaxKind::TerminalDotDotEq,
33239 details: GreenNodeDetails::Node {
33240 children: [
33241 Trivia::missing(db).0,
33242 TokenDotDotEq::missing(db).0,
33243 Trivia::missing(db).0,
33244 ]
33245 .into(),
33246 width: TextWidth::default(),
33247 },
33248 }
33249 .intern(db),
33250 )
33251 }
33252 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33253 let kind = node.kind(db);
33254 assert_eq!(
33255 kind,
33256 SyntaxKind::TerminalDotDotEq,
33257 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33258 kind,
33259 SyntaxKind::TerminalDotDotEq
33260 );
33261 Self { node }
33262 }
33263 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33264 let kind = node.kind(db);
33265 if kind == SyntaxKind::TerminalDotDotEq {
33266 Some(Self::from_syntax_node(db, node))
33267 } else {
33268 None
33269 }
33270 }
33271 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33272 self.node
33273 }
33274 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33275 TerminalDotDotEqPtr(self.node.stable_ptr(db))
33276 }
33277}
33278#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33279pub struct TokenEndOfFile<'db> {
33280 node: SyntaxNode<'db>,
33281}
33282impl<'db> Token<'db> for TokenEndOfFile<'db> {
33283 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33284 TokenEndOfFileGreen(
33285 GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33286 .intern(db),
33287 )
33288 }
33289 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33290 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33291 }
33292}
33293#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33294pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33295impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33296 type SyntaxNode = TokenEndOfFile<'db>;
33297 fn untyped(self) -> SyntaxStablePtrId<'db> {
33298 self.0
33299 }
33300 fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33301 TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33302 }
33303}
33304impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33305 fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33306 ptr.untyped()
33307 }
33308}
33309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33310pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33311impl<'db> TokenEndOfFileGreen<'db> {
33312 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33313 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33314 }
33315}
33316impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33317 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33318 type StablePtr = TokenEndOfFilePtr<'db>;
33319 type Green = TokenEndOfFileGreen<'db>;
33320 fn missing(db: &'db dyn Database) -> Self::Green {
33321 TokenEndOfFileGreen(
33322 GreenNode {
33323 kind: SyntaxKind::TokenMissing,
33324 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33325 }
33326 .intern(db),
33327 )
33328 }
33329 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33330 match node.green_node(db).details {
33331 GreenNodeDetails::Token(_) => Self { node },
33332 GreenNodeDetails::Node { .. } => {
33333 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33334 }
33335 }
33336 }
33337 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33338 match node.green_node(db).details {
33339 GreenNodeDetails::Token(_) => Some(Self { node }),
33340 GreenNodeDetails::Node { .. } => None,
33341 }
33342 }
33343 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33344 self.node
33345 }
33346 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33347 TokenEndOfFilePtr(self.node.stable_ptr(db))
33348 }
33349}
33350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33351pub struct TerminalEndOfFile<'db> {
33352 node: SyntaxNode<'db>,
33353}
33354impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33355 const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33356 type TokenType = TokenEndOfFile<'db>;
33357 fn new_green(
33358 db: &'db dyn Database,
33359 leading_trivia: TriviaGreen<'db>,
33360 token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33361 trailing_trivia: TriviaGreen<'db>,
33362 ) -> Self::Green {
33363 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33364 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33365 TerminalEndOfFileGreen(
33366 GreenNode {
33367 kind: SyntaxKind::TerminalEndOfFile,
33368 details: GreenNodeDetails::Node { children: children.into(), width },
33369 }
33370 .intern(db),
33371 )
33372 }
33373 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33374 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33375 unreachable!("Expected a node, not a token");
33376 };
33377 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33378 }
33379}
33380impl<'db> TerminalEndOfFile<'db> {
33381 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33382 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33383 }
33384 pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33385 TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33386 }
33387 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33388 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33389 }
33390}
33391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33392pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33393impl<'db> TerminalEndOfFilePtr<'db> {}
33394impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33395 type SyntaxNode = TerminalEndOfFile<'db>;
33396 fn untyped(self) -> SyntaxStablePtrId<'db> {
33397 self.0
33398 }
33399 fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33400 TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33401 }
33402}
33403impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33404 fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33405 ptr.untyped()
33406 }
33407}
33408#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33409pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33410impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33411 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33412 type StablePtr = TerminalEndOfFilePtr<'db>;
33413 type Green = TerminalEndOfFileGreen<'db>;
33414 fn missing(db: &'db dyn Database) -> Self::Green {
33415 TerminalEndOfFileGreen(
33416 GreenNode {
33417 kind: SyntaxKind::TerminalEndOfFile,
33418 details: GreenNodeDetails::Node {
33419 children: [
33420 Trivia::missing(db).0,
33421 TokenEndOfFile::missing(db).0,
33422 Trivia::missing(db).0,
33423 ]
33424 .into(),
33425 width: TextWidth::default(),
33426 },
33427 }
33428 .intern(db),
33429 )
33430 }
33431 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33432 let kind = node.kind(db);
33433 assert_eq!(
33434 kind,
33435 SyntaxKind::TerminalEndOfFile,
33436 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33437 kind,
33438 SyntaxKind::TerminalEndOfFile
33439 );
33440 Self { node }
33441 }
33442 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33443 let kind = node.kind(db);
33444 if kind == SyntaxKind::TerminalEndOfFile {
33445 Some(Self::from_syntax_node(db, node))
33446 } else {
33447 None
33448 }
33449 }
33450 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33451 self.node
33452 }
33453 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33454 TerminalEndOfFilePtr(self.node.stable_ptr(db))
33455 }
33456}
33457#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33458pub struct TokenEq<'db> {
33459 node: SyntaxNode<'db>,
33460}
33461impl<'db> Token<'db> for TokenEq<'db> {
33462 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33463 TokenEqGreen(
33464 GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33465 .intern(db),
33466 )
33467 }
33468 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33469 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33470 }
33471}
33472#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33473pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33474impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33475 type SyntaxNode = TokenEq<'db>;
33476 fn untyped(self) -> SyntaxStablePtrId<'db> {
33477 self.0
33478 }
33479 fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33480 TokenEq::from_syntax_node(db, self.0.lookup(db))
33481 }
33482}
33483impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33484 fn from(ptr: TokenEqPtr<'db>) -> Self {
33485 ptr.untyped()
33486 }
33487}
33488#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33489pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33490impl<'db> TokenEqGreen<'db> {
33491 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33492 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33493 }
33494}
33495impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33496 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33497 type StablePtr = TokenEqPtr<'db>;
33498 type Green = TokenEqGreen<'db>;
33499 fn missing(db: &'db dyn Database) -> Self::Green {
33500 TokenEqGreen(
33501 GreenNode {
33502 kind: SyntaxKind::TokenMissing,
33503 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33504 }
33505 .intern(db),
33506 )
33507 }
33508 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33509 match node.green_node(db).details {
33510 GreenNodeDetails::Token(_) => Self { node },
33511 GreenNodeDetails::Node { .. } => {
33512 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33513 }
33514 }
33515 }
33516 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33517 match node.green_node(db).details {
33518 GreenNodeDetails::Token(_) => Some(Self { node }),
33519 GreenNodeDetails::Node { .. } => None,
33520 }
33521 }
33522 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33523 self.node
33524 }
33525 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33526 TokenEqPtr(self.node.stable_ptr(db))
33527 }
33528}
33529#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33530pub struct TerminalEq<'db> {
33531 node: SyntaxNode<'db>,
33532}
33533impl<'db> Terminal<'db> for TerminalEq<'db> {
33534 const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33535 type TokenType = TokenEq<'db>;
33536 fn new_green(
33537 db: &'db dyn Database,
33538 leading_trivia: TriviaGreen<'db>,
33539 token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33540 trailing_trivia: TriviaGreen<'db>,
33541 ) -> Self::Green {
33542 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33543 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33544 TerminalEqGreen(
33545 GreenNode {
33546 kind: SyntaxKind::TerminalEq,
33547 details: GreenNodeDetails::Node { children: children.into(), width },
33548 }
33549 .intern(db),
33550 )
33551 }
33552 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33553 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33554 unreachable!("Expected a node, not a token");
33555 };
33556 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33557 }
33558}
33559impl<'db> TerminalEq<'db> {
33560 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33561 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33562 }
33563 pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
33564 TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
33565 }
33566 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33567 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33568 }
33569}
33570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33571pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33572impl<'db> TerminalEqPtr<'db> {}
33573impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
33574 type SyntaxNode = TerminalEq<'db>;
33575 fn untyped(self) -> SyntaxStablePtrId<'db> {
33576 self.0
33577 }
33578 fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
33579 TerminalEq::from_syntax_node(db, self.0.lookup(db))
33580 }
33581}
33582impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
33583 fn from(ptr: TerminalEqPtr<'db>) -> Self {
33584 ptr.untyped()
33585 }
33586}
33587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33588pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
33589impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
33590 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
33591 type StablePtr = TerminalEqPtr<'db>;
33592 type Green = TerminalEqGreen<'db>;
33593 fn missing(db: &'db dyn Database) -> Self::Green {
33594 TerminalEqGreen(
33595 GreenNode {
33596 kind: SyntaxKind::TerminalEq,
33597 details: GreenNodeDetails::Node {
33598 children: [
33599 Trivia::missing(db).0,
33600 TokenEq::missing(db).0,
33601 Trivia::missing(db).0,
33602 ]
33603 .into(),
33604 width: TextWidth::default(),
33605 },
33606 }
33607 .intern(db),
33608 )
33609 }
33610 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33611 let kind = node.kind(db);
33612 assert_eq!(
33613 kind,
33614 SyntaxKind::TerminalEq,
33615 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33616 kind,
33617 SyntaxKind::TerminalEq
33618 );
33619 Self { node }
33620 }
33621 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33622 let kind = node.kind(db);
33623 if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
33624 }
33625 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33626 self.node
33627 }
33628 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33629 TerminalEqPtr(self.node.stable_ptr(db))
33630 }
33631}
33632#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33633pub struct TokenEqEq<'db> {
33634 node: SyntaxNode<'db>,
33635}
33636impl<'db> Token<'db> for TokenEqEq<'db> {
33637 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33638 TokenEqEqGreen(
33639 GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
33640 .intern(db),
33641 )
33642 }
33643 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33644 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33645 }
33646}
33647#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33648pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33649impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
33650 type SyntaxNode = TokenEqEq<'db>;
33651 fn untyped(self) -> SyntaxStablePtrId<'db> {
33652 self.0
33653 }
33654 fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33655 TokenEqEq::from_syntax_node(db, self.0.lookup(db))
33656 }
33657}
33658impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33659 fn from(ptr: TokenEqEqPtr<'db>) -> Self {
33660 ptr.untyped()
33661 }
33662}
33663#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33664pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
33665impl<'db> TokenEqEqGreen<'db> {
33666 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33667 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33668 }
33669}
33670impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
33671 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
33672 type StablePtr = TokenEqEqPtr<'db>;
33673 type Green = TokenEqEqGreen<'db>;
33674 fn missing(db: &'db dyn Database) -> Self::Green {
33675 TokenEqEqGreen(
33676 GreenNode {
33677 kind: SyntaxKind::TokenMissing,
33678 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33679 }
33680 .intern(db),
33681 )
33682 }
33683 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33684 match node.green_node(db).details {
33685 GreenNodeDetails::Token(_) => Self { node },
33686 GreenNodeDetails::Node { .. } => {
33687 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
33688 }
33689 }
33690 }
33691 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33692 match node.green_node(db).details {
33693 GreenNodeDetails::Token(_) => Some(Self { node }),
33694 GreenNodeDetails::Node { .. } => None,
33695 }
33696 }
33697 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33698 self.node
33699 }
33700 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33701 TokenEqEqPtr(self.node.stable_ptr(db))
33702 }
33703}
33704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33705pub struct TerminalEqEq<'db> {
33706 node: SyntaxNode<'db>,
33707}
33708impl<'db> Terminal<'db> for TerminalEqEq<'db> {
33709 const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
33710 type TokenType = TokenEqEq<'db>;
33711 fn new_green(
33712 db: &'db dyn Database,
33713 leading_trivia: TriviaGreen<'db>,
33714 token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33715 trailing_trivia: TriviaGreen<'db>,
33716 ) -> Self::Green {
33717 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33718 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33719 TerminalEqEqGreen(
33720 GreenNode {
33721 kind: SyntaxKind::TerminalEqEq,
33722 details: GreenNodeDetails::Node { children: children.into(), width },
33723 }
33724 .intern(db),
33725 )
33726 }
33727 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33728 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33729 unreachable!("Expected a node, not a token");
33730 };
33731 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33732 }
33733}
33734impl<'db> TerminalEqEq<'db> {
33735 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33736 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33737 }
33738 pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33739 TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
33740 }
33741 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33742 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33743 }
33744}
33745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33746pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33747impl<'db> TerminalEqEqPtr<'db> {}
33748impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
33749 type SyntaxNode = TerminalEqEq<'db>;
33750 fn untyped(self) -> SyntaxStablePtrId<'db> {
33751 self.0
33752 }
33753 fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
33754 TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
33755 }
33756}
33757impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33758 fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
33759 ptr.untyped()
33760 }
33761}
33762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33763pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
33764impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
33765 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
33766 type StablePtr = TerminalEqEqPtr<'db>;
33767 type Green = TerminalEqEqGreen<'db>;
33768 fn missing(db: &'db dyn Database) -> Self::Green {
33769 TerminalEqEqGreen(
33770 GreenNode {
33771 kind: SyntaxKind::TerminalEqEq,
33772 details: GreenNodeDetails::Node {
33773 children: [
33774 Trivia::missing(db).0,
33775 TokenEqEq::missing(db).0,
33776 Trivia::missing(db).0,
33777 ]
33778 .into(),
33779 width: TextWidth::default(),
33780 },
33781 }
33782 .intern(db),
33783 )
33784 }
33785 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33786 let kind = node.kind(db);
33787 assert_eq!(
33788 kind,
33789 SyntaxKind::TerminalEqEq,
33790 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33791 kind,
33792 SyntaxKind::TerminalEqEq
33793 );
33794 Self { node }
33795 }
33796 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33797 let kind = node.kind(db);
33798 if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
33799 }
33800 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33801 self.node
33802 }
33803 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33804 TerminalEqEqPtr(self.node.stable_ptr(db))
33805 }
33806}
33807#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33808pub struct TokenGE<'db> {
33809 node: SyntaxNode<'db>,
33810}
33811impl<'db> Token<'db> for TokenGE<'db> {
33812 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33813 TokenGEGreen(
33814 GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
33815 .intern(db),
33816 )
33817 }
33818 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33819 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33820 }
33821}
33822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33823pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
33824impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
33825 type SyntaxNode = TokenGE<'db>;
33826 fn untyped(self) -> SyntaxStablePtrId<'db> {
33827 self.0
33828 }
33829 fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
33830 TokenGE::from_syntax_node(db, self.0.lookup(db))
33831 }
33832}
33833impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
33834 fn from(ptr: TokenGEPtr<'db>) -> Self {
33835 ptr.untyped()
33836 }
33837}
33838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33839pub struct TokenGEGreen<'db>(pub GreenId<'db>);
33840impl<'db> TokenGEGreen<'db> {
33841 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33842 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33843 }
33844}
33845impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
33846 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
33847 type StablePtr = TokenGEPtr<'db>;
33848 type Green = TokenGEGreen<'db>;
33849 fn missing(db: &'db dyn Database) -> Self::Green {
33850 TokenGEGreen(
33851 GreenNode {
33852 kind: SyntaxKind::TokenMissing,
33853 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33854 }
33855 .intern(db),
33856 )
33857 }
33858 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33859 match node.green_node(db).details {
33860 GreenNodeDetails::Token(_) => Self { node },
33861 GreenNodeDetails::Node { .. } => {
33862 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
33863 }
33864 }
33865 }
33866 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33867 match node.green_node(db).details {
33868 GreenNodeDetails::Token(_) => Some(Self { node }),
33869 GreenNodeDetails::Node { .. } => None,
33870 }
33871 }
33872 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33873 self.node
33874 }
33875 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33876 TokenGEPtr(self.node.stable_ptr(db))
33877 }
33878}
33879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33880pub struct TerminalGE<'db> {
33881 node: SyntaxNode<'db>,
33882}
33883impl<'db> Terminal<'db> for TerminalGE<'db> {
33884 const KIND: SyntaxKind = SyntaxKind::TerminalGE;
33885 type TokenType = TokenGE<'db>;
33886 fn new_green(
33887 db: &'db dyn Database,
33888 leading_trivia: TriviaGreen<'db>,
33889 token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33890 trailing_trivia: TriviaGreen<'db>,
33891 ) -> Self::Green {
33892 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33893 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33894 TerminalGEGreen(
33895 GreenNode {
33896 kind: SyntaxKind::TerminalGE,
33897 details: GreenNodeDetails::Node { children: children.into(), width },
33898 }
33899 .intern(db),
33900 )
33901 }
33902 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33903 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33904 unreachable!("Expected a node, not a token");
33905 };
33906 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33907 }
33908}
33909impl<'db> TerminalGE<'db> {
33910 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33911 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33912 }
33913 pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
33914 TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
33915 }
33916 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33917 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33918 }
33919}
33920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33921pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
33922impl<'db> TerminalGEPtr<'db> {}
33923impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
33924 type SyntaxNode = TerminalGE<'db>;
33925 fn untyped(self) -> SyntaxStablePtrId<'db> {
33926 self.0
33927 }
33928 fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
33929 TerminalGE::from_syntax_node(db, self.0.lookup(db))
33930 }
33931}
33932impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
33933 fn from(ptr: TerminalGEPtr<'db>) -> Self {
33934 ptr.untyped()
33935 }
33936}
33937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33938pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
33939impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
33940 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
33941 type StablePtr = TerminalGEPtr<'db>;
33942 type Green = TerminalGEGreen<'db>;
33943 fn missing(db: &'db dyn Database) -> Self::Green {
33944 TerminalGEGreen(
33945 GreenNode {
33946 kind: SyntaxKind::TerminalGE,
33947 details: GreenNodeDetails::Node {
33948 children: [
33949 Trivia::missing(db).0,
33950 TokenGE::missing(db).0,
33951 Trivia::missing(db).0,
33952 ]
33953 .into(),
33954 width: TextWidth::default(),
33955 },
33956 }
33957 .intern(db),
33958 )
33959 }
33960 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33961 let kind = node.kind(db);
33962 assert_eq!(
33963 kind,
33964 SyntaxKind::TerminalGE,
33965 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33966 kind,
33967 SyntaxKind::TerminalGE
33968 );
33969 Self { node }
33970 }
33971 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33972 let kind = node.kind(db);
33973 if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
33974 }
33975 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33976 self.node
33977 }
33978 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33979 TerminalGEPtr(self.node.stable_ptr(db))
33980 }
33981}
33982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33983pub struct TokenGT<'db> {
33984 node: SyntaxNode<'db>,
33985}
33986impl<'db> Token<'db> for TokenGT<'db> {
33987 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33988 TokenGTGreen(
33989 GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
33990 .intern(db),
33991 )
33992 }
33993 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33994 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33995 }
33996}
33997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33998pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
33999impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34000 type SyntaxNode = TokenGT<'db>;
34001 fn untyped(self) -> SyntaxStablePtrId<'db> {
34002 self.0
34003 }
34004 fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34005 TokenGT::from_syntax_node(db, self.0.lookup(db))
34006 }
34007}
34008impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34009 fn from(ptr: TokenGTPtr<'db>) -> Self {
34010 ptr.untyped()
34011 }
34012}
34013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34014pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34015impl<'db> TokenGTGreen<'db> {
34016 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34017 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34018 }
34019}
34020impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34021 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34022 type StablePtr = TokenGTPtr<'db>;
34023 type Green = TokenGTGreen<'db>;
34024 fn missing(db: &'db dyn Database) -> Self::Green {
34025 TokenGTGreen(
34026 GreenNode {
34027 kind: SyntaxKind::TokenMissing,
34028 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34029 }
34030 .intern(db),
34031 )
34032 }
34033 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34034 match node.green_node(db).details {
34035 GreenNodeDetails::Token(_) => Self { node },
34036 GreenNodeDetails::Node { .. } => {
34037 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34038 }
34039 }
34040 }
34041 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34042 match node.green_node(db).details {
34043 GreenNodeDetails::Token(_) => Some(Self { node }),
34044 GreenNodeDetails::Node { .. } => None,
34045 }
34046 }
34047 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34048 self.node
34049 }
34050 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34051 TokenGTPtr(self.node.stable_ptr(db))
34052 }
34053}
34054#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34055pub struct TerminalGT<'db> {
34056 node: SyntaxNode<'db>,
34057}
34058impl<'db> Terminal<'db> for TerminalGT<'db> {
34059 const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34060 type TokenType = TokenGT<'db>;
34061 fn new_green(
34062 db: &'db dyn Database,
34063 leading_trivia: TriviaGreen<'db>,
34064 token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34065 trailing_trivia: TriviaGreen<'db>,
34066 ) -> Self::Green {
34067 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34068 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34069 TerminalGTGreen(
34070 GreenNode {
34071 kind: SyntaxKind::TerminalGT,
34072 details: GreenNodeDetails::Node { children: children.into(), width },
34073 }
34074 .intern(db),
34075 )
34076 }
34077 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34078 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34079 unreachable!("Expected a node, not a token");
34080 };
34081 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34082 }
34083}
34084impl<'db> TerminalGT<'db> {
34085 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34086 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34087 }
34088 pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34089 TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34090 }
34091 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34092 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34093 }
34094}
34095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34096pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34097impl<'db> TerminalGTPtr<'db> {}
34098impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34099 type SyntaxNode = TerminalGT<'db>;
34100 fn untyped(self) -> SyntaxStablePtrId<'db> {
34101 self.0
34102 }
34103 fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34104 TerminalGT::from_syntax_node(db, self.0.lookup(db))
34105 }
34106}
34107impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34108 fn from(ptr: TerminalGTPtr<'db>) -> Self {
34109 ptr.untyped()
34110 }
34111}
34112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34113pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34114impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34115 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34116 type StablePtr = TerminalGTPtr<'db>;
34117 type Green = TerminalGTGreen<'db>;
34118 fn missing(db: &'db dyn Database) -> Self::Green {
34119 TerminalGTGreen(
34120 GreenNode {
34121 kind: SyntaxKind::TerminalGT,
34122 details: GreenNodeDetails::Node {
34123 children: [
34124 Trivia::missing(db).0,
34125 TokenGT::missing(db).0,
34126 Trivia::missing(db).0,
34127 ]
34128 .into(),
34129 width: TextWidth::default(),
34130 },
34131 }
34132 .intern(db),
34133 )
34134 }
34135 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34136 let kind = node.kind(db);
34137 assert_eq!(
34138 kind,
34139 SyntaxKind::TerminalGT,
34140 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34141 kind,
34142 SyntaxKind::TerminalGT
34143 );
34144 Self { node }
34145 }
34146 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34147 let kind = node.kind(db);
34148 if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34149 }
34150 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34151 self.node
34152 }
34153 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34154 TerminalGTPtr(self.node.stable_ptr(db))
34155 }
34156}
34157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34158pub struct TokenHash<'db> {
34159 node: SyntaxNode<'db>,
34160}
34161impl<'db> Token<'db> for TokenHash<'db> {
34162 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34163 TokenHashGreen(
34164 GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34165 .intern(db),
34166 )
34167 }
34168 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34169 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34170 }
34171}
34172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34173pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34174impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34175 type SyntaxNode = TokenHash<'db>;
34176 fn untyped(self) -> SyntaxStablePtrId<'db> {
34177 self.0
34178 }
34179 fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34180 TokenHash::from_syntax_node(db, self.0.lookup(db))
34181 }
34182}
34183impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34184 fn from(ptr: TokenHashPtr<'db>) -> Self {
34185 ptr.untyped()
34186 }
34187}
34188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34189pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34190impl<'db> TokenHashGreen<'db> {
34191 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34192 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34193 }
34194}
34195impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34196 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34197 type StablePtr = TokenHashPtr<'db>;
34198 type Green = TokenHashGreen<'db>;
34199 fn missing(db: &'db dyn Database) -> Self::Green {
34200 TokenHashGreen(
34201 GreenNode {
34202 kind: SyntaxKind::TokenMissing,
34203 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34204 }
34205 .intern(db),
34206 )
34207 }
34208 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34209 match node.green_node(db).details {
34210 GreenNodeDetails::Token(_) => Self { node },
34211 GreenNodeDetails::Node { .. } => {
34212 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34213 }
34214 }
34215 }
34216 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34217 match node.green_node(db).details {
34218 GreenNodeDetails::Token(_) => Some(Self { node }),
34219 GreenNodeDetails::Node { .. } => None,
34220 }
34221 }
34222 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34223 self.node
34224 }
34225 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34226 TokenHashPtr(self.node.stable_ptr(db))
34227 }
34228}
34229#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34230pub struct TerminalHash<'db> {
34231 node: SyntaxNode<'db>,
34232}
34233impl<'db> Terminal<'db> for TerminalHash<'db> {
34234 const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34235 type TokenType = TokenHash<'db>;
34236 fn new_green(
34237 db: &'db dyn Database,
34238 leading_trivia: TriviaGreen<'db>,
34239 token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34240 trailing_trivia: TriviaGreen<'db>,
34241 ) -> Self::Green {
34242 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34243 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34244 TerminalHashGreen(
34245 GreenNode {
34246 kind: SyntaxKind::TerminalHash,
34247 details: GreenNodeDetails::Node { children: children.into(), width },
34248 }
34249 .intern(db),
34250 )
34251 }
34252 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34253 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34254 unreachable!("Expected a node, not a token");
34255 };
34256 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34257 }
34258}
34259impl<'db> TerminalHash<'db> {
34260 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34261 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34262 }
34263 pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34264 TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34265 }
34266 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34267 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34268 }
34269}
34270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34271pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34272impl<'db> TerminalHashPtr<'db> {}
34273impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34274 type SyntaxNode = TerminalHash<'db>;
34275 fn untyped(self) -> SyntaxStablePtrId<'db> {
34276 self.0
34277 }
34278 fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34279 TerminalHash::from_syntax_node(db, self.0.lookup(db))
34280 }
34281}
34282impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34283 fn from(ptr: TerminalHashPtr<'db>) -> Self {
34284 ptr.untyped()
34285 }
34286}
34287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34288pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34289impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34290 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34291 type StablePtr = TerminalHashPtr<'db>;
34292 type Green = TerminalHashGreen<'db>;
34293 fn missing(db: &'db dyn Database) -> Self::Green {
34294 TerminalHashGreen(
34295 GreenNode {
34296 kind: SyntaxKind::TerminalHash,
34297 details: GreenNodeDetails::Node {
34298 children: [
34299 Trivia::missing(db).0,
34300 TokenHash::missing(db).0,
34301 Trivia::missing(db).0,
34302 ]
34303 .into(),
34304 width: TextWidth::default(),
34305 },
34306 }
34307 .intern(db),
34308 )
34309 }
34310 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34311 let kind = node.kind(db);
34312 assert_eq!(
34313 kind,
34314 SyntaxKind::TerminalHash,
34315 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34316 kind,
34317 SyntaxKind::TerminalHash
34318 );
34319 Self { node }
34320 }
34321 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34322 let kind = node.kind(db);
34323 if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34324 }
34325 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34326 self.node
34327 }
34328 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34329 TerminalHashPtr(self.node.stable_ptr(db))
34330 }
34331}
34332#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34333pub struct TokenLBrace<'db> {
34334 node: SyntaxNode<'db>,
34335}
34336impl<'db> Token<'db> for TokenLBrace<'db> {
34337 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34338 TokenLBraceGreen(
34339 GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34340 .intern(db),
34341 )
34342 }
34343 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34344 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34345 }
34346}
34347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34348pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34349impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34350 type SyntaxNode = TokenLBrace<'db>;
34351 fn untyped(self) -> SyntaxStablePtrId<'db> {
34352 self.0
34353 }
34354 fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34355 TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34356 }
34357}
34358impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34359 fn from(ptr: TokenLBracePtr<'db>) -> Self {
34360 ptr.untyped()
34361 }
34362}
34363#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34364pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34365impl<'db> TokenLBraceGreen<'db> {
34366 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34367 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34368 }
34369}
34370impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34371 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34372 type StablePtr = TokenLBracePtr<'db>;
34373 type Green = TokenLBraceGreen<'db>;
34374 fn missing(db: &'db dyn Database) -> Self::Green {
34375 TokenLBraceGreen(
34376 GreenNode {
34377 kind: SyntaxKind::TokenMissing,
34378 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34379 }
34380 .intern(db),
34381 )
34382 }
34383 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34384 match node.green_node(db).details {
34385 GreenNodeDetails::Token(_) => Self { node },
34386 GreenNodeDetails::Node { .. } => {
34387 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34388 }
34389 }
34390 }
34391 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34392 match node.green_node(db).details {
34393 GreenNodeDetails::Token(_) => Some(Self { node }),
34394 GreenNodeDetails::Node { .. } => None,
34395 }
34396 }
34397 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34398 self.node
34399 }
34400 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34401 TokenLBracePtr(self.node.stable_ptr(db))
34402 }
34403}
34404#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34405pub struct TerminalLBrace<'db> {
34406 node: SyntaxNode<'db>,
34407}
34408impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34409 const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34410 type TokenType = TokenLBrace<'db>;
34411 fn new_green(
34412 db: &'db dyn Database,
34413 leading_trivia: TriviaGreen<'db>,
34414 token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34415 trailing_trivia: TriviaGreen<'db>,
34416 ) -> Self::Green {
34417 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34418 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34419 TerminalLBraceGreen(
34420 GreenNode {
34421 kind: SyntaxKind::TerminalLBrace,
34422 details: GreenNodeDetails::Node { children: children.into(), width },
34423 }
34424 .intern(db),
34425 )
34426 }
34427 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34428 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34429 unreachable!("Expected a node, not a token");
34430 };
34431 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34432 }
34433}
34434impl<'db> TerminalLBrace<'db> {
34435 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34436 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34437 }
34438 pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34439 TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34440 }
34441 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34442 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34443 }
34444}
34445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34446pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34447impl<'db> TerminalLBracePtr<'db> {}
34448impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34449 type SyntaxNode = TerminalLBrace<'db>;
34450 fn untyped(self) -> SyntaxStablePtrId<'db> {
34451 self.0
34452 }
34453 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34454 TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34455 }
34456}
34457impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34458 fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34459 ptr.untyped()
34460 }
34461}
34462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34463pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34464impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34465 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34466 type StablePtr = TerminalLBracePtr<'db>;
34467 type Green = TerminalLBraceGreen<'db>;
34468 fn missing(db: &'db dyn Database) -> Self::Green {
34469 TerminalLBraceGreen(
34470 GreenNode {
34471 kind: SyntaxKind::TerminalLBrace,
34472 details: GreenNodeDetails::Node {
34473 children: [
34474 Trivia::missing(db).0,
34475 TokenLBrace::missing(db).0,
34476 Trivia::missing(db).0,
34477 ]
34478 .into(),
34479 width: TextWidth::default(),
34480 },
34481 }
34482 .intern(db),
34483 )
34484 }
34485 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34486 let kind = node.kind(db);
34487 assert_eq!(
34488 kind,
34489 SyntaxKind::TerminalLBrace,
34490 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34491 kind,
34492 SyntaxKind::TerminalLBrace
34493 );
34494 Self { node }
34495 }
34496 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34497 let kind = node.kind(db);
34498 if kind == SyntaxKind::TerminalLBrace {
34499 Some(Self::from_syntax_node(db, node))
34500 } else {
34501 None
34502 }
34503 }
34504 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34505 self.node
34506 }
34507 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34508 TerminalLBracePtr(self.node.stable_ptr(db))
34509 }
34510}
34511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34512pub struct TokenLBrack<'db> {
34513 node: SyntaxNode<'db>,
34514}
34515impl<'db> Token<'db> for TokenLBrack<'db> {
34516 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34517 TokenLBrackGreen(
34518 GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34519 .intern(db),
34520 )
34521 }
34522 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34523 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34524 }
34525}
34526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34527pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34528impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34529 type SyntaxNode = TokenLBrack<'db>;
34530 fn untyped(self) -> SyntaxStablePtrId<'db> {
34531 self.0
34532 }
34533 fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34534 TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34535 }
34536}
34537impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34538 fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34539 ptr.untyped()
34540 }
34541}
34542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34543pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34544impl<'db> TokenLBrackGreen<'db> {
34545 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34546 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34547 }
34548}
34549impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34550 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34551 type StablePtr = TokenLBrackPtr<'db>;
34552 type Green = TokenLBrackGreen<'db>;
34553 fn missing(db: &'db dyn Database) -> Self::Green {
34554 TokenLBrackGreen(
34555 GreenNode {
34556 kind: SyntaxKind::TokenMissing,
34557 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34558 }
34559 .intern(db),
34560 )
34561 }
34562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34563 match node.green_node(db).details {
34564 GreenNodeDetails::Token(_) => Self { node },
34565 GreenNodeDetails::Node { .. } => {
34566 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
34567 }
34568 }
34569 }
34570 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34571 match node.green_node(db).details {
34572 GreenNodeDetails::Token(_) => Some(Self { node }),
34573 GreenNodeDetails::Node { .. } => None,
34574 }
34575 }
34576 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34577 self.node
34578 }
34579 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34580 TokenLBrackPtr(self.node.stable_ptr(db))
34581 }
34582}
34583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34584pub struct TerminalLBrack<'db> {
34585 node: SyntaxNode<'db>,
34586}
34587impl<'db> Terminal<'db> for TerminalLBrack<'db> {
34588 const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
34589 type TokenType = TokenLBrack<'db>;
34590 fn new_green(
34591 db: &'db dyn Database,
34592 leading_trivia: TriviaGreen<'db>,
34593 token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34594 trailing_trivia: TriviaGreen<'db>,
34595 ) -> Self::Green {
34596 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34597 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34598 TerminalLBrackGreen(
34599 GreenNode {
34600 kind: SyntaxKind::TerminalLBrack,
34601 details: GreenNodeDetails::Node { children: children.into(), width },
34602 }
34603 .intern(db),
34604 )
34605 }
34606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34607 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34608 unreachable!("Expected a node, not a token");
34609 };
34610 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34611 }
34612}
34613impl<'db> TerminalLBrack<'db> {
34614 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34615 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34616 }
34617 pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34618 TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
34619 }
34620 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34621 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34622 }
34623}
34624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34625pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34626impl<'db> TerminalLBrackPtr<'db> {}
34627impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
34628 type SyntaxNode = TerminalLBrack<'db>;
34629 fn untyped(self) -> SyntaxStablePtrId<'db> {
34630 self.0
34631 }
34632 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
34633 TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
34634 }
34635}
34636impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34637 fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
34638 ptr.untyped()
34639 }
34640}
34641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34642pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
34643impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
34644 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
34645 type StablePtr = TerminalLBrackPtr<'db>;
34646 type Green = TerminalLBrackGreen<'db>;
34647 fn missing(db: &'db dyn Database) -> Self::Green {
34648 TerminalLBrackGreen(
34649 GreenNode {
34650 kind: SyntaxKind::TerminalLBrack,
34651 details: GreenNodeDetails::Node {
34652 children: [
34653 Trivia::missing(db).0,
34654 TokenLBrack::missing(db).0,
34655 Trivia::missing(db).0,
34656 ]
34657 .into(),
34658 width: TextWidth::default(),
34659 },
34660 }
34661 .intern(db),
34662 )
34663 }
34664 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34665 let kind = node.kind(db);
34666 assert_eq!(
34667 kind,
34668 SyntaxKind::TerminalLBrack,
34669 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34670 kind,
34671 SyntaxKind::TerminalLBrack
34672 );
34673 Self { node }
34674 }
34675 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34676 let kind = node.kind(db);
34677 if kind == SyntaxKind::TerminalLBrack {
34678 Some(Self::from_syntax_node(db, node))
34679 } else {
34680 None
34681 }
34682 }
34683 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34684 self.node
34685 }
34686 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34687 TerminalLBrackPtr(self.node.stable_ptr(db))
34688 }
34689}
34690#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34691pub struct TokenLE<'db> {
34692 node: SyntaxNode<'db>,
34693}
34694impl<'db> Token<'db> for TokenLE<'db> {
34695 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34696 TokenLEGreen(
34697 GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
34698 .intern(db),
34699 )
34700 }
34701 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34702 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34703 }
34704}
34705#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34706pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34707impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
34708 type SyntaxNode = TokenLE<'db>;
34709 fn untyped(self) -> SyntaxStablePtrId<'db> {
34710 self.0
34711 }
34712 fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
34713 TokenLE::from_syntax_node(db, self.0.lookup(db))
34714 }
34715}
34716impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
34717 fn from(ptr: TokenLEPtr<'db>) -> Self {
34718 ptr.untyped()
34719 }
34720}
34721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34722pub struct TokenLEGreen<'db>(pub GreenId<'db>);
34723impl<'db> TokenLEGreen<'db> {
34724 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34725 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34726 }
34727}
34728impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
34729 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
34730 type StablePtr = TokenLEPtr<'db>;
34731 type Green = TokenLEGreen<'db>;
34732 fn missing(db: &'db dyn Database) -> Self::Green {
34733 TokenLEGreen(
34734 GreenNode {
34735 kind: SyntaxKind::TokenMissing,
34736 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34737 }
34738 .intern(db),
34739 )
34740 }
34741 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34742 match node.green_node(db).details {
34743 GreenNodeDetails::Token(_) => Self { node },
34744 GreenNodeDetails::Node { .. } => {
34745 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
34746 }
34747 }
34748 }
34749 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34750 match node.green_node(db).details {
34751 GreenNodeDetails::Token(_) => Some(Self { node }),
34752 GreenNodeDetails::Node { .. } => None,
34753 }
34754 }
34755 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34756 self.node
34757 }
34758 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34759 TokenLEPtr(self.node.stable_ptr(db))
34760 }
34761}
34762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34763pub struct TerminalLE<'db> {
34764 node: SyntaxNode<'db>,
34765}
34766impl<'db> Terminal<'db> for TerminalLE<'db> {
34767 const KIND: SyntaxKind = SyntaxKind::TerminalLE;
34768 type TokenType = TokenLE<'db>;
34769 fn new_green(
34770 db: &'db dyn Database,
34771 leading_trivia: TriviaGreen<'db>,
34772 token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34773 trailing_trivia: TriviaGreen<'db>,
34774 ) -> Self::Green {
34775 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34776 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34777 TerminalLEGreen(
34778 GreenNode {
34779 kind: SyntaxKind::TerminalLE,
34780 details: GreenNodeDetails::Node { children: children.into(), width },
34781 }
34782 .intern(db),
34783 )
34784 }
34785 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34786 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34787 unreachable!("Expected a node, not a token");
34788 };
34789 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34790 }
34791}
34792impl<'db> TerminalLE<'db> {
34793 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34794 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34795 }
34796 pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
34797 TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
34798 }
34799 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34800 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34801 }
34802}
34803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34804pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34805impl<'db> TerminalLEPtr<'db> {}
34806impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
34807 type SyntaxNode = TerminalLE<'db>;
34808 fn untyped(self) -> SyntaxStablePtrId<'db> {
34809 self.0
34810 }
34811 fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
34812 TerminalLE::from_syntax_node(db, self.0.lookup(db))
34813 }
34814}
34815impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
34816 fn from(ptr: TerminalLEPtr<'db>) -> Self {
34817 ptr.untyped()
34818 }
34819}
34820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34821pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
34822impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
34823 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
34824 type StablePtr = TerminalLEPtr<'db>;
34825 type Green = TerminalLEGreen<'db>;
34826 fn missing(db: &'db dyn Database) -> Self::Green {
34827 TerminalLEGreen(
34828 GreenNode {
34829 kind: SyntaxKind::TerminalLE,
34830 details: GreenNodeDetails::Node {
34831 children: [
34832 Trivia::missing(db).0,
34833 TokenLE::missing(db).0,
34834 Trivia::missing(db).0,
34835 ]
34836 .into(),
34837 width: TextWidth::default(),
34838 },
34839 }
34840 .intern(db),
34841 )
34842 }
34843 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34844 let kind = node.kind(db);
34845 assert_eq!(
34846 kind,
34847 SyntaxKind::TerminalLE,
34848 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34849 kind,
34850 SyntaxKind::TerminalLE
34851 );
34852 Self { node }
34853 }
34854 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34855 let kind = node.kind(db);
34856 if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
34857 }
34858 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34859 self.node
34860 }
34861 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34862 TerminalLEPtr(self.node.stable_ptr(db))
34863 }
34864}
34865#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34866pub struct TokenLParen<'db> {
34867 node: SyntaxNode<'db>,
34868}
34869impl<'db> Token<'db> for TokenLParen<'db> {
34870 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34871 TokenLParenGreen(
34872 GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
34873 .intern(db),
34874 )
34875 }
34876 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34877 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34878 }
34879}
34880#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34881pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
34882impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
34883 type SyntaxNode = TokenLParen<'db>;
34884 fn untyped(self) -> SyntaxStablePtrId<'db> {
34885 self.0
34886 }
34887 fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
34888 TokenLParen::from_syntax_node(db, self.0.lookup(db))
34889 }
34890}
34891impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
34892 fn from(ptr: TokenLParenPtr<'db>) -> Self {
34893 ptr.untyped()
34894 }
34895}
34896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34897pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
34898impl<'db> TokenLParenGreen<'db> {
34899 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34900 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34901 }
34902}
34903impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
34904 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
34905 type StablePtr = TokenLParenPtr<'db>;
34906 type Green = TokenLParenGreen<'db>;
34907 fn missing(db: &'db dyn Database) -> Self::Green {
34908 TokenLParenGreen(
34909 GreenNode {
34910 kind: SyntaxKind::TokenMissing,
34911 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34912 }
34913 .intern(db),
34914 )
34915 }
34916 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34917 match node.green_node(db).details {
34918 GreenNodeDetails::Token(_) => Self { node },
34919 GreenNodeDetails::Node { .. } => {
34920 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
34921 }
34922 }
34923 }
34924 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34925 match node.green_node(db).details {
34926 GreenNodeDetails::Token(_) => Some(Self { node }),
34927 GreenNodeDetails::Node { .. } => None,
34928 }
34929 }
34930 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34931 self.node
34932 }
34933 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34934 TokenLParenPtr(self.node.stable_ptr(db))
34935 }
34936}
34937#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34938pub struct TerminalLParen<'db> {
34939 node: SyntaxNode<'db>,
34940}
34941impl<'db> Terminal<'db> for TerminalLParen<'db> {
34942 const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
34943 type TokenType = TokenLParen<'db>;
34944 fn new_green(
34945 db: &'db dyn Database,
34946 leading_trivia: TriviaGreen<'db>,
34947 token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34948 trailing_trivia: TriviaGreen<'db>,
34949 ) -> Self::Green {
34950 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34951 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34952 TerminalLParenGreen(
34953 GreenNode {
34954 kind: SyntaxKind::TerminalLParen,
34955 details: GreenNodeDetails::Node { children: children.into(), width },
34956 }
34957 .intern(db),
34958 )
34959 }
34960 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34961 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34962 unreachable!("Expected a node, not a token");
34963 };
34964 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34965 }
34966}
34967impl<'db> TerminalLParen<'db> {
34968 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34969 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34970 }
34971 pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
34972 TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
34973 }
34974 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34975 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34976 }
34977}
34978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34979pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
34980impl<'db> TerminalLParenPtr<'db> {}
34981impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
34982 type SyntaxNode = TerminalLParen<'db>;
34983 fn untyped(self) -> SyntaxStablePtrId<'db> {
34984 self.0
34985 }
34986 fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
34987 TerminalLParen::from_syntax_node(db, self.0.lookup(db))
34988 }
34989}
34990impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
34991 fn from(ptr: TerminalLParenPtr<'db>) -> Self {
34992 ptr.untyped()
34993 }
34994}
34995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34996pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
34997impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
34998 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
34999 type StablePtr = TerminalLParenPtr<'db>;
35000 type Green = TerminalLParenGreen<'db>;
35001 fn missing(db: &'db dyn Database) -> Self::Green {
35002 TerminalLParenGreen(
35003 GreenNode {
35004 kind: SyntaxKind::TerminalLParen,
35005 details: GreenNodeDetails::Node {
35006 children: [
35007 Trivia::missing(db).0,
35008 TokenLParen::missing(db).0,
35009 Trivia::missing(db).0,
35010 ]
35011 .into(),
35012 width: TextWidth::default(),
35013 },
35014 }
35015 .intern(db),
35016 )
35017 }
35018 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35019 let kind = node.kind(db);
35020 assert_eq!(
35021 kind,
35022 SyntaxKind::TerminalLParen,
35023 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35024 kind,
35025 SyntaxKind::TerminalLParen
35026 );
35027 Self { node }
35028 }
35029 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35030 let kind = node.kind(db);
35031 if kind == SyntaxKind::TerminalLParen {
35032 Some(Self::from_syntax_node(db, node))
35033 } else {
35034 None
35035 }
35036 }
35037 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35038 self.node
35039 }
35040 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35041 TerminalLParenPtr(self.node.stable_ptr(db))
35042 }
35043}
35044#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35045pub struct TokenLT<'db> {
35046 node: SyntaxNode<'db>,
35047}
35048impl<'db> Token<'db> for TokenLT<'db> {
35049 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35050 TokenLTGreen(
35051 GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35052 .intern(db),
35053 )
35054 }
35055 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35056 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35057 }
35058}
35059#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35060pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35061impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35062 type SyntaxNode = TokenLT<'db>;
35063 fn untyped(self) -> SyntaxStablePtrId<'db> {
35064 self.0
35065 }
35066 fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35067 TokenLT::from_syntax_node(db, self.0.lookup(db))
35068 }
35069}
35070impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35071 fn from(ptr: TokenLTPtr<'db>) -> Self {
35072 ptr.untyped()
35073 }
35074}
35075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35076pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35077impl<'db> TokenLTGreen<'db> {
35078 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35079 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35080 }
35081}
35082impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35083 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35084 type StablePtr = TokenLTPtr<'db>;
35085 type Green = TokenLTGreen<'db>;
35086 fn missing(db: &'db dyn Database) -> Self::Green {
35087 TokenLTGreen(
35088 GreenNode {
35089 kind: SyntaxKind::TokenMissing,
35090 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35091 }
35092 .intern(db),
35093 )
35094 }
35095 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35096 match node.green_node(db).details {
35097 GreenNodeDetails::Token(_) => Self { node },
35098 GreenNodeDetails::Node { .. } => {
35099 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35100 }
35101 }
35102 }
35103 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35104 match node.green_node(db).details {
35105 GreenNodeDetails::Token(_) => Some(Self { node }),
35106 GreenNodeDetails::Node { .. } => None,
35107 }
35108 }
35109 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35110 self.node
35111 }
35112 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35113 TokenLTPtr(self.node.stable_ptr(db))
35114 }
35115}
35116#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35117pub struct TerminalLT<'db> {
35118 node: SyntaxNode<'db>,
35119}
35120impl<'db> Terminal<'db> for TerminalLT<'db> {
35121 const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35122 type TokenType = TokenLT<'db>;
35123 fn new_green(
35124 db: &'db dyn Database,
35125 leading_trivia: TriviaGreen<'db>,
35126 token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35127 trailing_trivia: TriviaGreen<'db>,
35128 ) -> Self::Green {
35129 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35130 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35131 TerminalLTGreen(
35132 GreenNode {
35133 kind: SyntaxKind::TerminalLT,
35134 details: GreenNodeDetails::Node { children: children.into(), width },
35135 }
35136 .intern(db),
35137 )
35138 }
35139 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35140 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35141 unreachable!("Expected a node, not a token");
35142 };
35143 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35144 }
35145}
35146impl<'db> TerminalLT<'db> {
35147 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35148 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35149 }
35150 pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35151 TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35152 }
35153 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35154 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35155 }
35156}
35157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35158pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35159impl<'db> TerminalLTPtr<'db> {}
35160impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35161 type SyntaxNode = TerminalLT<'db>;
35162 fn untyped(self) -> SyntaxStablePtrId<'db> {
35163 self.0
35164 }
35165 fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35166 TerminalLT::from_syntax_node(db, self.0.lookup(db))
35167 }
35168}
35169impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35170 fn from(ptr: TerminalLTPtr<'db>) -> Self {
35171 ptr.untyped()
35172 }
35173}
35174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35175pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35176impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35177 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35178 type StablePtr = TerminalLTPtr<'db>;
35179 type Green = TerminalLTGreen<'db>;
35180 fn missing(db: &'db dyn Database) -> Self::Green {
35181 TerminalLTGreen(
35182 GreenNode {
35183 kind: SyntaxKind::TerminalLT,
35184 details: GreenNodeDetails::Node {
35185 children: [
35186 Trivia::missing(db).0,
35187 TokenLT::missing(db).0,
35188 Trivia::missing(db).0,
35189 ]
35190 .into(),
35191 width: TextWidth::default(),
35192 },
35193 }
35194 .intern(db),
35195 )
35196 }
35197 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35198 let kind = node.kind(db);
35199 assert_eq!(
35200 kind,
35201 SyntaxKind::TerminalLT,
35202 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35203 kind,
35204 SyntaxKind::TerminalLT
35205 );
35206 Self { node }
35207 }
35208 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35209 let kind = node.kind(db);
35210 if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35211 }
35212 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35213 self.node
35214 }
35215 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35216 TerminalLTPtr(self.node.stable_ptr(db))
35217 }
35218}
35219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35220pub struct TokenMatchArrow<'db> {
35221 node: SyntaxNode<'db>,
35222}
35223impl<'db> Token<'db> for TokenMatchArrow<'db> {
35224 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35225 TokenMatchArrowGreen(
35226 GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35227 .intern(db),
35228 )
35229 }
35230 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35231 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35232 }
35233}
35234#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35235pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35236impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35237 type SyntaxNode = TokenMatchArrow<'db>;
35238 fn untyped(self) -> SyntaxStablePtrId<'db> {
35239 self.0
35240 }
35241 fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35242 TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35243 }
35244}
35245impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35246 fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35247 ptr.untyped()
35248 }
35249}
35250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35251pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35252impl<'db> TokenMatchArrowGreen<'db> {
35253 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35254 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35255 }
35256}
35257impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35258 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35259 type StablePtr = TokenMatchArrowPtr<'db>;
35260 type Green = TokenMatchArrowGreen<'db>;
35261 fn missing(db: &'db dyn Database) -> Self::Green {
35262 TokenMatchArrowGreen(
35263 GreenNode {
35264 kind: SyntaxKind::TokenMissing,
35265 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35266 }
35267 .intern(db),
35268 )
35269 }
35270 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35271 match node.green_node(db).details {
35272 GreenNodeDetails::Token(_) => Self { node },
35273 GreenNodeDetails::Node { .. } => {
35274 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35275 }
35276 }
35277 }
35278 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35279 match node.green_node(db).details {
35280 GreenNodeDetails::Token(_) => Some(Self { node }),
35281 GreenNodeDetails::Node { .. } => None,
35282 }
35283 }
35284 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35285 self.node
35286 }
35287 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35288 TokenMatchArrowPtr(self.node.stable_ptr(db))
35289 }
35290}
35291#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35292pub struct TerminalMatchArrow<'db> {
35293 node: SyntaxNode<'db>,
35294}
35295impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35296 const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35297 type TokenType = TokenMatchArrow<'db>;
35298 fn new_green(
35299 db: &'db dyn Database,
35300 leading_trivia: TriviaGreen<'db>,
35301 token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35302 trailing_trivia: TriviaGreen<'db>,
35303 ) -> Self::Green {
35304 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35305 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35306 TerminalMatchArrowGreen(
35307 GreenNode {
35308 kind: SyntaxKind::TerminalMatchArrow,
35309 details: GreenNodeDetails::Node { children: children.into(), width },
35310 }
35311 .intern(db),
35312 )
35313 }
35314 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35315 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35316 unreachable!("Expected a node, not a token");
35317 };
35318 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35319 }
35320}
35321impl<'db> TerminalMatchArrow<'db> {
35322 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35323 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35324 }
35325 pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35326 TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35327 }
35328 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35329 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35330 }
35331}
35332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35333pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35334impl<'db> TerminalMatchArrowPtr<'db> {}
35335impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35336 type SyntaxNode = TerminalMatchArrow<'db>;
35337 fn untyped(self) -> SyntaxStablePtrId<'db> {
35338 self.0
35339 }
35340 fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35341 TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35342 }
35343}
35344impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35345 fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35346 ptr.untyped()
35347 }
35348}
35349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35350pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35351impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35352 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35353 type StablePtr = TerminalMatchArrowPtr<'db>;
35354 type Green = TerminalMatchArrowGreen<'db>;
35355 fn missing(db: &'db dyn Database) -> Self::Green {
35356 TerminalMatchArrowGreen(
35357 GreenNode {
35358 kind: SyntaxKind::TerminalMatchArrow,
35359 details: GreenNodeDetails::Node {
35360 children: [
35361 Trivia::missing(db).0,
35362 TokenMatchArrow::missing(db).0,
35363 Trivia::missing(db).0,
35364 ]
35365 .into(),
35366 width: TextWidth::default(),
35367 },
35368 }
35369 .intern(db),
35370 )
35371 }
35372 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35373 let kind = node.kind(db);
35374 assert_eq!(
35375 kind,
35376 SyntaxKind::TerminalMatchArrow,
35377 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35378 kind,
35379 SyntaxKind::TerminalMatchArrow
35380 );
35381 Self { node }
35382 }
35383 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35384 let kind = node.kind(db);
35385 if kind == SyntaxKind::TerminalMatchArrow {
35386 Some(Self::from_syntax_node(db, node))
35387 } else {
35388 None
35389 }
35390 }
35391 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35392 self.node
35393 }
35394 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35395 TerminalMatchArrowPtr(self.node.stable_ptr(db))
35396 }
35397}
35398#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35399pub struct TokenMinus<'db> {
35400 node: SyntaxNode<'db>,
35401}
35402impl<'db> Token<'db> for TokenMinus<'db> {
35403 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35404 TokenMinusGreen(
35405 GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35406 .intern(db),
35407 )
35408 }
35409 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35410 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35411 }
35412}
35413#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35414pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35415impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35416 type SyntaxNode = TokenMinus<'db>;
35417 fn untyped(self) -> SyntaxStablePtrId<'db> {
35418 self.0
35419 }
35420 fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35421 TokenMinus::from_syntax_node(db, self.0.lookup(db))
35422 }
35423}
35424impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35425 fn from(ptr: TokenMinusPtr<'db>) -> Self {
35426 ptr.untyped()
35427 }
35428}
35429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35430pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35431impl<'db> TokenMinusGreen<'db> {
35432 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35433 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35434 }
35435}
35436impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35437 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35438 type StablePtr = TokenMinusPtr<'db>;
35439 type Green = TokenMinusGreen<'db>;
35440 fn missing(db: &'db dyn Database) -> Self::Green {
35441 TokenMinusGreen(
35442 GreenNode {
35443 kind: SyntaxKind::TokenMissing,
35444 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35445 }
35446 .intern(db),
35447 )
35448 }
35449 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35450 match node.green_node(db).details {
35451 GreenNodeDetails::Token(_) => Self { node },
35452 GreenNodeDetails::Node { .. } => {
35453 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35454 }
35455 }
35456 }
35457 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35458 match node.green_node(db).details {
35459 GreenNodeDetails::Token(_) => Some(Self { node }),
35460 GreenNodeDetails::Node { .. } => None,
35461 }
35462 }
35463 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35464 self.node
35465 }
35466 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35467 TokenMinusPtr(self.node.stable_ptr(db))
35468 }
35469}
35470#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35471pub struct TerminalMinus<'db> {
35472 node: SyntaxNode<'db>,
35473}
35474impl<'db> Terminal<'db> for TerminalMinus<'db> {
35475 const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35476 type TokenType = TokenMinus<'db>;
35477 fn new_green(
35478 db: &'db dyn Database,
35479 leading_trivia: TriviaGreen<'db>,
35480 token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35481 trailing_trivia: TriviaGreen<'db>,
35482 ) -> Self::Green {
35483 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35484 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35485 TerminalMinusGreen(
35486 GreenNode {
35487 kind: SyntaxKind::TerminalMinus,
35488 details: GreenNodeDetails::Node { children: children.into(), width },
35489 }
35490 .intern(db),
35491 )
35492 }
35493 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35494 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35495 unreachable!("Expected a node, not a token");
35496 };
35497 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35498 }
35499}
35500impl<'db> TerminalMinus<'db> {
35501 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35502 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35503 }
35504 pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35505 TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35506 }
35507 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35508 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35509 }
35510}
35511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35512pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35513impl<'db> TerminalMinusPtr<'db> {}
35514impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35515 type SyntaxNode = TerminalMinus<'db>;
35516 fn untyped(self) -> SyntaxStablePtrId<'db> {
35517 self.0
35518 }
35519 fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35520 TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35521 }
35522}
35523impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35524 fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35525 ptr.untyped()
35526 }
35527}
35528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35529pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35530impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35531 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35532 type StablePtr = TerminalMinusPtr<'db>;
35533 type Green = TerminalMinusGreen<'db>;
35534 fn missing(db: &'db dyn Database) -> Self::Green {
35535 TerminalMinusGreen(
35536 GreenNode {
35537 kind: SyntaxKind::TerminalMinus,
35538 details: GreenNodeDetails::Node {
35539 children: [
35540 Trivia::missing(db).0,
35541 TokenMinus::missing(db).0,
35542 Trivia::missing(db).0,
35543 ]
35544 .into(),
35545 width: TextWidth::default(),
35546 },
35547 }
35548 .intern(db),
35549 )
35550 }
35551 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35552 let kind = node.kind(db);
35553 assert_eq!(
35554 kind,
35555 SyntaxKind::TerminalMinus,
35556 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35557 kind,
35558 SyntaxKind::TerminalMinus
35559 );
35560 Self { node }
35561 }
35562 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35563 let kind = node.kind(db);
35564 if kind == SyntaxKind::TerminalMinus {
35565 Some(Self::from_syntax_node(db, node))
35566 } else {
35567 None
35568 }
35569 }
35570 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35571 self.node
35572 }
35573 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35574 TerminalMinusPtr(self.node.stable_ptr(db))
35575 }
35576}
35577#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35578pub struct TokenMinusEq<'db> {
35579 node: SyntaxNode<'db>,
35580}
35581impl<'db> Token<'db> for TokenMinusEq<'db> {
35582 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35583 TokenMinusEqGreen(
35584 GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
35585 .intern(db),
35586 )
35587 }
35588 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35589 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35590 }
35591}
35592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35593pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35594impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
35595 type SyntaxNode = TokenMinusEq<'db>;
35596 fn untyped(self) -> SyntaxStablePtrId<'db> {
35597 self.0
35598 }
35599 fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35600 TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
35601 }
35602}
35603impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35604 fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
35605 ptr.untyped()
35606 }
35607}
35608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35609pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
35610impl<'db> TokenMinusEqGreen<'db> {
35611 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35612 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35613 }
35614}
35615impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
35616 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
35617 type StablePtr = TokenMinusEqPtr<'db>;
35618 type Green = TokenMinusEqGreen<'db>;
35619 fn missing(db: &'db dyn Database) -> Self::Green {
35620 TokenMinusEqGreen(
35621 GreenNode {
35622 kind: SyntaxKind::TokenMissing,
35623 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35624 }
35625 .intern(db),
35626 )
35627 }
35628 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35629 match node.green_node(db).details {
35630 GreenNodeDetails::Token(_) => Self { node },
35631 GreenNodeDetails::Node { .. } => {
35632 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
35633 }
35634 }
35635 }
35636 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35637 match node.green_node(db).details {
35638 GreenNodeDetails::Token(_) => Some(Self { node }),
35639 GreenNodeDetails::Node { .. } => None,
35640 }
35641 }
35642 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35643 self.node
35644 }
35645 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35646 TokenMinusEqPtr(self.node.stable_ptr(db))
35647 }
35648}
35649#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35650pub struct TerminalMinusEq<'db> {
35651 node: SyntaxNode<'db>,
35652}
35653impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
35654 const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
35655 type TokenType = TokenMinusEq<'db>;
35656 fn new_green(
35657 db: &'db dyn Database,
35658 leading_trivia: TriviaGreen<'db>,
35659 token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35660 trailing_trivia: TriviaGreen<'db>,
35661 ) -> Self::Green {
35662 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35663 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35664 TerminalMinusEqGreen(
35665 GreenNode {
35666 kind: SyntaxKind::TerminalMinusEq,
35667 details: GreenNodeDetails::Node { children: children.into(), width },
35668 }
35669 .intern(db),
35670 )
35671 }
35672 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35673 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35674 unreachable!("Expected a node, not a token");
35675 };
35676 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35677 }
35678}
35679impl<'db> TerminalMinusEq<'db> {
35680 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35681 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35682 }
35683 pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35684 TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
35685 }
35686 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35687 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35688 }
35689}
35690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35691pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35692impl<'db> TerminalMinusEqPtr<'db> {}
35693impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
35694 type SyntaxNode = TerminalMinusEq<'db>;
35695 fn untyped(self) -> SyntaxStablePtrId<'db> {
35696 self.0
35697 }
35698 fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
35699 TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
35700 }
35701}
35702impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35703 fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
35704 ptr.untyped()
35705 }
35706}
35707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35708pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
35709impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
35710 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
35711 type StablePtr = TerminalMinusEqPtr<'db>;
35712 type Green = TerminalMinusEqGreen<'db>;
35713 fn missing(db: &'db dyn Database) -> Self::Green {
35714 TerminalMinusEqGreen(
35715 GreenNode {
35716 kind: SyntaxKind::TerminalMinusEq,
35717 details: GreenNodeDetails::Node {
35718 children: [
35719 Trivia::missing(db).0,
35720 TokenMinusEq::missing(db).0,
35721 Trivia::missing(db).0,
35722 ]
35723 .into(),
35724 width: TextWidth::default(),
35725 },
35726 }
35727 .intern(db),
35728 )
35729 }
35730 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35731 let kind = node.kind(db);
35732 assert_eq!(
35733 kind,
35734 SyntaxKind::TerminalMinusEq,
35735 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35736 kind,
35737 SyntaxKind::TerminalMinusEq
35738 );
35739 Self { node }
35740 }
35741 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35742 let kind = node.kind(db);
35743 if kind == SyntaxKind::TerminalMinusEq {
35744 Some(Self::from_syntax_node(db, node))
35745 } else {
35746 None
35747 }
35748 }
35749 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35750 self.node
35751 }
35752 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35753 TerminalMinusEqPtr(self.node.stable_ptr(db))
35754 }
35755}
35756#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35757pub struct TokenMod<'db> {
35758 node: SyntaxNode<'db>,
35759}
35760impl<'db> Token<'db> for TokenMod<'db> {
35761 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35762 TokenModGreen(
35763 GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
35764 .intern(db),
35765 )
35766 }
35767 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35768 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35769 }
35770}
35771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35772pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
35773impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
35774 type SyntaxNode = TokenMod<'db>;
35775 fn untyped(self) -> SyntaxStablePtrId<'db> {
35776 self.0
35777 }
35778 fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
35779 TokenMod::from_syntax_node(db, self.0.lookup(db))
35780 }
35781}
35782impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
35783 fn from(ptr: TokenModPtr<'db>) -> Self {
35784 ptr.untyped()
35785 }
35786}
35787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35788pub struct TokenModGreen<'db>(pub GreenId<'db>);
35789impl<'db> TokenModGreen<'db> {
35790 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35791 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35792 }
35793}
35794impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
35795 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
35796 type StablePtr = TokenModPtr<'db>;
35797 type Green = TokenModGreen<'db>;
35798 fn missing(db: &'db dyn Database) -> Self::Green {
35799 TokenModGreen(
35800 GreenNode {
35801 kind: SyntaxKind::TokenMissing,
35802 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35803 }
35804 .intern(db),
35805 )
35806 }
35807 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35808 match node.green_node(db).details {
35809 GreenNodeDetails::Token(_) => Self { node },
35810 GreenNodeDetails::Node { .. } => {
35811 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
35812 }
35813 }
35814 }
35815 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35816 match node.green_node(db).details {
35817 GreenNodeDetails::Token(_) => Some(Self { node }),
35818 GreenNodeDetails::Node { .. } => None,
35819 }
35820 }
35821 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35822 self.node
35823 }
35824 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35825 TokenModPtr(self.node.stable_ptr(db))
35826 }
35827}
35828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35829pub struct TerminalMod<'db> {
35830 node: SyntaxNode<'db>,
35831}
35832impl<'db> Terminal<'db> for TerminalMod<'db> {
35833 const KIND: SyntaxKind = SyntaxKind::TerminalMod;
35834 type TokenType = TokenMod<'db>;
35835 fn new_green(
35836 db: &'db dyn Database,
35837 leading_trivia: TriviaGreen<'db>,
35838 token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35839 trailing_trivia: TriviaGreen<'db>,
35840 ) -> Self::Green {
35841 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35842 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35843 TerminalModGreen(
35844 GreenNode {
35845 kind: SyntaxKind::TerminalMod,
35846 details: GreenNodeDetails::Node { children: children.into(), width },
35847 }
35848 .intern(db),
35849 )
35850 }
35851 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35852 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35853 unreachable!("Expected a node, not a token");
35854 };
35855 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35856 }
35857}
35858impl<'db> TerminalMod<'db> {
35859 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35860 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35861 }
35862 pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
35863 TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
35864 }
35865 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35866 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35867 }
35868}
35869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35870pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
35871impl<'db> TerminalModPtr<'db> {}
35872impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
35873 type SyntaxNode = TerminalMod<'db>;
35874 fn untyped(self) -> SyntaxStablePtrId<'db> {
35875 self.0
35876 }
35877 fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
35878 TerminalMod::from_syntax_node(db, self.0.lookup(db))
35879 }
35880}
35881impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
35882 fn from(ptr: TerminalModPtr<'db>) -> Self {
35883 ptr.untyped()
35884 }
35885}
35886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35887pub struct TerminalModGreen<'db>(pub GreenId<'db>);
35888impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
35889 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
35890 type StablePtr = TerminalModPtr<'db>;
35891 type Green = TerminalModGreen<'db>;
35892 fn missing(db: &'db dyn Database) -> Self::Green {
35893 TerminalModGreen(
35894 GreenNode {
35895 kind: SyntaxKind::TerminalMod,
35896 details: GreenNodeDetails::Node {
35897 children: [
35898 Trivia::missing(db).0,
35899 TokenMod::missing(db).0,
35900 Trivia::missing(db).0,
35901 ]
35902 .into(),
35903 width: TextWidth::default(),
35904 },
35905 }
35906 .intern(db),
35907 )
35908 }
35909 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35910 let kind = node.kind(db);
35911 assert_eq!(
35912 kind,
35913 SyntaxKind::TerminalMod,
35914 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35915 kind,
35916 SyntaxKind::TerminalMod
35917 );
35918 Self { node }
35919 }
35920 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35921 let kind = node.kind(db);
35922 if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
35923 }
35924 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35925 self.node
35926 }
35927 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35928 TerminalModPtr(self.node.stable_ptr(db))
35929 }
35930}
35931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35932pub struct TokenModEq<'db> {
35933 node: SyntaxNode<'db>,
35934}
35935impl<'db> Token<'db> for TokenModEq<'db> {
35936 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35937 TokenModEqGreen(
35938 GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
35939 .intern(db),
35940 )
35941 }
35942 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35943 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35944 }
35945}
35946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35947pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35948impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
35949 type SyntaxNode = TokenModEq<'db>;
35950 fn untyped(self) -> SyntaxStablePtrId<'db> {
35951 self.0
35952 }
35953 fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
35954 TokenModEq::from_syntax_node(db, self.0.lookup(db))
35955 }
35956}
35957impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
35958 fn from(ptr: TokenModEqPtr<'db>) -> Self {
35959 ptr.untyped()
35960 }
35961}
35962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35963pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
35964impl<'db> TokenModEqGreen<'db> {
35965 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35966 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35967 }
35968}
35969impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
35970 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
35971 type StablePtr = TokenModEqPtr<'db>;
35972 type Green = TokenModEqGreen<'db>;
35973 fn missing(db: &'db dyn Database) -> Self::Green {
35974 TokenModEqGreen(
35975 GreenNode {
35976 kind: SyntaxKind::TokenMissing,
35977 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35978 }
35979 .intern(db),
35980 )
35981 }
35982 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35983 match node.green_node(db).details {
35984 GreenNodeDetails::Token(_) => Self { node },
35985 GreenNodeDetails::Node { .. } => {
35986 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
35987 }
35988 }
35989 }
35990 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35991 match node.green_node(db).details {
35992 GreenNodeDetails::Token(_) => Some(Self { node }),
35993 GreenNodeDetails::Node { .. } => None,
35994 }
35995 }
35996 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35997 self.node
35998 }
35999 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36000 TokenModEqPtr(self.node.stable_ptr(db))
36001 }
36002}
36003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36004pub struct TerminalModEq<'db> {
36005 node: SyntaxNode<'db>,
36006}
36007impl<'db> Terminal<'db> for TerminalModEq<'db> {
36008 const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36009 type TokenType = TokenModEq<'db>;
36010 fn new_green(
36011 db: &'db dyn Database,
36012 leading_trivia: TriviaGreen<'db>,
36013 token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36014 trailing_trivia: TriviaGreen<'db>,
36015 ) -> Self::Green {
36016 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36017 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36018 TerminalModEqGreen(
36019 GreenNode {
36020 kind: SyntaxKind::TerminalModEq,
36021 details: GreenNodeDetails::Node { children: children.into(), width },
36022 }
36023 .intern(db),
36024 )
36025 }
36026 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36027 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36028 unreachable!("Expected a node, not a token");
36029 };
36030 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36031 }
36032}
36033impl<'db> TerminalModEq<'db> {
36034 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36035 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36036 }
36037 pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36038 TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36039 }
36040 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36041 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36042 }
36043}
36044#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36045pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36046impl<'db> TerminalModEqPtr<'db> {}
36047impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36048 type SyntaxNode = TerminalModEq<'db>;
36049 fn untyped(self) -> SyntaxStablePtrId<'db> {
36050 self.0
36051 }
36052 fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36053 TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36054 }
36055}
36056impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36057 fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36058 ptr.untyped()
36059 }
36060}
36061#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36062pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36063impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36064 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36065 type StablePtr = TerminalModEqPtr<'db>;
36066 type Green = TerminalModEqGreen<'db>;
36067 fn missing(db: &'db dyn Database) -> Self::Green {
36068 TerminalModEqGreen(
36069 GreenNode {
36070 kind: SyntaxKind::TerminalModEq,
36071 details: GreenNodeDetails::Node {
36072 children: [
36073 Trivia::missing(db).0,
36074 TokenModEq::missing(db).0,
36075 Trivia::missing(db).0,
36076 ]
36077 .into(),
36078 width: TextWidth::default(),
36079 },
36080 }
36081 .intern(db),
36082 )
36083 }
36084 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36085 let kind = node.kind(db);
36086 assert_eq!(
36087 kind,
36088 SyntaxKind::TerminalModEq,
36089 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36090 kind,
36091 SyntaxKind::TerminalModEq
36092 );
36093 Self { node }
36094 }
36095 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36096 let kind = node.kind(db);
36097 if kind == SyntaxKind::TerminalModEq {
36098 Some(Self::from_syntax_node(db, node))
36099 } else {
36100 None
36101 }
36102 }
36103 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36104 self.node
36105 }
36106 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36107 TerminalModEqPtr(self.node.stable_ptr(db))
36108 }
36109}
36110#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36111pub struct TokenMul<'db> {
36112 node: SyntaxNode<'db>,
36113}
36114impl<'db> Token<'db> for TokenMul<'db> {
36115 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36116 TokenMulGreen(
36117 GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36118 .intern(db),
36119 )
36120 }
36121 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36122 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36123 }
36124}
36125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36126pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36127impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36128 type SyntaxNode = TokenMul<'db>;
36129 fn untyped(self) -> SyntaxStablePtrId<'db> {
36130 self.0
36131 }
36132 fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36133 TokenMul::from_syntax_node(db, self.0.lookup(db))
36134 }
36135}
36136impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36137 fn from(ptr: TokenMulPtr<'db>) -> Self {
36138 ptr.untyped()
36139 }
36140}
36141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36142pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36143impl<'db> TokenMulGreen<'db> {
36144 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36145 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36146 }
36147}
36148impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36149 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36150 type StablePtr = TokenMulPtr<'db>;
36151 type Green = TokenMulGreen<'db>;
36152 fn missing(db: &'db dyn Database) -> Self::Green {
36153 TokenMulGreen(
36154 GreenNode {
36155 kind: SyntaxKind::TokenMissing,
36156 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36157 }
36158 .intern(db),
36159 )
36160 }
36161 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36162 match node.green_node(db).details {
36163 GreenNodeDetails::Token(_) => Self { node },
36164 GreenNodeDetails::Node { .. } => {
36165 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36166 }
36167 }
36168 }
36169 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36170 match node.green_node(db).details {
36171 GreenNodeDetails::Token(_) => Some(Self { node }),
36172 GreenNodeDetails::Node { .. } => None,
36173 }
36174 }
36175 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36176 self.node
36177 }
36178 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36179 TokenMulPtr(self.node.stable_ptr(db))
36180 }
36181}
36182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36183pub struct TerminalMul<'db> {
36184 node: SyntaxNode<'db>,
36185}
36186impl<'db> Terminal<'db> for TerminalMul<'db> {
36187 const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36188 type TokenType = TokenMul<'db>;
36189 fn new_green(
36190 db: &'db dyn Database,
36191 leading_trivia: TriviaGreen<'db>,
36192 token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36193 trailing_trivia: TriviaGreen<'db>,
36194 ) -> Self::Green {
36195 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36196 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36197 TerminalMulGreen(
36198 GreenNode {
36199 kind: SyntaxKind::TerminalMul,
36200 details: GreenNodeDetails::Node { children: children.into(), width },
36201 }
36202 .intern(db),
36203 )
36204 }
36205 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36206 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36207 unreachable!("Expected a node, not a token");
36208 };
36209 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36210 }
36211}
36212impl<'db> TerminalMul<'db> {
36213 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36214 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36215 }
36216 pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36217 TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36218 }
36219 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36220 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36221 }
36222}
36223#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36224pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36225impl<'db> TerminalMulPtr<'db> {}
36226impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36227 type SyntaxNode = TerminalMul<'db>;
36228 fn untyped(self) -> SyntaxStablePtrId<'db> {
36229 self.0
36230 }
36231 fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36232 TerminalMul::from_syntax_node(db, self.0.lookup(db))
36233 }
36234}
36235impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36236 fn from(ptr: TerminalMulPtr<'db>) -> Self {
36237 ptr.untyped()
36238 }
36239}
36240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36241pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36242impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36243 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36244 type StablePtr = TerminalMulPtr<'db>;
36245 type Green = TerminalMulGreen<'db>;
36246 fn missing(db: &'db dyn Database) -> Self::Green {
36247 TerminalMulGreen(
36248 GreenNode {
36249 kind: SyntaxKind::TerminalMul,
36250 details: GreenNodeDetails::Node {
36251 children: [
36252 Trivia::missing(db).0,
36253 TokenMul::missing(db).0,
36254 Trivia::missing(db).0,
36255 ]
36256 .into(),
36257 width: TextWidth::default(),
36258 },
36259 }
36260 .intern(db),
36261 )
36262 }
36263 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36264 let kind = node.kind(db);
36265 assert_eq!(
36266 kind,
36267 SyntaxKind::TerminalMul,
36268 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36269 kind,
36270 SyntaxKind::TerminalMul
36271 );
36272 Self { node }
36273 }
36274 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36275 let kind = node.kind(db);
36276 if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36277 }
36278 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36279 self.node
36280 }
36281 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36282 TerminalMulPtr(self.node.stable_ptr(db))
36283 }
36284}
36285#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36286pub struct TokenMulEq<'db> {
36287 node: SyntaxNode<'db>,
36288}
36289impl<'db> Token<'db> for TokenMulEq<'db> {
36290 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36291 TokenMulEqGreen(
36292 GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36293 .intern(db),
36294 )
36295 }
36296 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36297 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36298 }
36299}
36300#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36301pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36302impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36303 type SyntaxNode = TokenMulEq<'db>;
36304 fn untyped(self) -> SyntaxStablePtrId<'db> {
36305 self.0
36306 }
36307 fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36308 TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36309 }
36310}
36311impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36312 fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36313 ptr.untyped()
36314 }
36315}
36316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36317pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36318impl<'db> TokenMulEqGreen<'db> {
36319 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36320 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36321 }
36322}
36323impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36324 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36325 type StablePtr = TokenMulEqPtr<'db>;
36326 type Green = TokenMulEqGreen<'db>;
36327 fn missing(db: &'db dyn Database) -> Self::Green {
36328 TokenMulEqGreen(
36329 GreenNode {
36330 kind: SyntaxKind::TokenMissing,
36331 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36332 }
36333 .intern(db),
36334 )
36335 }
36336 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36337 match node.green_node(db).details {
36338 GreenNodeDetails::Token(_) => Self { node },
36339 GreenNodeDetails::Node { .. } => {
36340 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36341 }
36342 }
36343 }
36344 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36345 match node.green_node(db).details {
36346 GreenNodeDetails::Token(_) => Some(Self { node }),
36347 GreenNodeDetails::Node { .. } => None,
36348 }
36349 }
36350 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36351 self.node
36352 }
36353 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36354 TokenMulEqPtr(self.node.stable_ptr(db))
36355 }
36356}
36357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36358pub struct TerminalMulEq<'db> {
36359 node: SyntaxNode<'db>,
36360}
36361impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36362 const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36363 type TokenType = TokenMulEq<'db>;
36364 fn new_green(
36365 db: &'db dyn Database,
36366 leading_trivia: TriviaGreen<'db>,
36367 token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36368 trailing_trivia: TriviaGreen<'db>,
36369 ) -> Self::Green {
36370 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36371 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36372 TerminalMulEqGreen(
36373 GreenNode {
36374 kind: SyntaxKind::TerminalMulEq,
36375 details: GreenNodeDetails::Node { children: children.into(), width },
36376 }
36377 .intern(db),
36378 )
36379 }
36380 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36381 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36382 unreachable!("Expected a node, not a token");
36383 };
36384 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36385 }
36386}
36387impl<'db> TerminalMulEq<'db> {
36388 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36389 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36390 }
36391 pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36392 TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36393 }
36394 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36395 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36396 }
36397}
36398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36399pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36400impl<'db> TerminalMulEqPtr<'db> {}
36401impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36402 type SyntaxNode = TerminalMulEq<'db>;
36403 fn untyped(self) -> SyntaxStablePtrId<'db> {
36404 self.0
36405 }
36406 fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36407 TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36408 }
36409}
36410impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36411 fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36412 ptr.untyped()
36413 }
36414}
36415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36416pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36417impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36418 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36419 type StablePtr = TerminalMulEqPtr<'db>;
36420 type Green = TerminalMulEqGreen<'db>;
36421 fn missing(db: &'db dyn Database) -> Self::Green {
36422 TerminalMulEqGreen(
36423 GreenNode {
36424 kind: SyntaxKind::TerminalMulEq,
36425 details: GreenNodeDetails::Node {
36426 children: [
36427 Trivia::missing(db).0,
36428 TokenMulEq::missing(db).0,
36429 Trivia::missing(db).0,
36430 ]
36431 .into(),
36432 width: TextWidth::default(),
36433 },
36434 }
36435 .intern(db),
36436 )
36437 }
36438 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36439 let kind = node.kind(db);
36440 assert_eq!(
36441 kind,
36442 SyntaxKind::TerminalMulEq,
36443 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36444 kind,
36445 SyntaxKind::TerminalMulEq
36446 );
36447 Self { node }
36448 }
36449 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36450 let kind = node.kind(db);
36451 if kind == SyntaxKind::TerminalMulEq {
36452 Some(Self::from_syntax_node(db, node))
36453 } else {
36454 None
36455 }
36456 }
36457 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36458 self.node
36459 }
36460 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36461 TerminalMulEqPtr(self.node.stable_ptr(db))
36462 }
36463}
36464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36465pub struct TokenNeq<'db> {
36466 node: SyntaxNode<'db>,
36467}
36468impl<'db> Token<'db> for TokenNeq<'db> {
36469 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36470 TokenNeqGreen(
36471 GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36472 .intern(db),
36473 )
36474 }
36475 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36476 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36477 }
36478}
36479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36480pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36481impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36482 type SyntaxNode = TokenNeq<'db>;
36483 fn untyped(self) -> SyntaxStablePtrId<'db> {
36484 self.0
36485 }
36486 fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36487 TokenNeq::from_syntax_node(db, self.0.lookup(db))
36488 }
36489}
36490impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36491 fn from(ptr: TokenNeqPtr<'db>) -> Self {
36492 ptr.untyped()
36493 }
36494}
36495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36496pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36497impl<'db> TokenNeqGreen<'db> {
36498 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36499 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36500 }
36501}
36502impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36503 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36504 type StablePtr = TokenNeqPtr<'db>;
36505 type Green = TokenNeqGreen<'db>;
36506 fn missing(db: &'db dyn Database) -> Self::Green {
36507 TokenNeqGreen(
36508 GreenNode {
36509 kind: SyntaxKind::TokenMissing,
36510 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36511 }
36512 .intern(db),
36513 )
36514 }
36515 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36516 match node.green_node(db).details {
36517 GreenNodeDetails::Token(_) => Self { node },
36518 GreenNodeDetails::Node { .. } => {
36519 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36520 }
36521 }
36522 }
36523 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36524 match node.green_node(db).details {
36525 GreenNodeDetails::Token(_) => Some(Self { node }),
36526 GreenNodeDetails::Node { .. } => None,
36527 }
36528 }
36529 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36530 self.node
36531 }
36532 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36533 TokenNeqPtr(self.node.stable_ptr(db))
36534 }
36535}
36536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36537pub struct TerminalNeq<'db> {
36538 node: SyntaxNode<'db>,
36539}
36540impl<'db> Terminal<'db> for TerminalNeq<'db> {
36541 const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
36542 type TokenType = TokenNeq<'db>;
36543 fn new_green(
36544 db: &'db dyn Database,
36545 leading_trivia: TriviaGreen<'db>,
36546 token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36547 trailing_trivia: TriviaGreen<'db>,
36548 ) -> Self::Green {
36549 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36550 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36551 TerminalNeqGreen(
36552 GreenNode {
36553 kind: SyntaxKind::TerminalNeq,
36554 details: GreenNodeDetails::Node { children: children.into(), width },
36555 }
36556 .intern(db),
36557 )
36558 }
36559 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36560 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36561 unreachable!("Expected a node, not a token");
36562 };
36563 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36564 }
36565}
36566impl<'db> TerminalNeq<'db> {
36567 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36568 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36569 }
36570 pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36571 TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
36572 }
36573 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36574 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36575 }
36576}
36577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36578pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36579impl<'db> TerminalNeqPtr<'db> {}
36580impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
36581 type SyntaxNode = TerminalNeq<'db>;
36582 fn untyped(self) -> SyntaxStablePtrId<'db> {
36583 self.0
36584 }
36585 fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
36586 TerminalNeq::from_syntax_node(db, self.0.lookup(db))
36587 }
36588}
36589impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36590 fn from(ptr: TerminalNeqPtr<'db>) -> Self {
36591 ptr.untyped()
36592 }
36593}
36594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36595pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
36596impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
36597 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
36598 type StablePtr = TerminalNeqPtr<'db>;
36599 type Green = TerminalNeqGreen<'db>;
36600 fn missing(db: &'db dyn Database) -> Self::Green {
36601 TerminalNeqGreen(
36602 GreenNode {
36603 kind: SyntaxKind::TerminalNeq,
36604 details: GreenNodeDetails::Node {
36605 children: [
36606 Trivia::missing(db).0,
36607 TokenNeq::missing(db).0,
36608 Trivia::missing(db).0,
36609 ]
36610 .into(),
36611 width: TextWidth::default(),
36612 },
36613 }
36614 .intern(db),
36615 )
36616 }
36617 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36618 let kind = node.kind(db);
36619 assert_eq!(
36620 kind,
36621 SyntaxKind::TerminalNeq,
36622 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36623 kind,
36624 SyntaxKind::TerminalNeq
36625 );
36626 Self { node }
36627 }
36628 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36629 let kind = node.kind(db);
36630 if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
36631 }
36632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36633 self.node
36634 }
36635 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36636 TerminalNeqPtr(self.node.stable_ptr(db))
36637 }
36638}
36639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36640pub struct TokenNot<'db> {
36641 node: SyntaxNode<'db>,
36642}
36643impl<'db> Token<'db> for TokenNot<'db> {
36644 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36645 TokenNotGreen(
36646 GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
36647 .intern(db),
36648 )
36649 }
36650 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36651 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36652 }
36653}
36654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36655pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36656impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
36657 type SyntaxNode = TokenNot<'db>;
36658 fn untyped(self) -> SyntaxStablePtrId<'db> {
36659 self.0
36660 }
36661 fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
36662 TokenNot::from_syntax_node(db, self.0.lookup(db))
36663 }
36664}
36665impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
36666 fn from(ptr: TokenNotPtr<'db>) -> Self {
36667 ptr.untyped()
36668 }
36669}
36670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36671pub struct TokenNotGreen<'db>(pub GreenId<'db>);
36672impl<'db> TokenNotGreen<'db> {
36673 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36674 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36675 }
36676}
36677impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
36678 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
36679 type StablePtr = TokenNotPtr<'db>;
36680 type Green = TokenNotGreen<'db>;
36681 fn missing(db: &'db dyn Database) -> Self::Green {
36682 TokenNotGreen(
36683 GreenNode {
36684 kind: SyntaxKind::TokenMissing,
36685 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36686 }
36687 .intern(db),
36688 )
36689 }
36690 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36691 match node.green_node(db).details {
36692 GreenNodeDetails::Token(_) => Self { node },
36693 GreenNodeDetails::Node { .. } => {
36694 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
36695 }
36696 }
36697 }
36698 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36699 match node.green_node(db).details {
36700 GreenNodeDetails::Token(_) => Some(Self { node }),
36701 GreenNodeDetails::Node { .. } => None,
36702 }
36703 }
36704 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36705 self.node
36706 }
36707 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36708 TokenNotPtr(self.node.stable_ptr(db))
36709 }
36710}
36711#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36712pub struct TerminalNot<'db> {
36713 node: SyntaxNode<'db>,
36714}
36715impl<'db> Terminal<'db> for TerminalNot<'db> {
36716 const KIND: SyntaxKind = SyntaxKind::TerminalNot;
36717 type TokenType = TokenNot<'db>;
36718 fn new_green(
36719 db: &'db dyn Database,
36720 leading_trivia: TriviaGreen<'db>,
36721 token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36722 trailing_trivia: TriviaGreen<'db>,
36723 ) -> Self::Green {
36724 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36725 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36726 TerminalNotGreen(
36727 GreenNode {
36728 kind: SyntaxKind::TerminalNot,
36729 details: GreenNodeDetails::Node { children: children.into(), width },
36730 }
36731 .intern(db),
36732 )
36733 }
36734 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36735 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36736 unreachable!("Expected a node, not a token");
36737 };
36738 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36739 }
36740}
36741impl<'db> TerminalNot<'db> {
36742 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36743 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36744 }
36745 pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
36746 TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
36747 }
36748 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36749 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36750 }
36751}
36752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36753pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36754impl<'db> TerminalNotPtr<'db> {}
36755impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
36756 type SyntaxNode = TerminalNot<'db>;
36757 fn untyped(self) -> SyntaxStablePtrId<'db> {
36758 self.0
36759 }
36760 fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
36761 TerminalNot::from_syntax_node(db, self.0.lookup(db))
36762 }
36763}
36764impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
36765 fn from(ptr: TerminalNotPtr<'db>) -> Self {
36766 ptr.untyped()
36767 }
36768}
36769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36770pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
36771impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
36772 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
36773 type StablePtr = TerminalNotPtr<'db>;
36774 type Green = TerminalNotGreen<'db>;
36775 fn missing(db: &'db dyn Database) -> Self::Green {
36776 TerminalNotGreen(
36777 GreenNode {
36778 kind: SyntaxKind::TerminalNot,
36779 details: GreenNodeDetails::Node {
36780 children: [
36781 Trivia::missing(db).0,
36782 TokenNot::missing(db).0,
36783 Trivia::missing(db).0,
36784 ]
36785 .into(),
36786 width: TextWidth::default(),
36787 },
36788 }
36789 .intern(db),
36790 )
36791 }
36792 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36793 let kind = node.kind(db);
36794 assert_eq!(
36795 kind,
36796 SyntaxKind::TerminalNot,
36797 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36798 kind,
36799 SyntaxKind::TerminalNot
36800 );
36801 Self { node }
36802 }
36803 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36804 let kind = node.kind(db);
36805 if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
36806 }
36807 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36808 self.node
36809 }
36810 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36811 TerminalNotPtr(self.node.stable_ptr(db))
36812 }
36813}
36814#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36815pub struct TokenBitNot<'db> {
36816 node: SyntaxNode<'db>,
36817}
36818impl<'db> Token<'db> for TokenBitNot<'db> {
36819 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36820 TokenBitNotGreen(
36821 GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
36822 .intern(db),
36823 )
36824 }
36825 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36826 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36827 }
36828}
36829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36830pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36831impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
36832 type SyntaxNode = TokenBitNot<'db>;
36833 fn untyped(self) -> SyntaxStablePtrId<'db> {
36834 self.0
36835 }
36836 fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
36837 TokenBitNot::from_syntax_node(db, self.0.lookup(db))
36838 }
36839}
36840impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
36841 fn from(ptr: TokenBitNotPtr<'db>) -> Self {
36842 ptr.untyped()
36843 }
36844}
36845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36846pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
36847impl<'db> TokenBitNotGreen<'db> {
36848 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36849 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36850 }
36851}
36852impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
36853 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
36854 type StablePtr = TokenBitNotPtr<'db>;
36855 type Green = TokenBitNotGreen<'db>;
36856 fn missing(db: &'db dyn Database) -> Self::Green {
36857 TokenBitNotGreen(
36858 GreenNode {
36859 kind: SyntaxKind::TokenMissing,
36860 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36861 }
36862 .intern(db),
36863 )
36864 }
36865 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36866 match node.green_node(db).details {
36867 GreenNodeDetails::Token(_) => Self { node },
36868 GreenNodeDetails::Node { .. } => {
36869 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
36870 }
36871 }
36872 }
36873 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36874 match node.green_node(db).details {
36875 GreenNodeDetails::Token(_) => Some(Self { node }),
36876 GreenNodeDetails::Node { .. } => None,
36877 }
36878 }
36879 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36880 self.node
36881 }
36882 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36883 TokenBitNotPtr(self.node.stable_ptr(db))
36884 }
36885}
36886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36887pub struct TerminalBitNot<'db> {
36888 node: SyntaxNode<'db>,
36889}
36890impl<'db> Terminal<'db> for TerminalBitNot<'db> {
36891 const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
36892 type TokenType = TokenBitNot<'db>;
36893 fn new_green(
36894 db: &'db dyn Database,
36895 leading_trivia: TriviaGreen<'db>,
36896 token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36897 trailing_trivia: TriviaGreen<'db>,
36898 ) -> Self::Green {
36899 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36900 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36901 TerminalBitNotGreen(
36902 GreenNode {
36903 kind: SyntaxKind::TerminalBitNot,
36904 details: GreenNodeDetails::Node { children: children.into(), width },
36905 }
36906 .intern(db),
36907 )
36908 }
36909 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36910 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36911 unreachable!("Expected a node, not a token");
36912 };
36913 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36914 }
36915}
36916impl<'db> TerminalBitNot<'db> {
36917 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36918 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36919 }
36920 pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
36921 TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
36922 }
36923 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36924 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36925 }
36926}
36927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36928pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36929impl<'db> TerminalBitNotPtr<'db> {}
36930impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
36931 type SyntaxNode = TerminalBitNot<'db>;
36932 fn untyped(self) -> SyntaxStablePtrId<'db> {
36933 self.0
36934 }
36935 fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
36936 TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
36937 }
36938}
36939impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
36940 fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
36941 ptr.untyped()
36942 }
36943}
36944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36945pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
36946impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
36947 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
36948 type StablePtr = TerminalBitNotPtr<'db>;
36949 type Green = TerminalBitNotGreen<'db>;
36950 fn missing(db: &'db dyn Database) -> Self::Green {
36951 TerminalBitNotGreen(
36952 GreenNode {
36953 kind: SyntaxKind::TerminalBitNot,
36954 details: GreenNodeDetails::Node {
36955 children: [
36956 Trivia::missing(db).0,
36957 TokenBitNot::missing(db).0,
36958 Trivia::missing(db).0,
36959 ]
36960 .into(),
36961 width: TextWidth::default(),
36962 },
36963 }
36964 .intern(db),
36965 )
36966 }
36967 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36968 let kind = node.kind(db);
36969 assert_eq!(
36970 kind,
36971 SyntaxKind::TerminalBitNot,
36972 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36973 kind,
36974 SyntaxKind::TerminalBitNot
36975 );
36976 Self { node }
36977 }
36978 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36979 let kind = node.kind(db);
36980 if kind == SyntaxKind::TerminalBitNot {
36981 Some(Self::from_syntax_node(db, node))
36982 } else {
36983 None
36984 }
36985 }
36986 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36987 self.node
36988 }
36989 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36990 TerminalBitNotPtr(self.node.stable_ptr(db))
36991 }
36992}
36993#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36994pub struct TokenOr<'db> {
36995 node: SyntaxNode<'db>,
36996}
36997impl<'db> Token<'db> for TokenOr<'db> {
36998 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36999 TokenOrGreen(
37000 GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37001 .intern(db),
37002 )
37003 }
37004 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37005 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37006 }
37007}
37008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37009pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37010impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37011 type SyntaxNode = TokenOr<'db>;
37012 fn untyped(self) -> SyntaxStablePtrId<'db> {
37013 self.0
37014 }
37015 fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37016 TokenOr::from_syntax_node(db, self.0.lookup(db))
37017 }
37018}
37019impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37020 fn from(ptr: TokenOrPtr<'db>) -> Self {
37021 ptr.untyped()
37022 }
37023}
37024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37025pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37026impl<'db> TokenOrGreen<'db> {
37027 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37028 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37029 }
37030}
37031impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37032 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37033 type StablePtr = TokenOrPtr<'db>;
37034 type Green = TokenOrGreen<'db>;
37035 fn missing(db: &'db dyn Database) -> Self::Green {
37036 TokenOrGreen(
37037 GreenNode {
37038 kind: SyntaxKind::TokenMissing,
37039 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37040 }
37041 .intern(db),
37042 )
37043 }
37044 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37045 match node.green_node(db).details {
37046 GreenNodeDetails::Token(_) => Self { node },
37047 GreenNodeDetails::Node { .. } => {
37048 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37049 }
37050 }
37051 }
37052 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37053 match node.green_node(db).details {
37054 GreenNodeDetails::Token(_) => Some(Self { node }),
37055 GreenNodeDetails::Node { .. } => None,
37056 }
37057 }
37058 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37059 self.node
37060 }
37061 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37062 TokenOrPtr(self.node.stable_ptr(db))
37063 }
37064}
37065#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37066pub struct TerminalOr<'db> {
37067 node: SyntaxNode<'db>,
37068}
37069impl<'db> Terminal<'db> for TerminalOr<'db> {
37070 const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37071 type TokenType = TokenOr<'db>;
37072 fn new_green(
37073 db: &'db dyn Database,
37074 leading_trivia: TriviaGreen<'db>,
37075 token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37076 trailing_trivia: TriviaGreen<'db>,
37077 ) -> Self::Green {
37078 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37079 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37080 TerminalOrGreen(
37081 GreenNode {
37082 kind: SyntaxKind::TerminalOr,
37083 details: GreenNodeDetails::Node { children: children.into(), width },
37084 }
37085 .intern(db),
37086 )
37087 }
37088 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37089 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37090 unreachable!("Expected a node, not a token");
37091 };
37092 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37093 }
37094}
37095impl<'db> TerminalOr<'db> {
37096 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37097 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37098 }
37099 pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37100 TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37101 }
37102 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37103 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37104 }
37105}
37106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37107pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37108impl<'db> TerminalOrPtr<'db> {}
37109impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37110 type SyntaxNode = TerminalOr<'db>;
37111 fn untyped(self) -> SyntaxStablePtrId<'db> {
37112 self.0
37113 }
37114 fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37115 TerminalOr::from_syntax_node(db, self.0.lookup(db))
37116 }
37117}
37118impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37119 fn from(ptr: TerminalOrPtr<'db>) -> Self {
37120 ptr.untyped()
37121 }
37122}
37123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37124pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37125impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37126 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37127 type StablePtr = TerminalOrPtr<'db>;
37128 type Green = TerminalOrGreen<'db>;
37129 fn missing(db: &'db dyn Database) -> Self::Green {
37130 TerminalOrGreen(
37131 GreenNode {
37132 kind: SyntaxKind::TerminalOr,
37133 details: GreenNodeDetails::Node {
37134 children: [
37135 Trivia::missing(db).0,
37136 TokenOr::missing(db).0,
37137 Trivia::missing(db).0,
37138 ]
37139 .into(),
37140 width: TextWidth::default(),
37141 },
37142 }
37143 .intern(db),
37144 )
37145 }
37146 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37147 let kind = node.kind(db);
37148 assert_eq!(
37149 kind,
37150 SyntaxKind::TerminalOr,
37151 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37152 kind,
37153 SyntaxKind::TerminalOr
37154 );
37155 Self { node }
37156 }
37157 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37158 let kind = node.kind(db);
37159 if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37160 }
37161 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37162 self.node
37163 }
37164 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37165 TerminalOrPtr(self.node.stable_ptr(db))
37166 }
37167}
37168#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37169pub struct TokenOrOr<'db> {
37170 node: SyntaxNode<'db>,
37171}
37172impl<'db> Token<'db> for TokenOrOr<'db> {
37173 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37174 TokenOrOrGreen(
37175 GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37176 .intern(db),
37177 )
37178 }
37179 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37180 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37181 }
37182}
37183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37184pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37185impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37186 type SyntaxNode = TokenOrOr<'db>;
37187 fn untyped(self) -> SyntaxStablePtrId<'db> {
37188 self.0
37189 }
37190 fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37191 TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37192 }
37193}
37194impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37195 fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37196 ptr.untyped()
37197 }
37198}
37199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37200pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37201impl<'db> TokenOrOrGreen<'db> {
37202 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37203 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37204 }
37205}
37206impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37207 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37208 type StablePtr = TokenOrOrPtr<'db>;
37209 type Green = TokenOrOrGreen<'db>;
37210 fn missing(db: &'db dyn Database) -> Self::Green {
37211 TokenOrOrGreen(
37212 GreenNode {
37213 kind: SyntaxKind::TokenMissing,
37214 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37215 }
37216 .intern(db),
37217 )
37218 }
37219 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37220 match node.green_node(db).details {
37221 GreenNodeDetails::Token(_) => Self { node },
37222 GreenNodeDetails::Node { .. } => {
37223 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37224 }
37225 }
37226 }
37227 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37228 match node.green_node(db).details {
37229 GreenNodeDetails::Token(_) => Some(Self { node }),
37230 GreenNodeDetails::Node { .. } => None,
37231 }
37232 }
37233 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37234 self.node
37235 }
37236 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37237 TokenOrOrPtr(self.node.stable_ptr(db))
37238 }
37239}
37240#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37241pub struct TerminalOrOr<'db> {
37242 node: SyntaxNode<'db>,
37243}
37244impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37245 const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37246 type TokenType = TokenOrOr<'db>;
37247 fn new_green(
37248 db: &'db dyn Database,
37249 leading_trivia: TriviaGreen<'db>,
37250 token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37251 trailing_trivia: TriviaGreen<'db>,
37252 ) -> Self::Green {
37253 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37254 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37255 TerminalOrOrGreen(
37256 GreenNode {
37257 kind: SyntaxKind::TerminalOrOr,
37258 details: GreenNodeDetails::Node { children: children.into(), width },
37259 }
37260 .intern(db),
37261 )
37262 }
37263 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37264 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37265 unreachable!("Expected a node, not a token");
37266 };
37267 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37268 }
37269}
37270impl<'db> TerminalOrOr<'db> {
37271 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37272 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37273 }
37274 pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37275 TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37276 }
37277 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37278 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37279 }
37280}
37281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37282pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37283impl<'db> TerminalOrOrPtr<'db> {}
37284impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37285 type SyntaxNode = TerminalOrOr<'db>;
37286 fn untyped(self) -> SyntaxStablePtrId<'db> {
37287 self.0
37288 }
37289 fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37290 TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37291 }
37292}
37293impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37294 fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37295 ptr.untyped()
37296 }
37297}
37298#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37299pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37300impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37301 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37302 type StablePtr = TerminalOrOrPtr<'db>;
37303 type Green = TerminalOrOrGreen<'db>;
37304 fn missing(db: &'db dyn Database) -> Self::Green {
37305 TerminalOrOrGreen(
37306 GreenNode {
37307 kind: SyntaxKind::TerminalOrOr,
37308 details: GreenNodeDetails::Node {
37309 children: [
37310 Trivia::missing(db).0,
37311 TokenOrOr::missing(db).0,
37312 Trivia::missing(db).0,
37313 ]
37314 .into(),
37315 width: TextWidth::default(),
37316 },
37317 }
37318 .intern(db),
37319 )
37320 }
37321 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37322 let kind = node.kind(db);
37323 assert_eq!(
37324 kind,
37325 SyntaxKind::TerminalOrOr,
37326 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37327 kind,
37328 SyntaxKind::TerminalOrOr
37329 );
37330 Self { node }
37331 }
37332 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37333 let kind = node.kind(db);
37334 if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37335 }
37336 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37337 self.node
37338 }
37339 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37340 TerminalOrOrPtr(self.node.stable_ptr(db))
37341 }
37342}
37343#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37344pub struct TokenPlus<'db> {
37345 node: SyntaxNode<'db>,
37346}
37347impl<'db> Token<'db> for TokenPlus<'db> {
37348 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37349 TokenPlusGreen(
37350 GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37351 .intern(db),
37352 )
37353 }
37354 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37355 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37356 }
37357}
37358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37359pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37360impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37361 type SyntaxNode = TokenPlus<'db>;
37362 fn untyped(self) -> SyntaxStablePtrId<'db> {
37363 self.0
37364 }
37365 fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37366 TokenPlus::from_syntax_node(db, self.0.lookup(db))
37367 }
37368}
37369impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37370 fn from(ptr: TokenPlusPtr<'db>) -> Self {
37371 ptr.untyped()
37372 }
37373}
37374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37375pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37376impl<'db> TokenPlusGreen<'db> {
37377 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37378 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37379 }
37380}
37381impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37382 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37383 type StablePtr = TokenPlusPtr<'db>;
37384 type Green = TokenPlusGreen<'db>;
37385 fn missing(db: &'db dyn Database) -> Self::Green {
37386 TokenPlusGreen(
37387 GreenNode {
37388 kind: SyntaxKind::TokenMissing,
37389 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37390 }
37391 .intern(db),
37392 )
37393 }
37394 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37395 match node.green_node(db).details {
37396 GreenNodeDetails::Token(_) => Self { node },
37397 GreenNodeDetails::Node { .. } => {
37398 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37399 }
37400 }
37401 }
37402 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37403 match node.green_node(db).details {
37404 GreenNodeDetails::Token(_) => Some(Self { node }),
37405 GreenNodeDetails::Node { .. } => None,
37406 }
37407 }
37408 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37409 self.node
37410 }
37411 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37412 TokenPlusPtr(self.node.stable_ptr(db))
37413 }
37414}
37415#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37416pub struct TerminalPlus<'db> {
37417 node: SyntaxNode<'db>,
37418}
37419impl<'db> Terminal<'db> for TerminalPlus<'db> {
37420 const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37421 type TokenType = TokenPlus<'db>;
37422 fn new_green(
37423 db: &'db dyn Database,
37424 leading_trivia: TriviaGreen<'db>,
37425 token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37426 trailing_trivia: TriviaGreen<'db>,
37427 ) -> Self::Green {
37428 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37429 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37430 TerminalPlusGreen(
37431 GreenNode {
37432 kind: SyntaxKind::TerminalPlus,
37433 details: GreenNodeDetails::Node { children: children.into(), width },
37434 }
37435 .intern(db),
37436 )
37437 }
37438 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37439 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37440 unreachable!("Expected a node, not a token");
37441 };
37442 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37443 }
37444}
37445impl<'db> TerminalPlus<'db> {
37446 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37447 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37448 }
37449 pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37450 TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37451 }
37452 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37453 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37454 }
37455}
37456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37457pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37458impl<'db> TerminalPlusPtr<'db> {}
37459impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37460 type SyntaxNode = TerminalPlus<'db>;
37461 fn untyped(self) -> SyntaxStablePtrId<'db> {
37462 self.0
37463 }
37464 fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37465 TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37466 }
37467}
37468impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37469 fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37470 ptr.untyped()
37471 }
37472}
37473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37474pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37475impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37476 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37477 type StablePtr = TerminalPlusPtr<'db>;
37478 type Green = TerminalPlusGreen<'db>;
37479 fn missing(db: &'db dyn Database) -> Self::Green {
37480 TerminalPlusGreen(
37481 GreenNode {
37482 kind: SyntaxKind::TerminalPlus,
37483 details: GreenNodeDetails::Node {
37484 children: [
37485 Trivia::missing(db).0,
37486 TokenPlus::missing(db).0,
37487 Trivia::missing(db).0,
37488 ]
37489 .into(),
37490 width: TextWidth::default(),
37491 },
37492 }
37493 .intern(db),
37494 )
37495 }
37496 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37497 let kind = node.kind(db);
37498 assert_eq!(
37499 kind,
37500 SyntaxKind::TerminalPlus,
37501 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37502 kind,
37503 SyntaxKind::TerminalPlus
37504 );
37505 Self { node }
37506 }
37507 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37508 let kind = node.kind(db);
37509 if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37510 }
37511 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37512 self.node
37513 }
37514 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37515 TerminalPlusPtr(self.node.stable_ptr(db))
37516 }
37517}
37518#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37519pub struct TokenPlusEq<'db> {
37520 node: SyntaxNode<'db>,
37521}
37522impl<'db> Token<'db> for TokenPlusEq<'db> {
37523 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37524 TokenPlusEqGreen(
37525 GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37526 .intern(db),
37527 )
37528 }
37529 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37530 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37531 }
37532}
37533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37534pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37535impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
37536 type SyntaxNode = TokenPlusEq<'db>;
37537 fn untyped(self) -> SyntaxStablePtrId<'db> {
37538 self.0
37539 }
37540 fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37541 TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
37542 }
37543}
37544impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37545 fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
37546 ptr.untyped()
37547 }
37548}
37549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37550pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
37551impl<'db> TokenPlusEqGreen<'db> {
37552 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37553 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37554 }
37555}
37556impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
37557 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
37558 type StablePtr = TokenPlusEqPtr<'db>;
37559 type Green = TokenPlusEqGreen<'db>;
37560 fn missing(db: &'db dyn Database) -> Self::Green {
37561 TokenPlusEqGreen(
37562 GreenNode {
37563 kind: SyntaxKind::TokenMissing,
37564 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37565 }
37566 .intern(db),
37567 )
37568 }
37569 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37570 match node.green_node(db).details {
37571 GreenNodeDetails::Token(_) => Self { node },
37572 GreenNodeDetails::Node { .. } => {
37573 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
37574 }
37575 }
37576 }
37577 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37578 match node.green_node(db).details {
37579 GreenNodeDetails::Token(_) => Some(Self { node }),
37580 GreenNodeDetails::Node { .. } => None,
37581 }
37582 }
37583 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37584 self.node
37585 }
37586 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37587 TokenPlusEqPtr(self.node.stable_ptr(db))
37588 }
37589}
37590#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37591pub struct TerminalPlusEq<'db> {
37592 node: SyntaxNode<'db>,
37593}
37594impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
37595 const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
37596 type TokenType = TokenPlusEq<'db>;
37597 fn new_green(
37598 db: &'db dyn Database,
37599 leading_trivia: TriviaGreen<'db>,
37600 token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37601 trailing_trivia: TriviaGreen<'db>,
37602 ) -> Self::Green {
37603 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37604 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37605 TerminalPlusEqGreen(
37606 GreenNode {
37607 kind: SyntaxKind::TerminalPlusEq,
37608 details: GreenNodeDetails::Node { children: children.into(), width },
37609 }
37610 .intern(db),
37611 )
37612 }
37613 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37614 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37615 unreachable!("Expected a node, not a token");
37616 };
37617 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37618 }
37619}
37620impl<'db> TerminalPlusEq<'db> {
37621 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37622 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37623 }
37624 pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37625 TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
37626 }
37627 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37628 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37629 }
37630}
37631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37632pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37633impl<'db> TerminalPlusEqPtr<'db> {}
37634impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
37635 type SyntaxNode = TerminalPlusEq<'db>;
37636 fn untyped(self) -> SyntaxStablePtrId<'db> {
37637 self.0
37638 }
37639 fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
37640 TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
37641 }
37642}
37643impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37644 fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
37645 ptr.untyped()
37646 }
37647}
37648#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37649pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
37650impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
37651 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
37652 type StablePtr = TerminalPlusEqPtr<'db>;
37653 type Green = TerminalPlusEqGreen<'db>;
37654 fn missing(db: &'db dyn Database) -> Self::Green {
37655 TerminalPlusEqGreen(
37656 GreenNode {
37657 kind: SyntaxKind::TerminalPlusEq,
37658 details: GreenNodeDetails::Node {
37659 children: [
37660 Trivia::missing(db).0,
37661 TokenPlusEq::missing(db).0,
37662 Trivia::missing(db).0,
37663 ]
37664 .into(),
37665 width: TextWidth::default(),
37666 },
37667 }
37668 .intern(db),
37669 )
37670 }
37671 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37672 let kind = node.kind(db);
37673 assert_eq!(
37674 kind,
37675 SyntaxKind::TerminalPlusEq,
37676 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37677 kind,
37678 SyntaxKind::TerminalPlusEq
37679 );
37680 Self { node }
37681 }
37682 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37683 let kind = node.kind(db);
37684 if kind == SyntaxKind::TerminalPlusEq {
37685 Some(Self::from_syntax_node(db, node))
37686 } else {
37687 None
37688 }
37689 }
37690 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37691 self.node
37692 }
37693 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37694 TerminalPlusEqPtr(self.node.stable_ptr(db))
37695 }
37696}
37697#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37698pub struct TokenQuestionMark<'db> {
37699 node: SyntaxNode<'db>,
37700}
37701impl<'db> Token<'db> for TokenQuestionMark<'db> {
37702 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37703 TokenQuestionMarkGreen(
37704 GreenNode {
37705 kind: SyntaxKind::TokenQuestionMark,
37706 details: GreenNodeDetails::Token(text),
37707 }
37708 .intern(db),
37709 )
37710 }
37711 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37712 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37713 }
37714}
37715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37716pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37717impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
37718 type SyntaxNode = TokenQuestionMark<'db>;
37719 fn untyped(self) -> SyntaxStablePtrId<'db> {
37720 self.0
37721 }
37722 fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37723 TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
37724 }
37725}
37726impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37727 fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
37728 ptr.untyped()
37729 }
37730}
37731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37732pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
37733impl<'db> TokenQuestionMarkGreen<'db> {
37734 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37735 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37736 }
37737}
37738impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
37739 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
37740 type StablePtr = TokenQuestionMarkPtr<'db>;
37741 type Green = TokenQuestionMarkGreen<'db>;
37742 fn missing(db: &'db dyn Database) -> Self::Green {
37743 TokenQuestionMarkGreen(
37744 GreenNode {
37745 kind: SyntaxKind::TokenMissing,
37746 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37747 }
37748 .intern(db),
37749 )
37750 }
37751 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37752 match node.green_node(db).details {
37753 GreenNodeDetails::Token(_) => Self { node },
37754 GreenNodeDetails::Node { .. } => {
37755 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
37756 }
37757 }
37758 }
37759 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37760 match node.green_node(db).details {
37761 GreenNodeDetails::Token(_) => Some(Self { node }),
37762 GreenNodeDetails::Node { .. } => None,
37763 }
37764 }
37765 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37766 self.node
37767 }
37768 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37769 TokenQuestionMarkPtr(self.node.stable_ptr(db))
37770 }
37771}
37772#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37773pub struct TerminalQuestionMark<'db> {
37774 node: SyntaxNode<'db>,
37775}
37776impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
37777 const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
37778 type TokenType = TokenQuestionMark<'db>;
37779 fn new_green(
37780 db: &'db dyn Database,
37781 leading_trivia: TriviaGreen<'db>,
37782 token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37783 trailing_trivia: TriviaGreen<'db>,
37784 ) -> Self::Green {
37785 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37786 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37787 TerminalQuestionMarkGreen(
37788 GreenNode {
37789 kind: SyntaxKind::TerminalQuestionMark,
37790 details: GreenNodeDetails::Node { children: children.into(), width },
37791 }
37792 .intern(db),
37793 )
37794 }
37795 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37796 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37797 unreachable!("Expected a node, not a token");
37798 };
37799 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37800 }
37801}
37802impl<'db> TerminalQuestionMark<'db> {
37803 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37804 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37805 }
37806 pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37807 TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
37808 }
37809 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37810 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37811 }
37812}
37813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37814pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37815impl<'db> TerminalQuestionMarkPtr<'db> {}
37816impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
37817 type SyntaxNode = TerminalQuestionMark<'db>;
37818 fn untyped(self) -> SyntaxStablePtrId<'db> {
37819 self.0
37820 }
37821 fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
37822 TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
37823 }
37824}
37825impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37826 fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
37827 ptr.untyped()
37828 }
37829}
37830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37831pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
37832impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
37833 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
37834 type StablePtr = TerminalQuestionMarkPtr<'db>;
37835 type Green = TerminalQuestionMarkGreen<'db>;
37836 fn missing(db: &'db dyn Database) -> Self::Green {
37837 TerminalQuestionMarkGreen(
37838 GreenNode {
37839 kind: SyntaxKind::TerminalQuestionMark,
37840 details: GreenNodeDetails::Node {
37841 children: [
37842 Trivia::missing(db).0,
37843 TokenQuestionMark::missing(db).0,
37844 Trivia::missing(db).0,
37845 ]
37846 .into(),
37847 width: TextWidth::default(),
37848 },
37849 }
37850 .intern(db),
37851 )
37852 }
37853 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37854 let kind = node.kind(db);
37855 assert_eq!(
37856 kind,
37857 SyntaxKind::TerminalQuestionMark,
37858 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37859 kind,
37860 SyntaxKind::TerminalQuestionMark
37861 );
37862 Self { node }
37863 }
37864 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37865 let kind = node.kind(db);
37866 if kind == SyntaxKind::TerminalQuestionMark {
37867 Some(Self::from_syntax_node(db, node))
37868 } else {
37869 None
37870 }
37871 }
37872 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37873 self.node
37874 }
37875 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37876 TerminalQuestionMarkPtr(self.node.stable_ptr(db))
37877 }
37878}
37879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37880pub struct TokenRBrace<'db> {
37881 node: SyntaxNode<'db>,
37882}
37883impl<'db> Token<'db> for TokenRBrace<'db> {
37884 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37885 TokenRBraceGreen(
37886 GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
37887 .intern(db),
37888 )
37889 }
37890 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37891 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37892 }
37893}
37894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37895pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
37896impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
37897 type SyntaxNode = TokenRBrace<'db>;
37898 fn untyped(self) -> SyntaxStablePtrId<'db> {
37899 self.0
37900 }
37901 fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
37902 TokenRBrace::from_syntax_node(db, self.0.lookup(db))
37903 }
37904}
37905impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
37906 fn from(ptr: TokenRBracePtr<'db>) -> Self {
37907 ptr.untyped()
37908 }
37909}
37910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37911pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
37912impl<'db> TokenRBraceGreen<'db> {
37913 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37914 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37915 }
37916}
37917impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
37918 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
37919 type StablePtr = TokenRBracePtr<'db>;
37920 type Green = TokenRBraceGreen<'db>;
37921 fn missing(db: &'db dyn Database) -> Self::Green {
37922 TokenRBraceGreen(
37923 GreenNode {
37924 kind: SyntaxKind::TokenMissing,
37925 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37926 }
37927 .intern(db),
37928 )
37929 }
37930 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37931 match node.green_node(db).details {
37932 GreenNodeDetails::Token(_) => Self { node },
37933 GreenNodeDetails::Node { .. } => {
37934 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
37935 }
37936 }
37937 }
37938 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37939 match node.green_node(db).details {
37940 GreenNodeDetails::Token(_) => Some(Self { node }),
37941 GreenNodeDetails::Node { .. } => None,
37942 }
37943 }
37944 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37945 self.node
37946 }
37947 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37948 TokenRBracePtr(self.node.stable_ptr(db))
37949 }
37950}
37951#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37952pub struct TerminalRBrace<'db> {
37953 node: SyntaxNode<'db>,
37954}
37955impl<'db> Terminal<'db> for TerminalRBrace<'db> {
37956 const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
37957 type TokenType = TokenRBrace<'db>;
37958 fn new_green(
37959 db: &'db dyn Database,
37960 leading_trivia: TriviaGreen<'db>,
37961 token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37962 trailing_trivia: TriviaGreen<'db>,
37963 ) -> Self::Green {
37964 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37965 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37966 TerminalRBraceGreen(
37967 GreenNode {
37968 kind: SyntaxKind::TerminalRBrace,
37969 details: GreenNodeDetails::Node { children: children.into(), width },
37970 }
37971 .intern(db),
37972 )
37973 }
37974 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37975 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37976 unreachable!("Expected a node, not a token");
37977 };
37978 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37979 }
37980}
37981impl<'db> TerminalRBrace<'db> {
37982 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37983 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37984 }
37985 pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
37986 TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
37987 }
37988 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37989 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37990 }
37991}
37992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37993pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
37994impl<'db> TerminalRBracePtr<'db> {}
37995impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
37996 type SyntaxNode = TerminalRBrace<'db>;
37997 fn untyped(self) -> SyntaxStablePtrId<'db> {
37998 self.0
37999 }
38000 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38001 TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38002 }
38003}
38004impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38005 fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38006 ptr.untyped()
38007 }
38008}
38009#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38010pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38011impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38012 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38013 type StablePtr = TerminalRBracePtr<'db>;
38014 type Green = TerminalRBraceGreen<'db>;
38015 fn missing(db: &'db dyn Database) -> Self::Green {
38016 TerminalRBraceGreen(
38017 GreenNode {
38018 kind: SyntaxKind::TerminalRBrace,
38019 details: GreenNodeDetails::Node {
38020 children: [
38021 Trivia::missing(db).0,
38022 TokenRBrace::missing(db).0,
38023 Trivia::missing(db).0,
38024 ]
38025 .into(),
38026 width: TextWidth::default(),
38027 },
38028 }
38029 .intern(db),
38030 )
38031 }
38032 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38033 let kind = node.kind(db);
38034 assert_eq!(
38035 kind,
38036 SyntaxKind::TerminalRBrace,
38037 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38038 kind,
38039 SyntaxKind::TerminalRBrace
38040 );
38041 Self { node }
38042 }
38043 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38044 let kind = node.kind(db);
38045 if kind == SyntaxKind::TerminalRBrace {
38046 Some(Self::from_syntax_node(db, node))
38047 } else {
38048 None
38049 }
38050 }
38051 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38052 self.node
38053 }
38054 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38055 TerminalRBracePtr(self.node.stable_ptr(db))
38056 }
38057}
38058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38059pub struct TokenRBrack<'db> {
38060 node: SyntaxNode<'db>,
38061}
38062impl<'db> Token<'db> for TokenRBrack<'db> {
38063 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38064 TokenRBrackGreen(
38065 GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38066 .intern(db),
38067 )
38068 }
38069 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38070 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38071 }
38072}
38073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38074pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38075impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38076 type SyntaxNode = TokenRBrack<'db>;
38077 fn untyped(self) -> SyntaxStablePtrId<'db> {
38078 self.0
38079 }
38080 fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38081 TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38082 }
38083}
38084impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38085 fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38086 ptr.untyped()
38087 }
38088}
38089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38090pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38091impl<'db> TokenRBrackGreen<'db> {
38092 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38093 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38094 }
38095}
38096impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38097 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38098 type StablePtr = TokenRBrackPtr<'db>;
38099 type Green = TokenRBrackGreen<'db>;
38100 fn missing(db: &'db dyn Database) -> Self::Green {
38101 TokenRBrackGreen(
38102 GreenNode {
38103 kind: SyntaxKind::TokenMissing,
38104 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38105 }
38106 .intern(db),
38107 )
38108 }
38109 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38110 match node.green_node(db).details {
38111 GreenNodeDetails::Token(_) => Self { node },
38112 GreenNodeDetails::Node { .. } => {
38113 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38114 }
38115 }
38116 }
38117 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38118 match node.green_node(db).details {
38119 GreenNodeDetails::Token(_) => Some(Self { node }),
38120 GreenNodeDetails::Node { .. } => None,
38121 }
38122 }
38123 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38124 self.node
38125 }
38126 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38127 TokenRBrackPtr(self.node.stable_ptr(db))
38128 }
38129}
38130#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38131pub struct TerminalRBrack<'db> {
38132 node: SyntaxNode<'db>,
38133}
38134impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38135 const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38136 type TokenType = TokenRBrack<'db>;
38137 fn new_green(
38138 db: &'db dyn Database,
38139 leading_trivia: TriviaGreen<'db>,
38140 token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38141 trailing_trivia: TriviaGreen<'db>,
38142 ) -> Self::Green {
38143 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38144 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38145 TerminalRBrackGreen(
38146 GreenNode {
38147 kind: SyntaxKind::TerminalRBrack,
38148 details: GreenNodeDetails::Node { children: children.into(), width },
38149 }
38150 .intern(db),
38151 )
38152 }
38153 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38154 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38155 unreachable!("Expected a node, not a token");
38156 };
38157 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38158 }
38159}
38160impl<'db> TerminalRBrack<'db> {
38161 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38162 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38163 }
38164 pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38165 TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38166 }
38167 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38168 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38169 }
38170}
38171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38172pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38173impl<'db> TerminalRBrackPtr<'db> {}
38174impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38175 type SyntaxNode = TerminalRBrack<'db>;
38176 fn untyped(self) -> SyntaxStablePtrId<'db> {
38177 self.0
38178 }
38179 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38180 TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38181 }
38182}
38183impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38184 fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38185 ptr.untyped()
38186 }
38187}
38188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38189pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38190impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38191 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38192 type StablePtr = TerminalRBrackPtr<'db>;
38193 type Green = TerminalRBrackGreen<'db>;
38194 fn missing(db: &'db dyn Database) -> Self::Green {
38195 TerminalRBrackGreen(
38196 GreenNode {
38197 kind: SyntaxKind::TerminalRBrack,
38198 details: GreenNodeDetails::Node {
38199 children: [
38200 Trivia::missing(db).0,
38201 TokenRBrack::missing(db).0,
38202 Trivia::missing(db).0,
38203 ]
38204 .into(),
38205 width: TextWidth::default(),
38206 },
38207 }
38208 .intern(db),
38209 )
38210 }
38211 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38212 let kind = node.kind(db);
38213 assert_eq!(
38214 kind,
38215 SyntaxKind::TerminalRBrack,
38216 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38217 kind,
38218 SyntaxKind::TerminalRBrack
38219 );
38220 Self { node }
38221 }
38222 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38223 let kind = node.kind(db);
38224 if kind == SyntaxKind::TerminalRBrack {
38225 Some(Self::from_syntax_node(db, node))
38226 } else {
38227 None
38228 }
38229 }
38230 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38231 self.node
38232 }
38233 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38234 TerminalRBrackPtr(self.node.stable_ptr(db))
38235 }
38236}
38237#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38238pub struct TokenRParen<'db> {
38239 node: SyntaxNode<'db>,
38240}
38241impl<'db> Token<'db> for TokenRParen<'db> {
38242 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38243 TokenRParenGreen(
38244 GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38245 .intern(db),
38246 )
38247 }
38248 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38249 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38250 }
38251}
38252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38253pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38254impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38255 type SyntaxNode = TokenRParen<'db>;
38256 fn untyped(self) -> SyntaxStablePtrId<'db> {
38257 self.0
38258 }
38259 fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38260 TokenRParen::from_syntax_node(db, self.0.lookup(db))
38261 }
38262}
38263impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38264 fn from(ptr: TokenRParenPtr<'db>) -> Self {
38265 ptr.untyped()
38266 }
38267}
38268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38269pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38270impl<'db> TokenRParenGreen<'db> {
38271 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38272 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38273 }
38274}
38275impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38276 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38277 type StablePtr = TokenRParenPtr<'db>;
38278 type Green = TokenRParenGreen<'db>;
38279 fn missing(db: &'db dyn Database) -> Self::Green {
38280 TokenRParenGreen(
38281 GreenNode {
38282 kind: SyntaxKind::TokenMissing,
38283 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38284 }
38285 .intern(db),
38286 )
38287 }
38288 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38289 match node.green_node(db).details {
38290 GreenNodeDetails::Token(_) => Self { node },
38291 GreenNodeDetails::Node { .. } => {
38292 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38293 }
38294 }
38295 }
38296 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38297 match node.green_node(db).details {
38298 GreenNodeDetails::Token(_) => Some(Self { node }),
38299 GreenNodeDetails::Node { .. } => None,
38300 }
38301 }
38302 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38303 self.node
38304 }
38305 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38306 TokenRParenPtr(self.node.stable_ptr(db))
38307 }
38308}
38309#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38310pub struct TerminalRParen<'db> {
38311 node: SyntaxNode<'db>,
38312}
38313impl<'db> Terminal<'db> for TerminalRParen<'db> {
38314 const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38315 type TokenType = TokenRParen<'db>;
38316 fn new_green(
38317 db: &'db dyn Database,
38318 leading_trivia: TriviaGreen<'db>,
38319 token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38320 trailing_trivia: TriviaGreen<'db>,
38321 ) -> Self::Green {
38322 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38323 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38324 TerminalRParenGreen(
38325 GreenNode {
38326 kind: SyntaxKind::TerminalRParen,
38327 details: GreenNodeDetails::Node { children: children.into(), width },
38328 }
38329 .intern(db),
38330 )
38331 }
38332 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38333 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38334 unreachable!("Expected a node, not a token");
38335 };
38336 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38337 }
38338}
38339impl<'db> TerminalRParen<'db> {
38340 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38341 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38342 }
38343 pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38344 TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38345 }
38346 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38347 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38348 }
38349}
38350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38351pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38352impl<'db> TerminalRParenPtr<'db> {}
38353impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38354 type SyntaxNode = TerminalRParen<'db>;
38355 fn untyped(self) -> SyntaxStablePtrId<'db> {
38356 self.0
38357 }
38358 fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38359 TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38360 }
38361}
38362impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38363 fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38364 ptr.untyped()
38365 }
38366}
38367#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38368pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38369impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38370 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38371 type StablePtr = TerminalRParenPtr<'db>;
38372 type Green = TerminalRParenGreen<'db>;
38373 fn missing(db: &'db dyn Database) -> Self::Green {
38374 TerminalRParenGreen(
38375 GreenNode {
38376 kind: SyntaxKind::TerminalRParen,
38377 details: GreenNodeDetails::Node {
38378 children: [
38379 Trivia::missing(db).0,
38380 TokenRParen::missing(db).0,
38381 Trivia::missing(db).0,
38382 ]
38383 .into(),
38384 width: TextWidth::default(),
38385 },
38386 }
38387 .intern(db),
38388 )
38389 }
38390 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38391 let kind = node.kind(db);
38392 assert_eq!(
38393 kind,
38394 SyntaxKind::TerminalRParen,
38395 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38396 kind,
38397 SyntaxKind::TerminalRParen
38398 );
38399 Self { node }
38400 }
38401 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38402 let kind = node.kind(db);
38403 if kind == SyntaxKind::TerminalRParen {
38404 Some(Self::from_syntax_node(db, node))
38405 } else {
38406 None
38407 }
38408 }
38409 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38410 self.node
38411 }
38412 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38413 TerminalRParenPtr(self.node.stable_ptr(db))
38414 }
38415}
38416#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38417pub struct TokenSemicolon<'db> {
38418 node: SyntaxNode<'db>,
38419}
38420impl<'db> Token<'db> for TokenSemicolon<'db> {
38421 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38422 TokenSemicolonGreen(
38423 GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38424 .intern(db),
38425 )
38426 }
38427 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38428 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38429 }
38430}
38431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38432pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38433impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38434 type SyntaxNode = TokenSemicolon<'db>;
38435 fn untyped(self) -> SyntaxStablePtrId<'db> {
38436 self.0
38437 }
38438 fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38439 TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38440 }
38441}
38442impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38443 fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38444 ptr.untyped()
38445 }
38446}
38447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38448pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38449impl<'db> TokenSemicolonGreen<'db> {
38450 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38451 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38452 }
38453}
38454impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38455 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38456 type StablePtr = TokenSemicolonPtr<'db>;
38457 type Green = TokenSemicolonGreen<'db>;
38458 fn missing(db: &'db dyn Database) -> Self::Green {
38459 TokenSemicolonGreen(
38460 GreenNode {
38461 kind: SyntaxKind::TokenMissing,
38462 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38463 }
38464 .intern(db),
38465 )
38466 }
38467 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38468 match node.green_node(db).details {
38469 GreenNodeDetails::Token(_) => Self { node },
38470 GreenNodeDetails::Node { .. } => {
38471 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38472 }
38473 }
38474 }
38475 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38476 match node.green_node(db).details {
38477 GreenNodeDetails::Token(_) => Some(Self { node }),
38478 GreenNodeDetails::Node { .. } => None,
38479 }
38480 }
38481 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38482 self.node
38483 }
38484 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38485 TokenSemicolonPtr(self.node.stable_ptr(db))
38486 }
38487}
38488#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38489pub struct TerminalSemicolon<'db> {
38490 node: SyntaxNode<'db>,
38491}
38492impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38493 const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38494 type TokenType = TokenSemicolon<'db>;
38495 fn new_green(
38496 db: &'db dyn Database,
38497 leading_trivia: TriviaGreen<'db>,
38498 token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38499 trailing_trivia: TriviaGreen<'db>,
38500 ) -> Self::Green {
38501 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38502 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38503 TerminalSemicolonGreen(
38504 GreenNode {
38505 kind: SyntaxKind::TerminalSemicolon,
38506 details: GreenNodeDetails::Node { children: children.into(), width },
38507 }
38508 .intern(db),
38509 )
38510 }
38511 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38512 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38513 unreachable!("Expected a node, not a token");
38514 };
38515 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38516 }
38517}
38518impl<'db> TerminalSemicolon<'db> {
38519 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38520 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38521 }
38522 pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38523 TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38524 }
38525 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38526 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38527 }
38528}
38529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38530pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38531impl<'db> TerminalSemicolonPtr<'db> {}
38532impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
38533 type SyntaxNode = TerminalSemicolon<'db>;
38534 fn untyped(self) -> SyntaxStablePtrId<'db> {
38535 self.0
38536 }
38537 fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
38538 TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
38539 }
38540}
38541impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38542 fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
38543 ptr.untyped()
38544 }
38545}
38546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38547pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
38548impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
38549 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
38550 type StablePtr = TerminalSemicolonPtr<'db>;
38551 type Green = TerminalSemicolonGreen<'db>;
38552 fn missing(db: &'db dyn Database) -> Self::Green {
38553 TerminalSemicolonGreen(
38554 GreenNode {
38555 kind: SyntaxKind::TerminalSemicolon,
38556 details: GreenNodeDetails::Node {
38557 children: [
38558 Trivia::missing(db).0,
38559 TokenSemicolon::missing(db).0,
38560 Trivia::missing(db).0,
38561 ]
38562 .into(),
38563 width: TextWidth::default(),
38564 },
38565 }
38566 .intern(db),
38567 )
38568 }
38569 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38570 let kind = node.kind(db);
38571 assert_eq!(
38572 kind,
38573 SyntaxKind::TerminalSemicolon,
38574 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38575 kind,
38576 SyntaxKind::TerminalSemicolon
38577 );
38578 Self { node }
38579 }
38580 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38581 let kind = node.kind(db);
38582 if kind == SyntaxKind::TerminalSemicolon {
38583 Some(Self::from_syntax_node(db, node))
38584 } else {
38585 None
38586 }
38587 }
38588 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38589 self.node
38590 }
38591 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38592 TerminalSemicolonPtr(self.node.stable_ptr(db))
38593 }
38594}
38595#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38596pub struct TokenUnderscore<'db> {
38597 node: SyntaxNode<'db>,
38598}
38599impl<'db> Token<'db> for TokenUnderscore<'db> {
38600 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38601 TokenUnderscoreGreen(
38602 GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
38603 .intern(db),
38604 )
38605 }
38606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38607 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38608 }
38609}
38610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38611pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38612impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
38613 type SyntaxNode = TokenUnderscore<'db>;
38614 fn untyped(self) -> SyntaxStablePtrId<'db> {
38615 self.0
38616 }
38617 fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38618 TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
38619 }
38620}
38621impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38622 fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
38623 ptr.untyped()
38624 }
38625}
38626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38627pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
38628impl<'db> TokenUnderscoreGreen<'db> {
38629 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38630 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38631 }
38632}
38633impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
38634 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
38635 type StablePtr = TokenUnderscorePtr<'db>;
38636 type Green = TokenUnderscoreGreen<'db>;
38637 fn missing(db: &'db dyn Database) -> Self::Green {
38638 TokenUnderscoreGreen(
38639 GreenNode {
38640 kind: SyntaxKind::TokenMissing,
38641 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38642 }
38643 .intern(db),
38644 )
38645 }
38646 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38647 match node.green_node(db).details {
38648 GreenNodeDetails::Token(_) => Self { node },
38649 GreenNodeDetails::Node { .. } => {
38650 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
38651 }
38652 }
38653 }
38654 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38655 match node.green_node(db).details {
38656 GreenNodeDetails::Token(_) => Some(Self { node }),
38657 GreenNodeDetails::Node { .. } => None,
38658 }
38659 }
38660 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38661 self.node
38662 }
38663 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38664 TokenUnderscorePtr(self.node.stable_ptr(db))
38665 }
38666}
38667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38668pub struct TerminalUnderscore<'db> {
38669 node: SyntaxNode<'db>,
38670}
38671impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
38672 const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
38673 type TokenType = TokenUnderscore<'db>;
38674 fn new_green(
38675 db: &'db dyn Database,
38676 leading_trivia: TriviaGreen<'db>,
38677 token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38678 trailing_trivia: TriviaGreen<'db>,
38679 ) -> Self::Green {
38680 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38681 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38682 TerminalUnderscoreGreen(
38683 GreenNode {
38684 kind: SyntaxKind::TerminalUnderscore,
38685 details: GreenNodeDetails::Node { children: children.into(), width },
38686 }
38687 .intern(db),
38688 )
38689 }
38690 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38691 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38692 unreachable!("Expected a node, not a token");
38693 };
38694 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38695 }
38696}
38697impl<'db> TerminalUnderscore<'db> {
38698 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38699 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38700 }
38701 pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38702 TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
38703 }
38704 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38705 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38706 }
38707}
38708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38709pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38710impl<'db> TerminalUnderscorePtr<'db> {}
38711impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
38712 type SyntaxNode = TerminalUnderscore<'db>;
38713 fn untyped(self) -> SyntaxStablePtrId<'db> {
38714 self.0
38715 }
38716 fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
38717 TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
38718 }
38719}
38720impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38721 fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
38722 ptr.untyped()
38723 }
38724}
38725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38726pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
38727impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
38728 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
38729 type StablePtr = TerminalUnderscorePtr<'db>;
38730 type Green = TerminalUnderscoreGreen<'db>;
38731 fn missing(db: &'db dyn Database) -> Self::Green {
38732 TerminalUnderscoreGreen(
38733 GreenNode {
38734 kind: SyntaxKind::TerminalUnderscore,
38735 details: GreenNodeDetails::Node {
38736 children: [
38737 Trivia::missing(db).0,
38738 TokenUnderscore::missing(db).0,
38739 Trivia::missing(db).0,
38740 ]
38741 .into(),
38742 width: TextWidth::default(),
38743 },
38744 }
38745 .intern(db),
38746 )
38747 }
38748 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38749 let kind = node.kind(db);
38750 assert_eq!(
38751 kind,
38752 SyntaxKind::TerminalUnderscore,
38753 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38754 kind,
38755 SyntaxKind::TerminalUnderscore
38756 );
38757 Self { node }
38758 }
38759 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38760 let kind = node.kind(db);
38761 if kind == SyntaxKind::TerminalUnderscore {
38762 Some(Self::from_syntax_node(db, node))
38763 } else {
38764 None
38765 }
38766 }
38767 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38768 self.node
38769 }
38770 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38771 TerminalUnderscorePtr(self.node.stable_ptr(db))
38772 }
38773}
38774#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38775pub struct TokenXor<'db> {
38776 node: SyntaxNode<'db>,
38777}
38778impl<'db> Token<'db> for TokenXor<'db> {
38779 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38780 TokenXorGreen(
38781 GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
38782 .intern(db),
38783 )
38784 }
38785 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38786 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38787 }
38788}
38789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38790pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
38791impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
38792 type SyntaxNode = TokenXor<'db>;
38793 fn untyped(self) -> SyntaxStablePtrId<'db> {
38794 self.0
38795 }
38796 fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
38797 TokenXor::from_syntax_node(db, self.0.lookup(db))
38798 }
38799}
38800impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
38801 fn from(ptr: TokenXorPtr<'db>) -> Self {
38802 ptr.untyped()
38803 }
38804}
38805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38806pub struct TokenXorGreen<'db>(pub GreenId<'db>);
38807impl<'db> TokenXorGreen<'db> {
38808 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38809 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38810 }
38811}
38812impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
38813 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
38814 type StablePtr = TokenXorPtr<'db>;
38815 type Green = TokenXorGreen<'db>;
38816 fn missing(db: &'db dyn Database) -> Self::Green {
38817 TokenXorGreen(
38818 GreenNode {
38819 kind: SyntaxKind::TokenMissing,
38820 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38821 }
38822 .intern(db),
38823 )
38824 }
38825 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38826 match node.green_node(db).details {
38827 GreenNodeDetails::Token(_) => Self { node },
38828 GreenNodeDetails::Node { .. } => {
38829 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
38830 }
38831 }
38832 }
38833 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38834 match node.green_node(db).details {
38835 GreenNodeDetails::Token(_) => Some(Self { node }),
38836 GreenNodeDetails::Node { .. } => None,
38837 }
38838 }
38839 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38840 self.node
38841 }
38842 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38843 TokenXorPtr(self.node.stable_ptr(db))
38844 }
38845}
38846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38847pub struct TerminalXor<'db> {
38848 node: SyntaxNode<'db>,
38849}
38850impl<'db> Terminal<'db> for TerminalXor<'db> {
38851 const KIND: SyntaxKind = SyntaxKind::TerminalXor;
38852 type TokenType = TokenXor<'db>;
38853 fn new_green(
38854 db: &'db dyn Database,
38855 leading_trivia: TriviaGreen<'db>,
38856 token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38857 trailing_trivia: TriviaGreen<'db>,
38858 ) -> Self::Green {
38859 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38860 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38861 TerminalXorGreen(
38862 GreenNode {
38863 kind: SyntaxKind::TerminalXor,
38864 details: GreenNodeDetails::Node { children: children.into(), width },
38865 }
38866 .intern(db),
38867 )
38868 }
38869 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38870 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38871 unreachable!("Expected a node, not a token");
38872 };
38873 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38874 }
38875}
38876impl<'db> TerminalXor<'db> {
38877 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38878 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38879 }
38880 pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
38881 TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
38882 }
38883 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38884 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38885 }
38886}
38887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38888pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
38889impl<'db> TerminalXorPtr<'db> {}
38890impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
38891 type SyntaxNode = TerminalXor<'db>;
38892 fn untyped(self) -> SyntaxStablePtrId<'db> {
38893 self.0
38894 }
38895 fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
38896 TerminalXor::from_syntax_node(db, self.0.lookup(db))
38897 }
38898}
38899impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
38900 fn from(ptr: TerminalXorPtr<'db>) -> Self {
38901 ptr.untyped()
38902 }
38903}
38904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38905pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
38906impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
38907 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
38908 type StablePtr = TerminalXorPtr<'db>;
38909 type Green = TerminalXorGreen<'db>;
38910 fn missing(db: &'db dyn Database) -> Self::Green {
38911 TerminalXorGreen(
38912 GreenNode {
38913 kind: SyntaxKind::TerminalXor,
38914 details: GreenNodeDetails::Node {
38915 children: [
38916 Trivia::missing(db).0,
38917 TokenXor::missing(db).0,
38918 Trivia::missing(db).0,
38919 ]
38920 .into(),
38921 width: TextWidth::default(),
38922 },
38923 }
38924 .intern(db),
38925 )
38926 }
38927 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38928 let kind = node.kind(db);
38929 assert_eq!(
38930 kind,
38931 SyntaxKind::TerminalXor,
38932 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38933 kind,
38934 SyntaxKind::TerminalXor
38935 );
38936 Self { node }
38937 }
38938 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38939 let kind = node.kind(db);
38940 if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
38941 }
38942 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38943 self.node
38944 }
38945 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38946 TerminalXorPtr(self.node.stable_ptr(db))
38947 }
38948}
38949#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38950pub struct SyntaxFile<'db> {
38951 node: SyntaxNode<'db>,
38952}
38953impl<'db> SyntaxFile<'db> {
38954 pub const INDEX_ITEMS: usize = 0;
38955 pub const INDEX_EOF: usize = 1;
38956 pub fn new_green(
38957 db: &'db dyn Database,
38958 items: ModuleItemListGreen<'db>,
38959 eof: TerminalEndOfFileGreen<'db>,
38960 ) -> SyntaxFileGreen<'db> {
38961 let children = [items.0, eof.0];
38962 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38963 SyntaxFileGreen(
38964 GreenNode {
38965 kind: SyntaxKind::SyntaxFile,
38966 details: GreenNodeDetails::Node { children: children.into(), width },
38967 }
38968 .intern(db),
38969 )
38970 }
38971}
38972impl<'db> SyntaxFile<'db> {
38973 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
38974 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
38975 }
38976 pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
38977 TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
38978 }
38979}
38980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38981pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
38982impl<'db> SyntaxFilePtr<'db> {}
38983impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
38984 type SyntaxNode = SyntaxFile<'db>;
38985 fn untyped(self) -> SyntaxStablePtrId<'db> {
38986 self.0
38987 }
38988 fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
38989 SyntaxFile::from_syntax_node(db, self.0.lookup(db))
38990 }
38991}
38992impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
38993 fn from(ptr: SyntaxFilePtr<'db>) -> Self {
38994 ptr.untyped()
38995 }
38996}
38997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38998pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
38999impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39000 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39001 type StablePtr = SyntaxFilePtr<'db>;
39002 type Green = SyntaxFileGreen<'db>;
39003 fn missing(db: &'db dyn Database) -> Self::Green {
39004 SyntaxFileGreen(
39005 GreenNode {
39006 kind: SyntaxKind::SyntaxFile,
39007 details: GreenNodeDetails::Node {
39008 children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39009 .into(),
39010 width: TextWidth::default(),
39011 },
39012 }
39013 .intern(db),
39014 )
39015 }
39016 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39017 let kind = node.kind(db);
39018 assert_eq!(
39019 kind,
39020 SyntaxKind::SyntaxFile,
39021 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39022 kind,
39023 SyntaxKind::SyntaxFile
39024 );
39025 Self { node }
39026 }
39027 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39028 let kind = node.kind(db);
39029 if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39030 }
39031 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39032 self.node
39033 }
39034 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39035 SyntaxFilePtr(self.node.stable_ptr(db))
39036 }
39037}
39038#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39039pub struct TokenEmpty<'db> {
39040 node: SyntaxNode<'db>,
39041}
39042impl<'db> Token<'db> for TokenEmpty<'db> {
39043 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39044 TokenEmptyGreen(
39045 GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39046 .intern(db),
39047 )
39048 }
39049 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39050 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39051 }
39052}
39053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39054pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39055impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39056 type SyntaxNode = TokenEmpty<'db>;
39057 fn untyped(self) -> SyntaxStablePtrId<'db> {
39058 self.0
39059 }
39060 fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39061 TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39062 }
39063}
39064impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39065 fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39066 ptr.untyped()
39067 }
39068}
39069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39070pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39071impl<'db> TokenEmptyGreen<'db> {
39072 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39073 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39074 }
39075}
39076impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39077 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39078 type StablePtr = TokenEmptyPtr<'db>;
39079 type Green = TokenEmptyGreen<'db>;
39080 fn missing(db: &'db dyn Database) -> Self::Green {
39081 TokenEmptyGreen(
39082 GreenNode {
39083 kind: SyntaxKind::TokenMissing,
39084 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39085 }
39086 .intern(db),
39087 )
39088 }
39089 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39090 match node.green_node(db).details {
39091 GreenNodeDetails::Token(_) => Self { node },
39092 GreenNodeDetails::Node { .. } => {
39093 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39094 }
39095 }
39096 }
39097 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39098 match node.green_node(db).details {
39099 GreenNodeDetails::Token(_) => Some(Self { node }),
39100 GreenNodeDetails::Node { .. } => None,
39101 }
39102 }
39103 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39104 self.node
39105 }
39106 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39107 TokenEmptyPtr(self.node.stable_ptr(db))
39108 }
39109}
39110#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39111pub struct TerminalEmpty<'db> {
39112 node: SyntaxNode<'db>,
39113}
39114impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39115 const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39116 type TokenType = TokenEmpty<'db>;
39117 fn new_green(
39118 db: &'db dyn Database,
39119 leading_trivia: TriviaGreen<'db>,
39120 token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39121 trailing_trivia: TriviaGreen<'db>,
39122 ) -> Self::Green {
39123 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39124 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39125 TerminalEmptyGreen(
39126 GreenNode {
39127 kind: SyntaxKind::TerminalEmpty,
39128 details: GreenNodeDetails::Node { children: children.into(), width },
39129 }
39130 .intern(db),
39131 )
39132 }
39133 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39134 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39135 unreachable!("Expected a node, not a token");
39136 };
39137 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39138 }
39139}
39140impl<'db> TerminalEmpty<'db> {
39141 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39142 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39143 }
39144 pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39145 TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39146 }
39147 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39148 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39149 }
39150}
39151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39152pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39153impl<'db> TerminalEmptyPtr<'db> {}
39154impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39155 type SyntaxNode = TerminalEmpty<'db>;
39156 fn untyped(self) -> SyntaxStablePtrId<'db> {
39157 self.0
39158 }
39159 fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39160 TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39161 }
39162}
39163impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39164 fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39165 ptr.untyped()
39166 }
39167}
39168#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39169pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39170impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39171 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39172 type StablePtr = TerminalEmptyPtr<'db>;
39173 type Green = TerminalEmptyGreen<'db>;
39174 fn missing(db: &'db dyn Database) -> Self::Green {
39175 TerminalEmptyGreen(
39176 GreenNode {
39177 kind: SyntaxKind::TerminalEmpty,
39178 details: GreenNodeDetails::Node {
39179 children: [
39180 Trivia::missing(db).0,
39181 TokenEmpty::missing(db).0,
39182 Trivia::missing(db).0,
39183 ]
39184 .into(),
39185 width: TextWidth::default(),
39186 },
39187 }
39188 .intern(db),
39189 )
39190 }
39191 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39192 let kind = node.kind(db);
39193 assert_eq!(
39194 kind,
39195 SyntaxKind::TerminalEmpty,
39196 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39197 kind,
39198 SyntaxKind::TerminalEmpty
39199 );
39200 Self { node }
39201 }
39202 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39203 let kind = node.kind(db);
39204 if kind == SyntaxKind::TerminalEmpty {
39205 Some(Self::from_syntax_node(db, node))
39206 } else {
39207 None
39208 }
39209 }
39210 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39211 self.node
39212 }
39213 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39214 TerminalEmptyPtr(self.node.stable_ptr(db))
39215 }
39216}
39217#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39218pub struct TokenSingleLineComment<'db> {
39219 node: SyntaxNode<'db>,
39220}
39221impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39222 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39223 TokenSingleLineCommentGreen(
39224 GreenNode {
39225 kind: SyntaxKind::TokenSingleLineComment,
39226 details: GreenNodeDetails::Token(text),
39227 }
39228 .intern(db),
39229 )
39230 }
39231 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39232 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39233 }
39234}
39235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39236pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39237impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39238 type SyntaxNode = TokenSingleLineComment<'db>;
39239 fn untyped(self) -> SyntaxStablePtrId<'db> {
39240 self.0
39241 }
39242 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39243 TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39244 }
39245}
39246impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39247 fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39248 ptr.untyped()
39249 }
39250}
39251#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39252pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39253impl<'db> TokenSingleLineCommentGreen<'db> {
39254 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39255 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39256 }
39257}
39258impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39259 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39260 type StablePtr = TokenSingleLineCommentPtr<'db>;
39261 type Green = TokenSingleLineCommentGreen<'db>;
39262 fn missing(db: &'db dyn Database) -> Self::Green {
39263 TokenSingleLineCommentGreen(
39264 GreenNode {
39265 kind: SyntaxKind::TokenMissing,
39266 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39267 }
39268 .intern(db),
39269 )
39270 }
39271 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39272 match node.green_node(db).details {
39273 GreenNodeDetails::Token(_) => Self { node },
39274 GreenNodeDetails::Node { .. } => panic!(
39275 "Expected a token {:?}, not an internal node",
39276 SyntaxKind::TokenSingleLineComment
39277 ),
39278 }
39279 }
39280 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39281 match node.green_node(db).details {
39282 GreenNodeDetails::Token(_) => Some(Self { node }),
39283 GreenNodeDetails::Node { .. } => None,
39284 }
39285 }
39286 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39287 self.node
39288 }
39289 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39290 TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39291 }
39292}
39293#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39294pub struct TokenSingleLineInnerComment<'db> {
39295 node: SyntaxNode<'db>,
39296}
39297impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39298 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39299 TokenSingleLineInnerCommentGreen(
39300 GreenNode {
39301 kind: SyntaxKind::TokenSingleLineInnerComment,
39302 details: GreenNodeDetails::Token(text),
39303 }
39304 .intern(db),
39305 )
39306 }
39307 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39308 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39309 }
39310}
39311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39312pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39313impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39314 type SyntaxNode = TokenSingleLineInnerComment<'db>;
39315 fn untyped(self) -> SyntaxStablePtrId<'db> {
39316 self.0
39317 }
39318 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39319 TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39320 }
39321}
39322impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39323 fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39324 ptr.untyped()
39325 }
39326}
39327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39328pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39329impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39330 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39331 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39332 }
39333}
39334impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39335 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39336 type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39337 type Green = TokenSingleLineInnerCommentGreen<'db>;
39338 fn missing(db: &'db dyn Database) -> Self::Green {
39339 TokenSingleLineInnerCommentGreen(
39340 GreenNode {
39341 kind: SyntaxKind::TokenMissing,
39342 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39343 }
39344 .intern(db),
39345 )
39346 }
39347 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39348 match node.green_node(db).details {
39349 GreenNodeDetails::Token(_) => Self { node },
39350 GreenNodeDetails::Node { .. } => panic!(
39351 "Expected a token {:?}, not an internal node",
39352 SyntaxKind::TokenSingleLineInnerComment
39353 ),
39354 }
39355 }
39356 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39357 match node.green_node(db).details {
39358 GreenNodeDetails::Token(_) => Some(Self { node }),
39359 GreenNodeDetails::Node { .. } => None,
39360 }
39361 }
39362 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39363 self.node
39364 }
39365 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39366 TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39367 }
39368}
39369#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39370pub struct TokenSingleLineDocComment<'db> {
39371 node: SyntaxNode<'db>,
39372}
39373impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39374 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39375 TokenSingleLineDocCommentGreen(
39376 GreenNode {
39377 kind: SyntaxKind::TokenSingleLineDocComment,
39378 details: GreenNodeDetails::Token(text),
39379 }
39380 .intern(db),
39381 )
39382 }
39383 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39384 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39385 }
39386}
39387#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39388pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39389impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39390 type SyntaxNode = TokenSingleLineDocComment<'db>;
39391 fn untyped(self) -> SyntaxStablePtrId<'db> {
39392 self.0
39393 }
39394 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39395 TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39396 }
39397}
39398impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39399 fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39400 ptr.untyped()
39401 }
39402}
39403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39404pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39405impl<'db> TokenSingleLineDocCommentGreen<'db> {
39406 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39407 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39408 }
39409}
39410impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39411 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39412 type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39413 type Green = TokenSingleLineDocCommentGreen<'db>;
39414 fn missing(db: &'db dyn Database) -> Self::Green {
39415 TokenSingleLineDocCommentGreen(
39416 GreenNode {
39417 kind: SyntaxKind::TokenMissing,
39418 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39419 }
39420 .intern(db),
39421 )
39422 }
39423 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39424 match node.green_node(db).details {
39425 GreenNodeDetails::Token(_) => Self { node },
39426 GreenNodeDetails::Node { .. } => panic!(
39427 "Expected a token {:?}, not an internal node",
39428 SyntaxKind::TokenSingleLineDocComment
39429 ),
39430 }
39431 }
39432 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39433 match node.green_node(db).details {
39434 GreenNodeDetails::Token(_) => Some(Self { node }),
39435 GreenNodeDetails::Node { .. } => None,
39436 }
39437 }
39438 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39439 self.node
39440 }
39441 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39442 TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39443 }
39444}
39445#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39446pub struct TokenWhitespace<'db> {
39447 node: SyntaxNode<'db>,
39448}
39449impl<'db> Token<'db> for TokenWhitespace<'db> {
39450 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39451 TokenWhitespaceGreen(
39452 GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39453 .intern(db),
39454 )
39455 }
39456 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39457 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39458 }
39459}
39460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39461pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39462impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39463 type SyntaxNode = TokenWhitespace<'db>;
39464 fn untyped(self) -> SyntaxStablePtrId<'db> {
39465 self.0
39466 }
39467 fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39468 TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39469 }
39470}
39471impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39472 fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39473 ptr.untyped()
39474 }
39475}
39476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39477pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39478impl<'db> TokenWhitespaceGreen<'db> {
39479 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39480 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39481 }
39482}
39483impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39484 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39485 type StablePtr = TokenWhitespacePtr<'db>;
39486 type Green = TokenWhitespaceGreen<'db>;
39487 fn missing(db: &'db dyn Database) -> Self::Green {
39488 TokenWhitespaceGreen(
39489 GreenNode {
39490 kind: SyntaxKind::TokenMissing,
39491 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39492 }
39493 .intern(db),
39494 )
39495 }
39496 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39497 match node.green_node(db).details {
39498 GreenNodeDetails::Token(_) => Self { node },
39499 GreenNodeDetails::Node { .. } => {
39500 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39501 }
39502 }
39503 }
39504 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39505 match node.green_node(db).details {
39506 GreenNodeDetails::Token(_) => Some(Self { node }),
39507 GreenNodeDetails::Node { .. } => None,
39508 }
39509 }
39510 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39511 self.node
39512 }
39513 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39514 TokenWhitespacePtr(self.node.stable_ptr(db))
39515 }
39516}
39517#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39518pub struct TokenNewline<'db> {
39519 node: SyntaxNode<'db>,
39520}
39521impl<'db> Token<'db> for TokenNewline<'db> {
39522 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39523 TokenNewlineGreen(
39524 GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39525 .intern(db),
39526 )
39527 }
39528 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39529 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39530 }
39531}
39532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39533pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
39534impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
39535 type SyntaxNode = TokenNewline<'db>;
39536 fn untyped(self) -> SyntaxStablePtrId<'db> {
39537 self.0
39538 }
39539 fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
39540 TokenNewline::from_syntax_node(db, self.0.lookup(db))
39541 }
39542}
39543impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
39544 fn from(ptr: TokenNewlinePtr<'db>) -> Self {
39545 ptr.untyped()
39546 }
39547}
39548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39549pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
39550impl<'db> TokenNewlineGreen<'db> {
39551 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39552 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39553 }
39554}
39555impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
39556 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
39557 type StablePtr = TokenNewlinePtr<'db>;
39558 type Green = TokenNewlineGreen<'db>;
39559 fn missing(db: &'db dyn Database) -> Self::Green {
39560 TokenNewlineGreen(
39561 GreenNode {
39562 kind: SyntaxKind::TokenMissing,
39563 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39564 }
39565 .intern(db),
39566 )
39567 }
39568 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39569 match node.green_node(db).details {
39570 GreenNodeDetails::Token(_) => Self { node },
39571 GreenNodeDetails::Node { .. } => {
39572 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
39573 }
39574 }
39575 }
39576 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39577 match node.green_node(db).details {
39578 GreenNodeDetails::Token(_) => Some(Self { node }),
39579 GreenNodeDetails::Node { .. } => None,
39580 }
39581 }
39582 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39583 self.node
39584 }
39585 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39586 TokenNewlinePtr(self.node.stable_ptr(db))
39587 }
39588}
39589#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39590pub struct TokenMissing<'db> {
39591 node: SyntaxNode<'db>,
39592}
39593impl<'db> Token<'db> for TokenMissing<'db> {
39594 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39595 TokenMissingGreen(
39596 GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
39597 .intern(db),
39598 )
39599 }
39600 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39601 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39602 }
39603}
39604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39605pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
39606impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
39607 type SyntaxNode = TokenMissing<'db>;
39608 fn untyped(self) -> SyntaxStablePtrId<'db> {
39609 self.0
39610 }
39611 fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
39612 TokenMissing::from_syntax_node(db, self.0.lookup(db))
39613 }
39614}
39615impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
39616 fn from(ptr: TokenMissingPtr<'db>) -> Self {
39617 ptr.untyped()
39618 }
39619}
39620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39621pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
39622impl<'db> TokenMissingGreen<'db> {
39623 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39624 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39625 }
39626}
39627impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
39628 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
39629 type StablePtr = TokenMissingPtr<'db>;
39630 type Green = TokenMissingGreen<'db>;
39631 fn missing(db: &'db dyn Database) -> Self::Green {
39632 TokenMissingGreen(
39633 GreenNode {
39634 kind: SyntaxKind::TokenMissing,
39635 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39636 }
39637 .intern(db),
39638 )
39639 }
39640 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39641 match node.green_node(db).details {
39642 GreenNodeDetails::Token(_) => Self { node },
39643 GreenNodeDetails::Node { .. } => {
39644 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
39645 }
39646 }
39647 }
39648 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39649 match node.green_node(db).details {
39650 GreenNodeDetails::Token(_) => Some(Self { node }),
39651 GreenNodeDetails::Node { .. } => None,
39652 }
39653 }
39654 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39655 self.node
39656 }
39657 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39658 TokenMissingPtr(self.node.stable_ptr(db))
39659 }
39660}
39661#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39662pub struct TokenSkipped<'db> {
39663 node: SyntaxNode<'db>,
39664}
39665impl<'db> Token<'db> for TokenSkipped<'db> {
39666 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39667 TokenSkippedGreen(
39668 GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
39669 .intern(db),
39670 )
39671 }
39672 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39673 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39674 }
39675}
39676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39677pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
39678impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
39679 type SyntaxNode = TokenSkipped<'db>;
39680 fn untyped(self) -> SyntaxStablePtrId<'db> {
39681 self.0
39682 }
39683 fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
39684 TokenSkipped::from_syntax_node(db, self.0.lookup(db))
39685 }
39686}
39687impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
39688 fn from(ptr: TokenSkippedPtr<'db>) -> Self {
39689 ptr.untyped()
39690 }
39691}
39692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39693pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
39694impl<'db> TokenSkippedGreen<'db> {
39695 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39696 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39697 }
39698}
39699impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
39700 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
39701 type StablePtr = TokenSkippedPtr<'db>;
39702 type Green = TokenSkippedGreen<'db>;
39703 fn missing(db: &'db dyn Database) -> Self::Green {
39704 TokenSkippedGreen(
39705 GreenNode {
39706 kind: SyntaxKind::TokenMissing,
39707 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39708 }
39709 .intern(db),
39710 )
39711 }
39712 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39713 match node.green_node(db).details {
39714 GreenNodeDetails::Token(_) => Self { node },
39715 GreenNodeDetails::Node { .. } => {
39716 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
39717 }
39718 }
39719 }
39720 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39721 match node.green_node(db).details {
39722 GreenNodeDetails::Token(_) => Some(Self { node }),
39723 GreenNodeDetails::Node { .. } => None,
39724 }
39725 }
39726 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39727 self.node
39728 }
39729 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39730 TokenSkippedPtr(self.node.stable_ptr(db))
39731 }
39732}
39733#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39734pub enum TokenNode<'db> {
39735 TerminalIdentifier(TerminalIdentifier<'db>),
39736 TerminalLiteralNumber(TerminalLiteralNumber<'db>),
39737 TerminalShortString(TerminalShortString<'db>),
39738 TerminalString(TerminalString<'db>),
39739 TerminalAs(TerminalAs<'db>),
39740 TerminalConst(TerminalConst<'db>),
39741 TerminalElse(TerminalElse<'db>),
39742 TerminalEnum(TerminalEnum<'db>),
39743 TerminalExtern(TerminalExtern<'db>),
39744 TerminalFalse(TerminalFalse<'db>),
39745 TerminalFunction(TerminalFunction<'db>),
39746 TerminalIf(TerminalIf<'db>),
39747 TerminalWhile(TerminalWhile<'db>),
39748 TerminalFor(TerminalFor<'db>),
39749 TerminalLoop(TerminalLoop<'db>),
39750 TerminalImpl(TerminalImpl<'db>),
39751 TerminalImplicits(TerminalImplicits<'db>),
39752 TerminalLet(TerminalLet<'db>),
39753 TerminalMacro(TerminalMacro<'db>),
39754 TerminalMatch(TerminalMatch<'db>),
39755 TerminalModule(TerminalModule<'db>),
39756 TerminalMut(TerminalMut<'db>),
39757 TerminalNoPanic(TerminalNoPanic<'db>),
39758 TerminalOf(TerminalOf<'db>),
39759 TerminalRef(TerminalRef<'db>),
39760 TerminalContinue(TerminalContinue<'db>),
39761 TerminalReturn(TerminalReturn<'db>),
39762 TerminalBreak(TerminalBreak<'db>),
39763 TerminalStruct(TerminalStruct<'db>),
39764 TerminalTrait(TerminalTrait<'db>),
39765 TerminalTrue(TerminalTrue<'db>),
39766 TerminalType(TerminalType<'db>),
39767 TerminalUse(TerminalUse<'db>),
39768 TerminalPub(TerminalPub<'db>),
39769 TerminalAnd(TerminalAnd<'db>),
39770 TerminalAndAnd(TerminalAndAnd<'db>),
39771 TerminalArrow(TerminalArrow<'db>),
39772 TerminalAt(TerminalAt<'db>),
39773 TerminalBadCharacters(TerminalBadCharacters<'db>),
39774 TerminalColon(TerminalColon<'db>),
39775 TerminalColonColon(TerminalColonColon<'db>),
39776 TerminalComma(TerminalComma<'db>),
39777 TerminalDiv(TerminalDiv<'db>),
39778 TerminalDivEq(TerminalDivEq<'db>),
39779 TerminalDollar(TerminalDollar<'db>),
39780 TerminalDot(TerminalDot<'db>),
39781 TerminalDotDot(TerminalDotDot<'db>),
39782 TerminalDotDotEq(TerminalDotDotEq<'db>),
39783 TerminalEndOfFile(TerminalEndOfFile<'db>),
39784 TerminalEq(TerminalEq<'db>),
39785 TerminalEqEq(TerminalEqEq<'db>),
39786 TerminalGE(TerminalGE<'db>),
39787 TerminalGT(TerminalGT<'db>),
39788 TerminalHash(TerminalHash<'db>),
39789 TerminalLBrace(TerminalLBrace<'db>),
39790 TerminalLBrack(TerminalLBrack<'db>),
39791 TerminalLE(TerminalLE<'db>),
39792 TerminalLParen(TerminalLParen<'db>),
39793 TerminalLT(TerminalLT<'db>),
39794 TerminalMatchArrow(TerminalMatchArrow<'db>),
39795 TerminalMinus(TerminalMinus<'db>),
39796 TerminalMinusEq(TerminalMinusEq<'db>),
39797 TerminalMod(TerminalMod<'db>),
39798 TerminalModEq(TerminalModEq<'db>),
39799 TerminalMul(TerminalMul<'db>),
39800 TerminalMulEq(TerminalMulEq<'db>),
39801 TerminalNeq(TerminalNeq<'db>),
39802 TerminalNot(TerminalNot<'db>),
39803 TerminalBitNot(TerminalBitNot<'db>),
39804 TerminalOr(TerminalOr<'db>),
39805 TerminalOrOr(TerminalOrOr<'db>),
39806 TerminalPlus(TerminalPlus<'db>),
39807 TerminalPlusEq(TerminalPlusEq<'db>),
39808 TerminalQuestionMark(TerminalQuestionMark<'db>),
39809 TerminalRBrace(TerminalRBrace<'db>),
39810 TerminalRBrack(TerminalRBrack<'db>),
39811 TerminalRParen(TerminalRParen<'db>),
39812 TerminalSemicolon(TerminalSemicolon<'db>),
39813 TerminalUnderscore(TerminalUnderscore<'db>),
39814 TerminalXor(TerminalXor<'db>),
39815 TerminalEmpty(TerminalEmpty<'db>),
39816}
39817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39818pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
39819impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
39820 type SyntaxNode = TokenNode<'db>;
39821 fn untyped(self) -> SyntaxStablePtrId<'db> {
39822 self.0
39823 }
39824 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
39825 TokenNode::from_syntax_node(db, self.0.lookup(db))
39826 }
39827}
39828impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
39829 fn from(ptr: TokenNodePtr<'db>) -> Self {
39830 ptr.untyped()
39831 }
39832}
39833impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
39834 fn from(value: TerminalIdentifierPtr<'db>) -> Self {
39835 Self(value.0)
39836 }
39837}
39838impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
39839 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
39840 Self(value.0)
39841 }
39842}
39843impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
39844 fn from(value: TerminalShortStringPtr<'db>) -> Self {
39845 Self(value.0)
39846 }
39847}
39848impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
39849 fn from(value: TerminalStringPtr<'db>) -> Self {
39850 Self(value.0)
39851 }
39852}
39853impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
39854 fn from(value: TerminalAsPtr<'db>) -> Self {
39855 Self(value.0)
39856 }
39857}
39858impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
39859 fn from(value: TerminalConstPtr<'db>) -> Self {
39860 Self(value.0)
39861 }
39862}
39863impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
39864 fn from(value: TerminalElsePtr<'db>) -> Self {
39865 Self(value.0)
39866 }
39867}
39868impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
39869 fn from(value: TerminalEnumPtr<'db>) -> Self {
39870 Self(value.0)
39871 }
39872}
39873impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
39874 fn from(value: TerminalExternPtr<'db>) -> Self {
39875 Self(value.0)
39876 }
39877}
39878impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
39879 fn from(value: TerminalFalsePtr<'db>) -> Self {
39880 Self(value.0)
39881 }
39882}
39883impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
39884 fn from(value: TerminalFunctionPtr<'db>) -> Self {
39885 Self(value.0)
39886 }
39887}
39888impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
39889 fn from(value: TerminalIfPtr<'db>) -> Self {
39890 Self(value.0)
39891 }
39892}
39893impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
39894 fn from(value: TerminalWhilePtr<'db>) -> Self {
39895 Self(value.0)
39896 }
39897}
39898impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
39899 fn from(value: TerminalForPtr<'db>) -> Self {
39900 Self(value.0)
39901 }
39902}
39903impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
39904 fn from(value: TerminalLoopPtr<'db>) -> Self {
39905 Self(value.0)
39906 }
39907}
39908impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
39909 fn from(value: TerminalImplPtr<'db>) -> Self {
39910 Self(value.0)
39911 }
39912}
39913impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
39914 fn from(value: TerminalImplicitsPtr<'db>) -> Self {
39915 Self(value.0)
39916 }
39917}
39918impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
39919 fn from(value: TerminalLetPtr<'db>) -> Self {
39920 Self(value.0)
39921 }
39922}
39923impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
39924 fn from(value: TerminalMacroPtr<'db>) -> Self {
39925 Self(value.0)
39926 }
39927}
39928impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
39929 fn from(value: TerminalMatchPtr<'db>) -> Self {
39930 Self(value.0)
39931 }
39932}
39933impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
39934 fn from(value: TerminalModulePtr<'db>) -> Self {
39935 Self(value.0)
39936 }
39937}
39938impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
39939 fn from(value: TerminalMutPtr<'db>) -> Self {
39940 Self(value.0)
39941 }
39942}
39943impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
39944 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
39945 Self(value.0)
39946 }
39947}
39948impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
39949 fn from(value: TerminalOfPtr<'db>) -> Self {
39950 Self(value.0)
39951 }
39952}
39953impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
39954 fn from(value: TerminalRefPtr<'db>) -> Self {
39955 Self(value.0)
39956 }
39957}
39958impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
39959 fn from(value: TerminalContinuePtr<'db>) -> Self {
39960 Self(value.0)
39961 }
39962}
39963impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
39964 fn from(value: TerminalReturnPtr<'db>) -> Self {
39965 Self(value.0)
39966 }
39967}
39968impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
39969 fn from(value: TerminalBreakPtr<'db>) -> Self {
39970 Self(value.0)
39971 }
39972}
39973impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
39974 fn from(value: TerminalStructPtr<'db>) -> Self {
39975 Self(value.0)
39976 }
39977}
39978impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
39979 fn from(value: TerminalTraitPtr<'db>) -> Self {
39980 Self(value.0)
39981 }
39982}
39983impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
39984 fn from(value: TerminalTruePtr<'db>) -> Self {
39985 Self(value.0)
39986 }
39987}
39988impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
39989 fn from(value: TerminalTypePtr<'db>) -> Self {
39990 Self(value.0)
39991 }
39992}
39993impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
39994 fn from(value: TerminalUsePtr<'db>) -> Self {
39995 Self(value.0)
39996 }
39997}
39998impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
39999 fn from(value: TerminalPubPtr<'db>) -> Self {
40000 Self(value.0)
40001 }
40002}
40003impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40004 fn from(value: TerminalAndPtr<'db>) -> Self {
40005 Self(value.0)
40006 }
40007}
40008impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40009 fn from(value: TerminalAndAndPtr<'db>) -> Self {
40010 Self(value.0)
40011 }
40012}
40013impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40014 fn from(value: TerminalArrowPtr<'db>) -> Self {
40015 Self(value.0)
40016 }
40017}
40018impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40019 fn from(value: TerminalAtPtr<'db>) -> Self {
40020 Self(value.0)
40021 }
40022}
40023impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40024 fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40025 Self(value.0)
40026 }
40027}
40028impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40029 fn from(value: TerminalColonPtr<'db>) -> Self {
40030 Self(value.0)
40031 }
40032}
40033impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40034 fn from(value: TerminalColonColonPtr<'db>) -> Self {
40035 Self(value.0)
40036 }
40037}
40038impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40039 fn from(value: TerminalCommaPtr<'db>) -> Self {
40040 Self(value.0)
40041 }
40042}
40043impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40044 fn from(value: TerminalDivPtr<'db>) -> Self {
40045 Self(value.0)
40046 }
40047}
40048impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40049 fn from(value: TerminalDivEqPtr<'db>) -> Self {
40050 Self(value.0)
40051 }
40052}
40053impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40054 fn from(value: TerminalDollarPtr<'db>) -> Self {
40055 Self(value.0)
40056 }
40057}
40058impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40059 fn from(value: TerminalDotPtr<'db>) -> Self {
40060 Self(value.0)
40061 }
40062}
40063impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40064 fn from(value: TerminalDotDotPtr<'db>) -> Self {
40065 Self(value.0)
40066 }
40067}
40068impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40069 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40070 Self(value.0)
40071 }
40072}
40073impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40074 fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40075 Self(value.0)
40076 }
40077}
40078impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40079 fn from(value: TerminalEqPtr<'db>) -> Self {
40080 Self(value.0)
40081 }
40082}
40083impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40084 fn from(value: TerminalEqEqPtr<'db>) -> Self {
40085 Self(value.0)
40086 }
40087}
40088impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40089 fn from(value: TerminalGEPtr<'db>) -> Self {
40090 Self(value.0)
40091 }
40092}
40093impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40094 fn from(value: TerminalGTPtr<'db>) -> Self {
40095 Self(value.0)
40096 }
40097}
40098impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40099 fn from(value: TerminalHashPtr<'db>) -> Self {
40100 Self(value.0)
40101 }
40102}
40103impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40104 fn from(value: TerminalLBracePtr<'db>) -> Self {
40105 Self(value.0)
40106 }
40107}
40108impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40109 fn from(value: TerminalLBrackPtr<'db>) -> Self {
40110 Self(value.0)
40111 }
40112}
40113impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40114 fn from(value: TerminalLEPtr<'db>) -> Self {
40115 Self(value.0)
40116 }
40117}
40118impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40119 fn from(value: TerminalLParenPtr<'db>) -> Self {
40120 Self(value.0)
40121 }
40122}
40123impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40124 fn from(value: TerminalLTPtr<'db>) -> Self {
40125 Self(value.0)
40126 }
40127}
40128impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40129 fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40130 Self(value.0)
40131 }
40132}
40133impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40134 fn from(value: TerminalMinusPtr<'db>) -> Self {
40135 Self(value.0)
40136 }
40137}
40138impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40139 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40140 Self(value.0)
40141 }
40142}
40143impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40144 fn from(value: TerminalModPtr<'db>) -> Self {
40145 Self(value.0)
40146 }
40147}
40148impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40149 fn from(value: TerminalModEqPtr<'db>) -> Self {
40150 Self(value.0)
40151 }
40152}
40153impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40154 fn from(value: TerminalMulPtr<'db>) -> Self {
40155 Self(value.0)
40156 }
40157}
40158impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40159 fn from(value: TerminalMulEqPtr<'db>) -> Self {
40160 Self(value.0)
40161 }
40162}
40163impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40164 fn from(value: TerminalNeqPtr<'db>) -> Self {
40165 Self(value.0)
40166 }
40167}
40168impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40169 fn from(value: TerminalNotPtr<'db>) -> Self {
40170 Self(value.0)
40171 }
40172}
40173impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40174 fn from(value: TerminalBitNotPtr<'db>) -> Self {
40175 Self(value.0)
40176 }
40177}
40178impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40179 fn from(value: TerminalOrPtr<'db>) -> Self {
40180 Self(value.0)
40181 }
40182}
40183impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40184 fn from(value: TerminalOrOrPtr<'db>) -> Self {
40185 Self(value.0)
40186 }
40187}
40188impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40189 fn from(value: TerminalPlusPtr<'db>) -> Self {
40190 Self(value.0)
40191 }
40192}
40193impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40194 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40195 Self(value.0)
40196 }
40197}
40198impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40199 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40200 Self(value.0)
40201 }
40202}
40203impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40204 fn from(value: TerminalRBracePtr<'db>) -> Self {
40205 Self(value.0)
40206 }
40207}
40208impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40209 fn from(value: TerminalRBrackPtr<'db>) -> Self {
40210 Self(value.0)
40211 }
40212}
40213impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40214 fn from(value: TerminalRParenPtr<'db>) -> Self {
40215 Self(value.0)
40216 }
40217}
40218impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40219 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40220 Self(value.0)
40221 }
40222}
40223impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40224 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40225 Self(value.0)
40226 }
40227}
40228impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40229 fn from(value: TerminalXorPtr<'db>) -> Self {
40230 Self(value.0)
40231 }
40232}
40233impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40234 fn from(value: TerminalEmptyPtr<'db>) -> Self {
40235 Self(value.0)
40236 }
40237}
40238impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40239 fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40240 Self(value.0)
40241 }
40242}
40243impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40244 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40245 Self(value.0)
40246 }
40247}
40248impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40249 fn from(value: TerminalShortStringGreen<'db>) -> Self {
40250 Self(value.0)
40251 }
40252}
40253impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40254 fn from(value: TerminalStringGreen<'db>) -> Self {
40255 Self(value.0)
40256 }
40257}
40258impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40259 fn from(value: TerminalAsGreen<'db>) -> Self {
40260 Self(value.0)
40261 }
40262}
40263impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40264 fn from(value: TerminalConstGreen<'db>) -> Self {
40265 Self(value.0)
40266 }
40267}
40268impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40269 fn from(value: TerminalElseGreen<'db>) -> Self {
40270 Self(value.0)
40271 }
40272}
40273impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40274 fn from(value: TerminalEnumGreen<'db>) -> Self {
40275 Self(value.0)
40276 }
40277}
40278impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40279 fn from(value: TerminalExternGreen<'db>) -> Self {
40280 Self(value.0)
40281 }
40282}
40283impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40284 fn from(value: TerminalFalseGreen<'db>) -> Self {
40285 Self(value.0)
40286 }
40287}
40288impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40289 fn from(value: TerminalFunctionGreen<'db>) -> Self {
40290 Self(value.0)
40291 }
40292}
40293impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40294 fn from(value: TerminalIfGreen<'db>) -> Self {
40295 Self(value.0)
40296 }
40297}
40298impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40299 fn from(value: TerminalWhileGreen<'db>) -> Self {
40300 Self(value.0)
40301 }
40302}
40303impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40304 fn from(value: TerminalForGreen<'db>) -> Self {
40305 Self(value.0)
40306 }
40307}
40308impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40309 fn from(value: TerminalLoopGreen<'db>) -> Self {
40310 Self(value.0)
40311 }
40312}
40313impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40314 fn from(value: TerminalImplGreen<'db>) -> Self {
40315 Self(value.0)
40316 }
40317}
40318impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40319 fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40320 Self(value.0)
40321 }
40322}
40323impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40324 fn from(value: TerminalLetGreen<'db>) -> Self {
40325 Self(value.0)
40326 }
40327}
40328impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40329 fn from(value: TerminalMacroGreen<'db>) -> Self {
40330 Self(value.0)
40331 }
40332}
40333impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40334 fn from(value: TerminalMatchGreen<'db>) -> Self {
40335 Self(value.0)
40336 }
40337}
40338impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40339 fn from(value: TerminalModuleGreen<'db>) -> Self {
40340 Self(value.0)
40341 }
40342}
40343impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40344 fn from(value: TerminalMutGreen<'db>) -> Self {
40345 Self(value.0)
40346 }
40347}
40348impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40349 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40350 Self(value.0)
40351 }
40352}
40353impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40354 fn from(value: TerminalOfGreen<'db>) -> Self {
40355 Self(value.0)
40356 }
40357}
40358impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40359 fn from(value: TerminalRefGreen<'db>) -> Self {
40360 Self(value.0)
40361 }
40362}
40363impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40364 fn from(value: TerminalContinueGreen<'db>) -> Self {
40365 Self(value.0)
40366 }
40367}
40368impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40369 fn from(value: TerminalReturnGreen<'db>) -> Self {
40370 Self(value.0)
40371 }
40372}
40373impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40374 fn from(value: TerminalBreakGreen<'db>) -> Self {
40375 Self(value.0)
40376 }
40377}
40378impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40379 fn from(value: TerminalStructGreen<'db>) -> Self {
40380 Self(value.0)
40381 }
40382}
40383impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40384 fn from(value: TerminalTraitGreen<'db>) -> Self {
40385 Self(value.0)
40386 }
40387}
40388impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40389 fn from(value: TerminalTrueGreen<'db>) -> Self {
40390 Self(value.0)
40391 }
40392}
40393impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40394 fn from(value: TerminalTypeGreen<'db>) -> Self {
40395 Self(value.0)
40396 }
40397}
40398impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40399 fn from(value: TerminalUseGreen<'db>) -> Self {
40400 Self(value.0)
40401 }
40402}
40403impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40404 fn from(value: TerminalPubGreen<'db>) -> Self {
40405 Self(value.0)
40406 }
40407}
40408impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40409 fn from(value: TerminalAndGreen<'db>) -> Self {
40410 Self(value.0)
40411 }
40412}
40413impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40414 fn from(value: TerminalAndAndGreen<'db>) -> Self {
40415 Self(value.0)
40416 }
40417}
40418impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40419 fn from(value: TerminalArrowGreen<'db>) -> Self {
40420 Self(value.0)
40421 }
40422}
40423impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40424 fn from(value: TerminalAtGreen<'db>) -> Self {
40425 Self(value.0)
40426 }
40427}
40428impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40429 fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40430 Self(value.0)
40431 }
40432}
40433impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40434 fn from(value: TerminalColonGreen<'db>) -> Self {
40435 Self(value.0)
40436 }
40437}
40438impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40439 fn from(value: TerminalColonColonGreen<'db>) -> Self {
40440 Self(value.0)
40441 }
40442}
40443impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40444 fn from(value: TerminalCommaGreen<'db>) -> Self {
40445 Self(value.0)
40446 }
40447}
40448impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40449 fn from(value: TerminalDivGreen<'db>) -> Self {
40450 Self(value.0)
40451 }
40452}
40453impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40454 fn from(value: TerminalDivEqGreen<'db>) -> Self {
40455 Self(value.0)
40456 }
40457}
40458impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40459 fn from(value: TerminalDollarGreen<'db>) -> Self {
40460 Self(value.0)
40461 }
40462}
40463impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40464 fn from(value: TerminalDotGreen<'db>) -> Self {
40465 Self(value.0)
40466 }
40467}
40468impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40469 fn from(value: TerminalDotDotGreen<'db>) -> Self {
40470 Self(value.0)
40471 }
40472}
40473impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40474 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40475 Self(value.0)
40476 }
40477}
40478impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40479 fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40480 Self(value.0)
40481 }
40482}
40483impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40484 fn from(value: TerminalEqGreen<'db>) -> Self {
40485 Self(value.0)
40486 }
40487}
40488impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40489 fn from(value: TerminalEqEqGreen<'db>) -> Self {
40490 Self(value.0)
40491 }
40492}
40493impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40494 fn from(value: TerminalGEGreen<'db>) -> Self {
40495 Self(value.0)
40496 }
40497}
40498impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40499 fn from(value: TerminalGTGreen<'db>) -> Self {
40500 Self(value.0)
40501 }
40502}
40503impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40504 fn from(value: TerminalHashGreen<'db>) -> Self {
40505 Self(value.0)
40506 }
40507}
40508impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40509 fn from(value: TerminalLBraceGreen<'db>) -> Self {
40510 Self(value.0)
40511 }
40512}
40513impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40514 fn from(value: TerminalLBrackGreen<'db>) -> Self {
40515 Self(value.0)
40516 }
40517}
40518impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40519 fn from(value: TerminalLEGreen<'db>) -> Self {
40520 Self(value.0)
40521 }
40522}
40523impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40524 fn from(value: TerminalLParenGreen<'db>) -> Self {
40525 Self(value.0)
40526 }
40527}
40528impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
40529 fn from(value: TerminalLTGreen<'db>) -> Self {
40530 Self(value.0)
40531 }
40532}
40533impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
40534 fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
40535 Self(value.0)
40536 }
40537}
40538impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
40539 fn from(value: TerminalMinusGreen<'db>) -> Self {
40540 Self(value.0)
40541 }
40542}
40543impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
40544 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
40545 Self(value.0)
40546 }
40547}
40548impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
40549 fn from(value: TerminalModGreen<'db>) -> Self {
40550 Self(value.0)
40551 }
40552}
40553impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
40554 fn from(value: TerminalModEqGreen<'db>) -> Self {
40555 Self(value.0)
40556 }
40557}
40558impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
40559 fn from(value: TerminalMulGreen<'db>) -> Self {
40560 Self(value.0)
40561 }
40562}
40563impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
40564 fn from(value: TerminalMulEqGreen<'db>) -> Self {
40565 Self(value.0)
40566 }
40567}
40568impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
40569 fn from(value: TerminalNeqGreen<'db>) -> Self {
40570 Self(value.0)
40571 }
40572}
40573impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
40574 fn from(value: TerminalNotGreen<'db>) -> Self {
40575 Self(value.0)
40576 }
40577}
40578impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
40579 fn from(value: TerminalBitNotGreen<'db>) -> Self {
40580 Self(value.0)
40581 }
40582}
40583impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
40584 fn from(value: TerminalOrGreen<'db>) -> Self {
40585 Self(value.0)
40586 }
40587}
40588impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
40589 fn from(value: TerminalOrOrGreen<'db>) -> Self {
40590 Self(value.0)
40591 }
40592}
40593impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
40594 fn from(value: TerminalPlusGreen<'db>) -> Self {
40595 Self(value.0)
40596 }
40597}
40598impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
40599 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
40600 Self(value.0)
40601 }
40602}
40603impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
40604 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
40605 Self(value.0)
40606 }
40607}
40608impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
40609 fn from(value: TerminalRBraceGreen<'db>) -> Self {
40610 Self(value.0)
40611 }
40612}
40613impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
40614 fn from(value: TerminalRBrackGreen<'db>) -> Self {
40615 Self(value.0)
40616 }
40617}
40618impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
40619 fn from(value: TerminalRParenGreen<'db>) -> Self {
40620 Self(value.0)
40621 }
40622}
40623impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
40624 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
40625 Self(value.0)
40626 }
40627}
40628impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
40629 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
40630 Self(value.0)
40631 }
40632}
40633impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
40634 fn from(value: TerminalXorGreen<'db>) -> Self {
40635 Self(value.0)
40636 }
40637}
40638impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
40639 fn from(value: TerminalEmptyGreen<'db>) -> Self {
40640 Self(value.0)
40641 }
40642}
40643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40644pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
40645impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
40646 const OPTIONAL_KIND: Option<SyntaxKind> = None;
40647 type StablePtr = TokenNodePtr<'db>;
40648 type Green = TokenNodeGreen<'db>;
40649 fn missing(db: &'db dyn Database) -> Self::Green {
40650 panic!("No missing variant.");
40651 }
40652 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40653 let kind = node.kind(db);
40654 match kind {
40655 SyntaxKind::TerminalIdentifier => {
40656 TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
40657 }
40658 SyntaxKind::TerminalLiteralNumber => {
40659 TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
40660 }
40661 SyntaxKind::TerminalShortString => {
40662 TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
40663 }
40664 SyntaxKind::TerminalString => {
40665 TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
40666 }
40667 SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
40668 SyntaxKind::TerminalConst => {
40669 TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
40670 }
40671 SyntaxKind::TerminalElse => {
40672 TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
40673 }
40674 SyntaxKind::TerminalEnum => {
40675 TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
40676 }
40677 SyntaxKind::TerminalExtern => {
40678 TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
40679 }
40680 SyntaxKind::TerminalFalse => {
40681 TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
40682 }
40683 SyntaxKind::TerminalFunction => {
40684 TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
40685 }
40686 SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
40687 SyntaxKind::TerminalWhile => {
40688 TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
40689 }
40690 SyntaxKind::TerminalFor => {
40691 TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
40692 }
40693 SyntaxKind::TerminalLoop => {
40694 TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
40695 }
40696 SyntaxKind::TerminalImpl => {
40697 TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
40698 }
40699 SyntaxKind::TerminalImplicits => {
40700 TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
40701 }
40702 SyntaxKind::TerminalLet => {
40703 TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
40704 }
40705 SyntaxKind::TerminalMacro => {
40706 TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
40707 }
40708 SyntaxKind::TerminalMatch => {
40709 TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
40710 }
40711 SyntaxKind::TerminalModule => {
40712 TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
40713 }
40714 SyntaxKind::TerminalMut => {
40715 TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
40716 }
40717 SyntaxKind::TerminalNoPanic => {
40718 TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
40719 }
40720 SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
40721 SyntaxKind::TerminalRef => {
40722 TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
40723 }
40724 SyntaxKind::TerminalContinue => {
40725 TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
40726 }
40727 SyntaxKind::TerminalReturn => {
40728 TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
40729 }
40730 SyntaxKind::TerminalBreak => {
40731 TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
40732 }
40733 SyntaxKind::TerminalStruct => {
40734 TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
40735 }
40736 SyntaxKind::TerminalTrait => {
40737 TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
40738 }
40739 SyntaxKind::TerminalTrue => {
40740 TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
40741 }
40742 SyntaxKind::TerminalType => {
40743 TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
40744 }
40745 SyntaxKind::TerminalUse => {
40746 TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
40747 }
40748 SyntaxKind::TerminalPub => {
40749 TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
40750 }
40751 SyntaxKind::TerminalAnd => {
40752 TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
40753 }
40754 SyntaxKind::TerminalAndAnd => {
40755 TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
40756 }
40757 SyntaxKind::TerminalArrow => {
40758 TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
40759 }
40760 SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
40761 SyntaxKind::TerminalBadCharacters => {
40762 TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
40763 }
40764 SyntaxKind::TerminalColon => {
40765 TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
40766 }
40767 SyntaxKind::TerminalColonColon => {
40768 TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
40769 }
40770 SyntaxKind::TerminalComma => {
40771 TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
40772 }
40773 SyntaxKind::TerminalDiv => {
40774 TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
40775 }
40776 SyntaxKind::TerminalDivEq => {
40777 TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
40778 }
40779 SyntaxKind::TerminalDollar => {
40780 TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
40781 }
40782 SyntaxKind::TerminalDot => {
40783 TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
40784 }
40785 SyntaxKind::TerminalDotDot => {
40786 TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
40787 }
40788 SyntaxKind::TerminalDotDotEq => {
40789 TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
40790 }
40791 SyntaxKind::TerminalEndOfFile => {
40792 TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
40793 }
40794 SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
40795 SyntaxKind::TerminalEqEq => {
40796 TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
40797 }
40798 SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
40799 SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
40800 SyntaxKind::TerminalHash => {
40801 TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
40802 }
40803 SyntaxKind::TerminalLBrace => {
40804 TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
40805 }
40806 SyntaxKind::TerminalLBrack => {
40807 TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
40808 }
40809 SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
40810 SyntaxKind::TerminalLParen => {
40811 TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
40812 }
40813 SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
40814 SyntaxKind::TerminalMatchArrow => {
40815 TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
40816 }
40817 SyntaxKind::TerminalMinus => {
40818 TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
40819 }
40820 SyntaxKind::TerminalMinusEq => {
40821 TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
40822 }
40823 SyntaxKind::TerminalMod => {
40824 TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
40825 }
40826 SyntaxKind::TerminalModEq => {
40827 TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
40828 }
40829 SyntaxKind::TerminalMul => {
40830 TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
40831 }
40832 SyntaxKind::TerminalMulEq => {
40833 TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
40834 }
40835 SyntaxKind::TerminalNeq => {
40836 TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
40837 }
40838 SyntaxKind::TerminalNot => {
40839 TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
40840 }
40841 SyntaxKind::TerminalBitNot => {
40842 TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
40843 }
40844 SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
40845 SyntaxKind::TerminalOrOr => {
40846 TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
40847 }
40848 SyntaxKind::TerminalPlus => {
40849 TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
40850 }
40851 SyntaxKind::TerminalPlusEq => {
40852 TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
40853 }
40854 SyntaxKind::TerminalQuestionMark => {
40855 TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
40856 }
40857 SyntaxKind::TerminalRBrace => {
40858 TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
40859 }
40860 SyntaxKind::TerminalRBrack => {
40861 TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
40862 }
40863 SyntaxKind::TerminalRParen => {
40864 TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
40865 }
40866 SyntaxKind::TerminalSemicolon => {
40867 TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
40868 }
40869 SyntaxKind::TerminalUnderscore => {
40870 TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
40871 }
40872 SyntaxKind::TerminalXor => {
40873 TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
40874 }
40875 SyntaxKind::TerminalEmpty => {
40876 TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
40877 }
40878 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
40879 }
40880 }
40881 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40882 let kind = node.kind(db);
40883 match kind {
40884 SyntaxKind::TerminalIdentifier => {
40885 Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
40886 }
40887 SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
40888 TerminalLiteralNumber::from_syntax_node(db, node),
40889 )),
40890 SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
40891 TerminalShortString::from_syntax_node(db, node),
40892 )),
40893 SyntaxKind::TerminalString => {
40894 Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
40895 }
40896 SyntaxKind::TerminalAs => {
40897 Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
40898 }
40899 SyntaxKind::TerminalConst => {
40900 Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
40901 }
40902 SyntaxKind::TerminalElse => {
40903 Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
40904 }
40905 SyntaxKind::TerminalEnum => {
40906 Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
40907 }
40908 SyntaxKind::TerminalExtern => {
40909 Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
40910 }
40911 SyntaxKind::TerminalFalse => {
40912 Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
40913 }
40914 SyntaxKind::TerminalFunction => {
40915 Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
40916 }
40917 SyntaxKind::TerminalIf => {
40918 Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
40919 }
40920 SyntaxKind::TerminalWhile => {
40921 Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
40922 }
40923 SyntaxKind::TerminalFor => {
40924 Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
40925 }
40926 SyntaxKind::TerminalLoop => {
40927 Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
40928 }
40929 SyntaxKind::TerminalImpl => {
40930 Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
40931 }
40932 SyntaxKind::TerminalImplicits => {
40933 Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
40934 }
40935 SyntaxKind::TerminalLet => {
40936 Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
40937 }
40938 SyntaxKind::TerminalMacro => {
40939 Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
40940 }
40941 SyntaxKind::TerminalMatch => {
40942 Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
40943 }
40944 SyntaxKind::TerminalModule => {
40945 Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
40946 }
40947 SyntaxKind::TerminalMut => {
40948 Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
40949 }
40950 SyntaxKind::TerminalNoPanic => {
40951 Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
40952 }
40953 SyntaxKind::TerminalOf => {
40954 Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
40955 }
40956 SyntaxKind::TerminalRef => {
40957 Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
40958 }
40959 SyntaxKind::TerminalContinue => {
40960 Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
40961 }
40962 SyntaxKind::TerminalReturn => {
40963 Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
40964 }
40965 SyntaxKind::TerminalBreak => {
40966 Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
40967 }
40968 SyntaxKind::TerminalStruct => {
40969 Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
40970 }
40971 SyntaxKind::TerminalTrait => {
40972 Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
40973 }
40974 SyntaxKind::TerminalTrue => {
40975 Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
40976 }
40977 SyntaxKind::TerminalType => {
40978 Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
40979 }
40980 SyntaxKind::TerminalUse => {
40981 Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
40982 }
40983 SyntaxKind::TerminalPub => {
40984 Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
40985 }
40986 SyntaxKind::TerminalAnd => {
40987 Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
40988 }
40989 SyntaxKind::TerminalAndAnd => {
40990 Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
40991 }
40992 SyntaxKind::TerminalArrow => {
40993 Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
40994 }
40995 SyntaxKind::TerminalAt => {
40996 Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
40997 }
40998 SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
40999 TerminalBadCharacters::from_syntax_node(db, node),
41000 )),
41001 SyntaxKind::TerminalColon => {
41002 Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41003 }
41004 SyntaxKind::TerminalColonColon => {
41005 Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41006 }
41007 SyntaxKind::TerminalComma => {
41008 Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41009 }
41010 SyntaxKind::TerminalDiv => {
41011 Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41012 }
41013 SyntaxKind::TerminalDivEq => {
41014 Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41015 }
41016 SyntaxKind::TerminalDollar => {
41017 Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41018 }
41019 SyntaxKind::TerminalDot => {
41020 Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41021 }
41022 SyntaxKind::TerminalDotDot => {
41023 Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41024 }
41025 SyntaxKind::TerminalDotDotEq => {
41026 Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41027 }
41028 SyntaxKind::TerminalEndOfFile => {
41029 Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41030 }
41031 SyntaxKind::TerminalEq => {
41032 Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41033 }
41034 SyntaxKind::TerminalEqEq => {
41035 Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41036 }
41037 SyntaxKind::TerminalGE => {
41038 Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41039 }
41040 SyntaxKind::TerminalGT => {
41041 Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41042 }
41043 SyntaxKind::TerminalHash => {
41044 Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41045 }
41046 SyntaxKind::TerminalLBrace => {
41047 Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41048 }
41049 SyntaxKind::TerminalLBrack => {
41050 Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41051 }
41052 SyntaxKind::TerminalLE => {
41053 Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41054 }
41055 SyntaxKind::TerminalLParen => {
41056 Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41057 }
41058 SyntaxKind::TerminalLT => {
41059 Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41060 }
41061 SyntaxKind::TerminalMatchArrow => {
41062 Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41063 }
41064 SyntaxKind::TerminalMinus => {
41065 Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41066 }
41067 SyntaxKind::TerminalMinusEq => {
41068 Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41069 }
41070 SyntaxKind::TerminalMod => {
41071 Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41072 }
41073 SyntaxKind::TerminalModEq => {
41074 Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41075 }
41076 SyntaxKind::TerminalMul => {
41077 Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41078 }
41079 SyntaxKind::TerminalMulEq => {
41080 Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41081 }
41082 SyntaxKind::TerminalNeq => {
41083 Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41084 }
41085 SyntaxKind::TerminalNot => {
41086 Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41087 }
41088 SyntaxKind::TerminalBitNot => {
41089 Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41090 }
41091 SyntaxKind::TerminalOr => {
41092 Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41093 }
41094 SyntaxKind::TerminalOrOr => {
41095 Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41096 }
41097 SyntaxKind::TerminalPlus => {
41098 Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41099 }
41100 SyntaxKind::TerminalPlusEq => {
41101 Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41102 }
41103 SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41104 TerminalQuestionMark::from_syntax_node(db, node),
41105 )),
41106 SyntaxKind::TerminalRBrace => {
41107 Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41108 }
41109 SyntaxKind::TerminalRBrack => {
41110 Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41111 }
41112 SyntaxKind::TerminalRParen => {
41113 Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41114 }
41115 SyntaxKind::TerminalSemicolon => {
41116 Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41117 }
41118 SyntaxKind::TerminalUnderscore => {
41119 Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41120 }
41121 SyntaxKind::TerminalXor => {
41122 Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41123 }
41124 SyntaxKind::TerminalEmpty => {
41125 Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41126 }
41127 _ => None,
41128 }
41129 }
41130 fn as_syntax_node(&self) -> SyntaxNode<'db> {
41131 match self {
41132 TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41133 TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41134 TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41135 TokenNode::TerminalString(x) => x.as_syntax_node(),
41136 TokenNode::TerminalAs(x) => x.as_syntax_node(),
41137 TokenNode::TerminalConst(x) => x.as_syntax_node(),
41138 TokenNode::TerminalElse(x) => x.as_syntax_node(),
41139 TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41140 TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41141 TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41142 TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41143 TokenNode::TerminalIf(x) => x.as_syntax_node(),
41144 TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41145 TokenNode::TerminalFor(x) => x.as_syntax_node(),
41146 TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41147 TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41148 TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41149 TokenNode::TerminalLet(x) => x.as_syntax_node(),
41150 TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41151 TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41152 TokenNode::TerminalModule(x) => x.as_syntax_node(),
41153 TokenNode::TerminalMut(x) => x.as_syntax_node(),
41154 TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41155 TokenNode::TerminalOf(x) => x.as_syntax_node(),
41156 TokenNode::TerminalRef(x) => x.as_syntax_node(),
41157 TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41158 TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41159 TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41160 TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41161 TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41162 TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41163 TokenNode::TerminalType(x) => x.as_syntax_node(),
41164 TokenNode::TerminalUse(x) => x.as_syntax_node(),
41165 TokenNode::TerminalPub(x) => x.as_syntax_node(),
41166 TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41167 TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41168 TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41169 TokenNode::TerminalAt(x) => x.as_syntax_node(),
41170 TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41171 TokenNode::TerminalColon(x) => x.as_syntax_node(),
41172 TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41173 TokenNode::TerminalComma(x) => x.as_syntax_node(),
41174 TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41175 TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41176 TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41177 TokenNode::TerminalDot(x) => x.as_syntax_node(),
41178 TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41179 TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41180 TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41181 TokenNode::TerminalEq(x) => x.as_syntax_node(),
41182 TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41183 TokenNode::TerminalGE(x) => x.as_syntax_node(),
41184 TokenNode::TerminalGT(x) => x.as_syntax_node(),
41185 TokenNode::TerminalHash(x) => x.as_syntax_node(),
41186 TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41187 TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41188 TokenNode::TerminalLE(x) => x.as_syntax_node(),
41189 TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41190 TokenNode::TerminalLT(x) => x.as_syntax_node(),
41191 TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41192 TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41193 TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41194 TokenNode::TerminalMod(x) => x.as_syntax_node(),
41195 TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41196 TokenNode::TerminalMul(x) => x.as_syntax_node(),
41197 TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41198 TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41199 TokenNode::TerminalNot(x) => x.as_syntax_node(),
41200 TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41201 TokenNode::TerminalOr(x) => x.as_syntax_node(),
41202 TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41203 TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41204 TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41205 TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41206 TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41207 TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41208 TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41209 TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41210 TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41211 TokenNode::TerminalXor(x) => x.as_syntax_node(),
41212 TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41213 }
41214 }
41215 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41216 TokenNodePtr(self.as_syntax_node().stable_ptr(db))
41217 }
41218}
41219impl<'db> TokenNode<'db> {
41220 pub fn is_variant(kind: SyntaxKind) -> bool {
41222 matches!(
41223 kind,
41224 SyntaxKind::TerminalIdentifier
41225 | SyntaxKind::TerminalLiteralNumber
41226 | SyntaxKind::TerminalShortString
41227 | SyntaxKind::TerminalString
41228 | SyntaxKind::TerminalAs
41229 | SyntaxKind::TerminalConst
41230 | SyntaxKind::TerminalElse
41231 | SyntaxKind::TerminalEnum
41232 | SyntaxKind::TerminalExtern
41233 | SyntaxKind::TerminalFalse
41234 | SyntaxKind::TerminalFunction
41235 | SyntaxKind::TerminalIf
41236 | SyntaxKind::TerminalWhile
41237 | SyntaxKind::TerminalFor
41238 | SyntaxKind::TerminalLoop
41239 | SyntaxKind::TerminalImpl
41240 | SyntaxKind::TerminalImplicits
41241 | SyntaxKind::TerminalLet
41242 | SyntaxKind::TerminalMacro
41243 | SyntaxKind::TerminalMatch
41244 | SyntaxKind::TerminalModule
41245 | SyntaxKind::TerminalMut
41246 | SyntaxKind::TerminalNoPanic
41247 | SyntaxKind::TerminalOf
41248 | SyntaxKind::TerminalRef
41249 | SyntaxKind::TerminalContinue
41250 | SyntaxKind::TerminalReturn
41251 | SyntaxKind::TerminalBreak
41252 | SyntaxKind::TerminalStruct
41253 | SyntaxKind::TerminalTrait
41254 | SyntaxKind::TerminalTrue
41255 | SyntaxKind::TerminalType
41256 | SyntaxKind::TerminalUse
41257 | SyntaxKind::TerminalPub
41258 | SyntaxKind::TerminalAnd
41259 | SyntaxKind::TerminalAndAnd
41260 | SyntaxKind::TerminalArrow
41261 | SyntaxKind::TerminalAt
41262 | SyntaxKind::TerminalBadCharacters
41263 | SyntaxKind::TerminalColon
41264 | SyntaxKind::TerminalColonColon
41265 | SyntaxKind::TerminalComma
41266 | SyntaxKind::TerminalDiv
41267 | SyntaxKind::TerminalDivEq
41268 | SyntaxKind::TerminalDollar
41269 | SyntaxKind::TerminalDot
41270 | SyntaxKind::TerminalDotDot
41271 | SyntaxKind::TerminalDotDotEq
41272 | SyntaxKind::TerminalEndOfFile
41273 | SyntaxKind::TerminalEq
41274 | SyntaxKind::TerminalEqEq
41275 | SyntaxKind::TerminalGE
41276 | SyntaxKind::TerminalGT
41277 | SyntaxKind::TerminalHash
41278 | SyntaxKind::TerminalLBrace
41279 | SyntaxKind::TerminalLBrack
41280 | SyntaxKind::TerminalLE
41281 | SyntaxKind::TerminalLParen
41282 | SyntaxKind::TerminalLT
41283 | SyntaxKind::TerminalMatchArrow
41284 | SyntaxKind::TerminalMinus
41285 | SyntaxKind::TerminalMinusEq
41286 | SyntaxKind::TerminalMod
41287 | SyntaxKind::TerminalModEq
41288 | SyntaxKind::TerminalMul
41289 | SyntaxKind::TerminalMulEq
41290 | SyntaxKind::TerminalNeq
41291 | SyntaxKind::TerminalNot
41292 | SyntaxKind::TerminalBitNot
41293 | SyntaxKind::TerminalOr
41294 | SyntaxKind::TerminalOrOr
41295 | SyntaxKind::TerminalPlus
41296 | SyntaxKind::TerminalPlusEq
41297 | SyntaxKind::TerminalQuestionMark
41298 | SyntaxKind::TerminalRBrace
41299 | SyntaxKind::TerminalRBrack
41300 | SyntaxKind::TerminalRParen
41301 | SyntaxKind::TerminalSemicolon
41302 | SyntaxKind::TerminalUnderscore
41303 | SyntaxKind::TerminalXor
41304 | SyntaxKind::TerminalEmpty
41305 )
41306 }
41307}