diff options
-rw-r--r-- | crates/ra_hir/src/either.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 14 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast.rs | 4 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 1737 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs.tera | 56 | ||||
-rw-r--r-- | crates/ra_syntax/src/ptr.rs | 8 |
6 files changed, 975 insertions, 850 deletions
diff --git a/crates/ra_hir/src/either.rs b/crates/ra_hir/src/either.rs index 71c53ebc0..439e6ec87 100644 --- a/crates/ra_hir/src/either.rs +++ b/crates/ra_hir/src/either.rs | |||
@@ -25,6 +25,12 @@ impl<A, B> Either<A, B> { | |||
25 | Either::B(b) => Either::B(f2(b)), | 25 | Either::B(b) => Either::B(f2(b)), |
26 | } | 26 | } |
27 | } | 27 | } |
28 | pub fn map_a<U, F>(self, f: F) -> Either<U, B> | ||
29 | where | ||
30 | F: FnOnce(A) -> U, | ||
31 | { | ||
32 | self.map(f, |it| it) | ||
33 | } | ||
28 | pub fn a(self) -> Option<A> { | 34 | pub fn a(self) -> Option<A> { |
29 | match self { | 35 | match self { |
30 | Either::A(it) => Some(it), | 36 | Either::A(it) => Some(it), |
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 55eb7da35..df67d2c39 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -309,15 +309,11 @@ impl SourceAnalyzer { | |||
309 | crate::Resolution::LocalBinding(it) => { | 309 | crate::Resolution::LocalBinding(it) => { |
310 | // We get a `PatId` from resolver, but it actually can only | 310 | // We get a `PatId` from resolver, but it actually can only |
311 | // point at `BindPat`, and not at the arbitrary pattern. | 311 | // point at `BindPat`, and not at the arbitrary pattern. |
312 | let pat_ptr = self.body_source_map.as_ref()?.pat_syntax(it)?; | 312 | let pat_ptr = self |
313 | let pat_ptr = match pat_ptr { | 313 | .body_source_map |
314 | Either::A(pat) => { | 314 | .as_ref()? |
315 | let pat: AstPtr<ast::BindPat> = | 315 | .pat_syntax(it)? |
316 | pat.cast_checking_kind(|kind| kind == BIND_PAT).unwrap(); | 316 | .map_a(|ptr| ptr.cast::<ast::BindPat>().unwrap()); |
317 | Either::A(pat) | ||
318 | } | ||
319 | Either::B(self_param) => Either::B(self_param), | ||
320 | }; | ||
321 | PathResolution::LocalBinding(pat_ptr) | 317 | PathResolution::LocalBinding(pat_ptr) |
322 | } | 318 | } |
323 | crate::Resolution::GenericParam(it) => PathResolution::GenericParam(it), | 319 | crate::Resolution::GenericParam(it) => PathResolution::GenericParam(it), |
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index ceb603c50..4a38197f6 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs | |||
@@ -10,7 +10,7 @@ use std::marker::PhantomData; | |||
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | syntax_node::{SyntaxNode, SyntaxNodeChildren, SyntaxToken}, | 12 | syntax_node::{SyntaxNode, SyntaxNodeChildren, SyntaxToken}, |
13 | SmolStr, | 13 | SmolStr, SyntaxKind, |
14 | }; | 14 | }; |
15 | 15 | ||
16 | pub use self::{ | 16 | pub use self::{ |
@@ -26,6 +26,8 @@ pub use self::{ | |||
26 | /// the same representation: a pointer to the tree root and a pointer to the | 26 | /// the same representation: a pointer to the tree root and a pointer to the |
27 | /// node itself. | 27 | /// node itself. |
28 | pub trait AstNode: Clone { | 28 | pub trait AstNode: Clone { |
29 | fn can_cast(kind: SyntaxKind) -> bool; | ||
30 | |||
29 | fn cast(syntax: SyntaxNode) -> Option<Self> | 31 | fn cast(syntax: SyntaxNode) -> Option<Self> |
30 | where | 32 | where |
31 | Self: Sized; | 33 | Self: Sized; |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index a1f320257..99fcdbd9a 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -10,7 +10,7 @@ | |||
10 | #![cfg_attr(rustfmt, rustfmt_skip)] | 10 | #![cfg_attr(rustfmt, rustfmt_skip)] |
11 | 11 | ||
12 | use crate::{ | 12 | use crate::{ |
13 | SyntaxNode, SyntaxKind::*, | 13 | SyntaxNode, SyntaxKind::{self, *}, |
14 | ast::{self, AstNode}, | 14 | ast::{self, AstNode}, |
15 | }; | 15 | }; |
16 | 16 | ||
@@ -21,12 +21,15 @@ pub struct Alias { | |||
21 | } | 21 | } |
22 | 22 | ||
23 | impl AstNode for Alias { | 23 | impl AstNode for Alias { |
24 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 24 | fn can_cast(kind: SyntaxKind) -> bool { |
25 | match syntax.kind() { | 25 | match kind { |
26 | ALIAS => Some(Alias { syntax }), | 26 | ALIAS => true, |
27 | _ => None, | 27 | _ => false, |
28 | } | 28 | } |
29 | } | 29 | } |
30 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
31 | if Self::can_cast(syntax.kind()) { Some(Alias { syntax }) } else { None } | ||
32 | } | ||
30 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 33 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
31 | } | 34 | } |
32 | 35 | ||
@@ -41,12 +44,15 @@ pub struct ArgList { | |||
41 | } | 44 | } |
42 | 45 | ||
43 | impl AstNode for ArgList { | 46 | impl AstNode for ArgList { |
44 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 47 | fn can_cast(kind: SyntaxKind) -> bool { |
45 | match syntax.kind() { | 48 | match kind { |
46 | ARG_LIST => Some(ArgList { syntax }), | 49 | ARG_LIST => true, |
47 | _ => None, | 50 | _ => false, |
48 | } | 51 | } |
49 | } | 52 | } |
53 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
54 | if Self::can_cast(syntax.kind()) { Some(ArgList { syntax }) } else { None } | ||
55 | } | ||
50 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 56 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
51 | } | 57 | } |
52 | 58 | ||
@@ -64,12 +70,15 @@ pub struct ArrayExpr { | |||
64 | } | 70 | } |
65 | 71 | ||
66 | impl AstNode for ArrayExpr { | 72 | impl AstNode for ArrayExpr { |
67 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 73 | fn can_cast(kind: SyntaxKind) -> bool { |
68 | match syntax.kind() { | 74 | match kind { |
69 | ARRAY_EXPR => Some(ArrayExpr { syntax }), | 75 | ARRAY_EXPR => true, |
70 | _ => None, | 76 | _ => false, |
71 | } | 77 | } |
72 | } | 78 | } |
79 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
80 | if Self::can_cast(syntax.kind()) { Some(ArrayExpr { syntax }) } else { None } | ||
81 | } | ||
73 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 82 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
74 | } | 83 | } |
75 | 84 | ||
@@ -87,12 +96,15 @@ pub struct ArrayType { | |||
87 | } | 96 | } |
88 | 97 | ||
89 | impl AstNode for ArrayType { | 98 | impl AstNode for ArrayType { |
90 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 99 | fn can_cast(kind: SyntaxKind) -> bool { |
91 | match syntax.kind() { | 100 | match kind { |
92 | ARRAY_TYPE => Some(ArrayType { syntax }), | 101 | ARRAY_TYPE => true, |
93 | _ => None, | 102 | _ => false, |
94 | } | 103 | } |
95 | } | 104 | } |
105 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
106 | if Self::can_cast(syntax.kind()) { Some(ArrayType { syntax }) } else { None } | ||
107 | } | ||
96 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 108 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
97 | } | 109 | } |
98 | 110 | ||
@@ -114,12 +126,15 @@ pub struct AssocTypeArg { | |||
114 | } | 126 | } |
115 | 127 | ||
116 | impl AstNode for AssocTypeArg { | 128 | impl AstNode for AssocTypeArg { |
117 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 129 | fn can_cast(kind: SyntaxKind) -> bool { |
118 | match syntax.kind() { | 130 | match kind { |
119 | ASSOC_TYPE_ARG => Some(AssocTypeArg { syntax }), | 131 | ASSOC_TYPE_ARG => true, |
120 | _ => None, | 132 | _ => false, |
121 | } | 133 | } |
122 | } | 134 | } |
135 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
136 | if Self::can_cast(syntax.kind()) { Some(AssocTypeArg { syntax }) } else { None } | ||
137 | } | ||
123 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 138 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
124 | } | 139 | } |
125 | 140 | ||
@@ -141,12 +156,15 @@ pub struct Attr { | |||
141 | } | 156 | } |
142 | 157 | ||
143 | impl AstNode for Attr { | 158 | impl AstNode for Attr { |
144 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 159 | fn can_cast(kind: SyntaxKind) -> bool { |
145 | match syntax.kind() { | 160 | match kind { |
146 | ATTR => Some(Attr { syntax }), | 161 | ATTR => true, |
147 | _ => None, | 162 | _ => false, |
148 | } | 163 | } |
149 | } | 164 | } |
165 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
166 | if Self::can_cast(syntax.kind()) { Some(Attr { syntax }) } else { None } | ||
167 | } | ||
150 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 168 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
151 | } | 169 | } |
152 | 170 | ||
@@ -164,12 +182,15 @@ pub struct BinExpr { | |||
164 | } | 182 | } |
165 | 183 | ||
166 | impl AstNode for BinExpr { | 184 | impl AstNode for BinExpr { |
167 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 185 | fn can_cast(kind: SyntaxKind) -> bool { |
168 | match syntax.kind() { | 186 | match kind { |
169 | BIN_EXPR => Some(BinExpr { syntax }), | 187 | BIN_EXPR => true, |
170 | _ => None, | 188 | _ => false, |
171 | } | 189 | } |
172 | } | 190 | } |
191 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
192 | if Self::can_cast(syntax.kind()) { Some(BinExpr { syntax }) } else { None } | ||
193 | } | ||
173 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 194 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
174 | } | 195 | } |
175 | 196 | ||
@@ -183,12 +204,15 @@ pub struct BindPat { | |||
183 | } | 204 | } |
184 | 205 | ||
185 | impl AstNode for BindPat { | 206 | impl AstNode for BindPat { |
186 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 207 | fn can_cast(kind: SyntaxKind) -> bool { |
187 | match syntax.kind() { | 208 | match kind { |
188 | BIND_PAT => Some(BindPat { syntax }), | 209 | BIND_PAT => true, |
189 | _ => None, | 210 | _ => false, |
190 | } | 211 | } |
191 | } | 212 | } |
213 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
214 | if Self::can_cast(syntax.kind()) { Some(BindPat { syntax }) } else { None } | ||
215 | } | ||
192 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 216 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
193 | } | 217 | } |
194 | 218 | ||
@@ -207,12 +231,15 @@ pub struct Block { | |||
207 | } | 231 | } |
208 | 232 | ||
209 | impl AstNode for Block { | 233 | impl AstNode for Block { |
210 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 234 | fn can_cast(kind: SyntaxKind) -> bool { |
211 | match syntax.kind() { | 235 | match kind { |
212 | BLOCK => Some(Block { syntax }), | 236 | BLOCK => true, |
213 | _ => None, | 237 | _ => false, |
214 | } | 238 | } |
215 | } | 239 | } |
240 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
241 | if Self::can_cast(syntax.kind()) { Some(Block { syntax }) } else { None } | ||
242 | } | ||
216 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 243 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
217 | } | 244 | } |
218 | 245 | ||
@@ -235,12 +262,15 @@ pub struct BlockExpr { | |||
235 | } | 262 | } |
236 | 263 | ||
237 | impl AstNode for BlockExpr { | 264 | impl AstNode for BlockExpr { |
238 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 265 | fn can_cast(kind: SyntaxKind) -> bool { |
239 | match syntax.kind() { | 266 | match kind { |
240 | BLOCK_EXPR => Some(BlockExpr { syntax }), | 267 | BLOCK_EXPR => true, |
241 | _ => None, | 268 | _ => false, |
242 | } | 269 | } |
243 | } | 270 | } |
271 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
272 | if Self::can_cast(syntax.kind()) { Some(BlockExpr { syntax }) } else { None } | ||
273 | } | ||
244 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 274 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
245 | } | 275 | } |
246 | 276 | ||
@@ -258,12 +288,15 @@ pub struct BreakExpr { | |||
258 | } | 288 | } |
259 | 289 | ||
260 | impl AstNode for BreakExpr { | 290 | impl AstNode for BreakExpr { |
261 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 291 | fn can_cast(kind: SyntaxKind) -> bool { |
262 | match syntax.kind() { | 292 | match kind { |
263 | BREAK_EXPR => Some(BreakExpr { syntax }), | 293 | BREAK_EXPR => true, |
264 | _ => None, | 294 | _ => false, |
265 | } | 295 | } |
266 | } | 296 | } |
297 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
298 | if Self::can_cast(syntax.kind()) { Some(BreakExpr { syntax }) } else { None } | ||
299 | } | ||
267 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 300 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
268 | } | 301 | } |
269 | 302 | ||
@@ -281,12 +314,15 @@ pub struct CallExpr { | |||
281 | } | 314 | } |
282 | 315 | ||
283 | impl AstNode for CallExpr { | 316 | impl AstNode for CallExpr { |
284 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 317 | fn can_cast(kind: SyntaxKind) -> bool { |
285 | match syntax.kind() { | 318 | match kind { |
286 | CALL_EXPR => Some(CallExpr { syntax }), | 319 | CALL_EXPR => true, |
287 | _ => None, | 320 | _ => false, |
288 | } | 321 | } |
289 | } | 322 | } |
323 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
324 | if Self::can_cast(syntax.kind()) { Some(CallExpr { syntax }) } else { None } | ||
325 | } | ||
290 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 326 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
291 | } | 327 | } |
292 | 328 | ||
@@ -305,12 +341,15 @@ pub struct CastExpr { | |||
305 | } | 341 | } |
306 | 342 | ||
307 | impl AstNode for CastExpr { | 343 | impl AstNode for CastExpr { |
308 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 344 | fn can_cast(kind: SyntaxKind) -> bool { |
309 | match syntax.kind() { | 345 | match kind { |
310 | CAST_EXPR => Some(CastExpr { syntax }), | 346 | CAST_EXPR => true, |
311 | _ => None, | 347 | _ => false, |
312 | } | 348 | } |
313 | } | 349 | } |
350 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
351 | if Self::can_cast(syntax.kind()) { Some(CastExpr { syntax }) } else { None } | ||
352 | } | ||
314 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 353 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
315 | } | 354 | } |
316 | 355 | ||
@@ -332,12 +371,15 @@ pub struct Condition { | |||
332 | } | 371 | } |
333 | 372 | ||
334 | impl AstNode for Condition { | 373 | impl AstNode for Condition { |
335 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 374 | fn can_cast(kind: SyntaxKind) -> bool { |
336 | match syntax.kind() { | 375 | match kind { |
337 | CONDITION => Some(Condition { syntax }), | 376 | CONDITION => true, |
338 | _ => None, | 377 | _ => false, |
339 | } | 378 | } |
340 | } | 379 | } |
380 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
381 | if Self::can_cast(syntax.kind()) { Some(Condition { syntax }) } else { None } | ||
382 | } | ||
341 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 383 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
342 | } | 384 | } |
343 | 385 | ||
@@ -359,12 +401,15 @@ pub struct ConstDef { | |||
359 | } | 401 | } |
360 | 402 | ||
361 | impl AstNode for ConstDef { | 403 | impl AstNode for ConstDef { |
362 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 404 | fn can_cast(kind: SyntaxKind) -> bool { |
363 | match syntax.kind() { | 405 | match kind { |
364 | CONST_DEF => Some(ConstDef { syntax }), | 406 | CONST_DEF => true, |
365 | _ => None, | 407 | _ => false, |
366 | } | 408 | } |
367 | } | 409 | } |
410 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
411 | if Self::can_cast(syntax.kind()) { Some(ConstDef { syntax }) } else { None } | ||
412 | } | ||
368 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 413 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
369 | } | 414 | } |
370 | 415 | ||
@@ -388,12 +433,15 @@ pub struct ContinueExpr { | |||
388 | } | 433 | } |
389 | 434 | ||
390 | impl AstNode for ContinueExpr { | 435 | impl AstNode for ContinueExpr { |
391 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 436 | fn can_cast(kind: SyntaxKind) -> bool { |
392 | match syntax.kind() { | 437 | match kind { |
393 | CONTINUE_EXPR => Some(ContinueExpr { syntax }), | 438 | CONTINUE_EXPR => true, |
394 | _ => None, | 439 | _ => false, |
395 | } | 440 | } |
396 | } | 441 | } |
442 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
443 | if Self::can_cast(syntax.kind()) { Some(ContinueExpr { syntax }) } else { None } | ||
444 | } | ||
397 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 445 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
398 | } | 446 | } |
399 | 447 | ||
@@ -407,12 +455,15 @@ pub struct DynTraitType { | |||
407 | } | 455 | } |
408 | 456 | ||
409 | impl AstNode for DynTraitType { | 457 | impl AstNode for DynTraitType { |
410 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 458 | fn can_cast(kind: SyntaxKind) -> bool { |
411 | match syntax.kind() { | 459 | match kind { |
412 | DYN_TRAIT_TYPE => Some(DynTraitType { syntax }), | 460 | DYN_TRAIT_TYPE => true, |
413 | _ => None, | 461 | _ => false, |
414 | } | 462 | } |
415 | } | 463 | } |
464 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
465 | if Self::can_cast(syntax.kind()) { Some(DynTraitType { syntax }) } else { None } | ||
466 | } | ||
416 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 467 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
417 | } | 468 | } |
418 | 469 | ||
@@ -427,12 +478,15 @@ pub struct EnumDef { | |||
427 | } | 478 | } |
428 | 479 | ||
429 | impl AstNode for EnumDef { | 480 | impl AstNode for EnumDef { |
430 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 481 | fn can_cast(kind: SyntaxKind) -> bool { |
431 | match syntax.kind() { | 482 | match kind { |
432 | ENUM_DEF => Some(EnumDef { syntax }), | 483 | ENUM_DEF => true, |
433 | _ => None, | 484 | _ => false, |
434 | } | 485 | } |
435 | } | 486 | } |
487 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
488 | if Self::can_cast(syntax.kind()) { Some(EnumDef { syntax }) } else { None } | ||
489 | } | ||
436 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 490 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
437 | } | 491 | } |
438 | 492 | ||
@@ -455,12 +509,15 @@ pub struct EnumVariant { | |||
455 | } | 509 | } |
456 | 510 | ||
457 | impl AstNode for EnumVariant { | 511 | impl AstNode for EnumVariant { |
458 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 512 | fn can_cast(kind: SyntaxKind) -> bool { |
459 | match syntax.kind() { | 513 | match kind { |
460 | ENUM_VARIANT => Some(EnumVariant { syntax }), | 514 | ENUM_VARIANT => true, |
461 | _ => None, | 515 | _ => false, |
462 | } | 516 | } |
463 | } | 517 | } |
518 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
519 | if Self::can_cast(syntax.kind()) { Some(EnumVariant { syntax }) } else { None } | ||
520 | } | ||
464 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 521 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
465 | } | 522 | } |
466 | 523 | ||
@@ -481,12 +538,15 @@ pub struct EnumVariantList { | |||
481 | } | 538 | } |
482 | 539 | ||
483 | impl AstNode for EnumVariantList { | 540 | impl AstNode for EnumVariantList { |
484 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 541 | fn can_cast(kind: SyntaxKind) -> bool { |
485 | match syntax.kind() { | 542 | match kind { |
486 | ENUM_VARIANT_LIST => Some(EnumVariantList { syntax }), | 543 | ENUM_VARIANT_LIST => true, |
487 | _ => None, | 544 | _ => false, |
488 | } | 545 | } |
489 | } | 546 | } |
547 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
548 | if Self::can_cast(syntax.kind()) { Some(EnumVariantList { syntax }) } else { None } | ||
549 | } | ||
490 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 550 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
491 | } | 551 | } |
492 | 552 | ||
@@ -503,6 +563,20 @@ pub struct Expr { | |||
503 | pub(crate) syntax: SyntaxNode, | 563 | pub(crate) syntax: SyntaxNode, |
504 | } | 564 | } |
505 | 565 | ||
566 | impl AstNode for Expr { | ||
567 | fn can_cast(kind: SyntaxKind) -> bool { | ||
568 | match kind { | ||
569 | | TUPLE_EXPR | ARRAY_EXPR | PAREN_EXPR | PATH_EXPR | LAMBDA_EXPR | IF_EXPR | LOOP_EXPR | FOR_EXPR | WHILE_EXPR | CONTINUE_EXPR | BREAK_EXPR | LABEL | BLOCK_EXPR | RETURN_EXPR | MATCH_EXPR | STRUCT_LIT | CALL_EXPR | INDEX_EXPR | METHOD_CALL_EXPR | FIELD_EXPR | TRY_EXPR | TRY_BLOCK_EXPR | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL => true, | ||
570 | _ => false, | ||
571 | } | ||
572 | } | ||
573 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
574 | if Self::can_cast(syntax.kind()) { Some(Expr { syntax }) } else { None } | ||
575 | } | ||
576 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
577 | } | ||
578 | |||
579 | |||
506 | #[derive(Debug, Clone, PartialEq, Eq)] | 580 | #[derive(Debug, Clone, PartialEq, Eq)] |
507 | pub enum ExprKind { | 581 | pub enum ExprKind { |
508 | TupleExpr(TupleExpr), | 582 | TupleExpr(TupleExpr), |
@@ -536,190 +610,92 @@ pub enum ExprKind { | |||
536 | MacroCall(MacroCall), | 610 | MacroCall(MacroCall), |
537 | } | 611 | } |
538 | impl From<TupleExpr> for Expr { | 612 | impl From<TupleExpr> for Expr { |
539 | fn from(n: TupleExpr) -> Expr { | 613 | fn from(n: TupleExpr) -> Expr { Expr { syntax: n.syntax } } |
540 | Expr::cast(n.syntax).unwrap() | ||
541 | } | ||
542 | } | 614 | } |
543 | impl From<ArrayExpr> for Expr { | 615 | impl From<ArrayExpr> for Expr { |
544 | fn from(n: ArrayExpr) -> Expr { | 616 | fn from(n: ArrayExpr) -> Expr { Expr { syntax: n.syntax } } |
545 | Expr::cast(n.syntax).unwrap() | ||
546 | } | ||
547 | } | 617 | } |
548 | impl From<ParenExpr> for Expr { | 618 | impl From<ParenExpr> for Expr { |
549 | fn from(n: ParenExpr) -> Expr { | 619 | fn from(n: ParenExpr) -> Expr { Expr { syntax: n.syntax } } |
550 | Expr::cast(n.syntax).unwrap() | ||
551 | } | ||
552 | } | 620 | } |
553 | impl From<PathExpr> for Expr { | 621 | impl From<PathExpr> for Expr { |
554 | fn from(n: PathExpr) -> Expr { | 622 | fn from(n: PathExpr) -> Expr { Expr { syntax: n.syntax } } |
555 | Expr::cast(n.syntax).unwrap() | ||
556 | } | ||
557 | } | 623 | } |
558 | impl From<LambdaExpr> for Expr { | 624 | impl From<LambdaExpr> for Expr { |
559 | fn from(n: LambdaExpr) -> Expr { | 625 | fn from(n: LambdaExpr) -> Expr { Expr { syntax: n.syntax } } |
560 | Expr::cast(n.syntax).unwrap() | ||
561 | } | ||
562 | } | 626 | } |
563 | impl From<IfExpr> for Expr { | 627 | impl From<IfExpr> for Expr { |
564 | fn from(n: IfExpr) -> Expr { | 628 | fn from(n: IfExpr) -> Expr { Expr { syntax: n.syntax } } |
565 | Expr::cast(n.syntax).unwrap() | ||
566 | } | ||
567 | } | 629 | } |
568 | impl From<LoopExpr> for Expr { | 630 | impl From<LoopExpr> for Expr { |
569 | fn from(n: LoopExpr) -> Expr { | 631 | fn from(n: LoopExpr) -> Expr { Expr { syntax: n.syntax } } |
570 | Expr::cast(n.syntax).unwrap() | ||
571 | } | ||
572 | } | 632 | } |
573 | impl From<ForExpr> for Expr { | 633 | impl From<ForExpr> for Expr { |
574 | fn from(n: ForExpr) -> Expr { | 634 | fn from(n: ForExpr) -> Expr { Expr { syntax: n.syntax } } |
575 | Expr::cast(n.syntax).unwrap() | ||
576 | } | ||
577 | } | 635 | } |
578 | impl From<WhileExpr> for Expr { | 636 | impl From<WhileExpr> for Expr { |
579 | fn from(n: WhileExpr) -> Expr { | 637 | fn from(n: WhileExpr) -> Expr { Expr { syntax: n.syntax } } |
580 | Expr::cast(n.syntax).unwrap() | ||
581 | } | ||
582 | } | 638 | } |
583 | impl From<ContinueExpr> for Expr { | 639 | impl From<ContinueExpr> for Expr { |
584 | fn from(n: ContinueExpr) -> Expr { | 640 | fn from(n: ContinueExpr) -> Expr { Expr { syntax: n.syntax } } |
585 | Expr::cast(n.syntax).unwrap() | ||
586 | } | ||
587 | } | 641 | } |
588 | impl From<BreakExpr> for Expr { | 642 | impl From<BreakExpr> for Expr { |
589 | fn from(n: BreakExpr) -> Expr { | 643 | fn from(n: BreakExpr) -> Expr { Expr { syntax: n.syntax } } |
590 | Expr::cast(n.syntax).unwrap() | ||
591 | } | ||
592 | } | 644 | } |
593 | impl From<Label> for Expr { | 645 | impl From<Label> for Expr { |
594 | fn from(n: Label) -> Expr { | 646 | fn from(n: Label) -> Expr { Expr { syntax: n.syntax } } |
595 | Expr::cast(n.syntax).unwrap() | ||
596 | } | ||
597 | } | 647 | } |
598 | impl From<BlockExpr> for Expr { | 648 | impl From<BlockExpr> for Expr { |
599 | fn from(n: BlockExpr) -> Expr { | 649 | fn from(n: BlockExpr) -> Expr { Expr { syntax: n.syntax } } |
600 | Expr::cast(n.syntax).unwrap() | ||
601 | } | ||
602 | } | 650 | } |
603 | impl From<ReturnExpr> for Expr { | 651 | impl From<ReturnExpr> for Expr { |
604 | fn from(n: ReturnExpr) -> Expr { | 652 | fn from(n: ReturnExpr) -> Expr { Expr { syntax: n.syntax } } |
605 | Expr::cast(n.syntax).unwrap() | ||
606 | } | ||
607 | } | 653 | } |
608 | impl From<MatchExpr> for Expr { | 654 | impl From<MatchExpr> for Expr { |
609 | fn from(n: MatchExpr) -> Expr { | 655 | fn from(n: MatchExpr) -> Expr { Expr { syntax: n.syntax } } |
610 | Expr::cast(n.syntax).unwrap() | ||
611 | } | ||
612 | } | 656 | } |
613 | impl From<StructLit> for Expr { | 657 | impl From<StructLit> for Expr { |
614 | fn from(n: StructLit) -> Expr { | 658 | fn from(n: StructLit) -> Expr { Expr { syntax: n.syntax } } |
615 | Expr::cast(n.syntax).unwrap() | ||
616 | } | ||
617 | } | 659 | } |
618 | impl From<CallExpr> for Expr { | 660 | impl From<CallExpr> for Expr { |
619 | fn from(n: CallExpr) -> Expr { | 661 | fn from(n: CallExpr) -> Expr { Expr { syntax: n.syntax } } |
620 | Expr::cast(n.syntax).unwrap() | ||
621 | } | ||
622 | } | 662 | } |
623 | impl From<IndexExpr> for Expr { | 663 | impl From<IndexExpr> for Expr { |
624 | fn from(n: IndexExpr) -> Expr { | 664 | fn from(n: IndexExpr) -> Expr { Expr { syntax: n.syntax } } |
625 | Expr::cast(n.syntax).unwrap() | ||
626 | } | ||
627 | } | 665 | } |
628 | impl From<MethodCallExpr> for Expr { | 666 | impl From<MethodCallExpr> for Expr { |
629 | fn from(n: MethodCallExpr) -> Expr { | 667 | fn from(n: MethodCallExpr) -> Expr { Expr { syntax: n.syntax } } |
630 | Expr::cast(n.syntax).unwrap() | ||
631 | } | ||
632 | } | 668 | } |
633 | impl From<FieldExpr> for Expr { | 669 | impl From<FieldExpr> for Expr { |
634 | fn from(n: FieldExpr) -> Expr { | 670 | fn from(n: FieldExpr) -> Expr { Expr { syntax: n.syntax } } |
635 | Expr::cast(n.syntax).unwrap() | ||
636 | } | ||
637 | } | 671 | } |
638 | impl From<TryExpr> for Expr { | 672 | impl From<TryExpr> for Expr { |
639 | fn from(n: TryExpr) -> Expr { | 673 | fn from(n: TryExpr) -> Expr { Expr { syntax: n.syntax } } |
640 | Expr::cast(n.syntax).unwrap() | ||
641 | } | ||
642 | } | 674 | } |
643 | impl From<TryBlockExpr> for Expr { | 675 | impl From<TryBlockExpr> for Expr { |
644 | fn from(n: TryBlockExpr) -> Expr { | 676 | fn from(n: TryBlockExpr) -> Expr { Expr { syntax: n.syntax } } |
645 | Expr::cast(n.syntax).unwrap() | ||
646 | } | ||
647 | } | 677 | } |
648 | impl From<CastExpr> for Expr { | 678 | impl From<CastExpr> for Expr { |
649 | fn from(n: CastExpr) -> Expr { | 679 | fn from(n: CastExpr) -> Expr { Expr { syntax: n.syntax } } |
650 | Expr::cast(n.syntax).unwrap() | ||
651 | } | ||
652 | } | 680 | } |
653 | impl From<RefExpr> for Expr { | 681 | impl From<RefExpr> for Expr { |
654 | fn from(n: RefExpr) -> Expr { | 682 | fn from(n: RefExpr) -> Expr { Expr { syntax: n.syntax } } |
655 | Expr::cast(n.syntax).unwrap() | ||
656 | } | ||
657 | } | 683 | } |
658 | impl From<PrefixExpr> for Expr { | 684 | impl From<PrefixExpr> for Expr { |
659 | fn from(n: PrefixExpr) -> Expr { | 685 | fn from(n: PrefixExpr) -> Expr { Expr { syntax: n.syntax } } |
660 | Expr::cast(n.syntax).unwrap() | ||
661 | } | ||
662 | } | 686 | } |
663 | impl From<RangeExpr> for Expr { | 687 | impl From<RangeExpr> for Expr { |
664 | fn from(n: RangeExpr) -> Expr { | 688 | fn from(n: RangeExpr) -> Expr { Expr { syntax: n.syntax } } |
665 | Expr::cast(n.syntax).unwrap() | ||
666 | } | ||
667 | } | 689 | } |
668 | impl From<BinExpr> for Expr { | 690 | impl From<BinExpr> for Expr { |
669 | fn from(n: BinExpr) -> Expr { | 691 | fn from(n: BinExpr) -> Expr { Expr { syntax: n.syntax } } |
670 | Expr::cast(n.syntax).unwrap() | ||
671 | } | ||
672 | } | 692 | } |
673 | impl From<Literal> for Expr { | 693 | impl From<Literal> for Expr { |
674 | fn from(n: Literal) -> Expr { | 694 | fn from(n: Literal) -> Expr { Expr { syntax: n.syntax } } |
675 | Expr::cast(n.syntax).unwrap() | ||
676 | } | ||
677 | } | 695 | } |
678 | impl From<MacroCall> for Expr { | 696 | impl From<MacroCall> for Expr { |
679 | fn from(n: MacroCall) -> Expr { | 697 | fn from(n: MacroCall) -> Expr { Expr { syntax: n.syntax } } |
680 | Expr::cast(n.syntax).unwrap() | ||
681 | } | ||
682 | } | ||
683 | |||
684 | |||
685 | impl AstNode for Expr { | ||
686 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
687 | match syntax.kind() { | ||
688 | | TUPLE_EXPR | ||
689 | | ARRAY_EXPR | ||
690 | | PAREN_EXPR | ||
691 | | PATH_EXPR | ||
692 | | LAMBDA_EXPR | ||
693 | | IF_EXPR | ||
694 | | LOOP_EXPR | ||
695 | | FOR_EXPR | ||
696 | | WHILE_EXPR | ||
697 | | CONTINUE_EXPR | ||
698 | | BREAK_EXPR | ||
699 | | LABEL | ||
700 | | BLOCK_EXPR | ||
701 | | RETURN_EXPR | ||
702 | | MATCH_EXPR | ||
703 | | STRUCT_LIT | ||
704 | | CALL_EXPR | ||
705 | | INDEX_EXPR | ||
706 | | METHOD_CALL_EXPR | ||
707 | | FIELD_EXPR | ||
708 | | TRY_EXPR | ||
709 | | TRY_BLOCK_EXPR | ||
710 | | CAST_EXPR | ||
711 | | REF_EXPR | ||
712 | | PREFIX_EXPR | ||
713 | | RANGE_EXPR | ||
714 | | BIN_EXPR | ||
715 | | LITERAL | ||
716 | | MACRO_CALL => Some(Expr { syntax }), | ||
717 | _ => None, | ||
718 | } | ||
719 | } | ||
720 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
721 | } | 698 | } |
722 | |||
723 | impl Expr { | 699 | impl Expr { |
724 | pub fn kind(&self) -> ExprKind { | 700 | pub fn kind(&self) -> ExprKind { |
725 | match self.syntax.kind() { | 701 | match self.syntax.kind() { |
@@ -766,12 +742,15 @@ pub struct ExprStmt { | |||
766 | } | 742 | } |
767 | 743 | ||
768 | impl AstNode for ExprStmt { | 744 | impl AstNode for ExprStmt { |
769 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 745 | fn can_cast(kind: SyntaxKind) -> bool { |
770 | match syntax.kind() { | 746 | match kind { |
771 | EXPR_STMT => Some(ExprStmt { syntax }), | 747 | EXPR_STMT => true, |
772 | _ => None, | 748 | _ => false, |
773 | } | 749 | } |
774 | } | 750 | } |
751 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
752 | if Self::can_cast(syntax.kind()) { Some(ExprStmt { syntax }) } else { None } | ||
753 | } | ||
775 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 754 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
776 | } | 755 | } |
777 | 756 | ||
@@ -789,12 +768,15 @@ pub struct ExternCrateItem { | |||
789 | } | 768 | } |
790 | 769 | ||
791 | impl AstNode for ExternCrateItem { | 770 | impl AstNode for ExternCrateItem { |
792 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 771 | fn can_cast(kind: SyntaxKind) -> bool { |
793 | match syntax.kind() { | 772 | match kind { |
794 | EXTERN_CRATE_ITEM => Some(ExternCrateItem { syntax }), | 773 | EXTERN_CRATE_ITEM => true, |
795 | _ => None, | 774 | _ => false, |
796 | } | 775 | } |
797 | } | 776 | } |
777 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
778 | if Self::can_cast(syntax.kind()) { Some(ExternCrateItem { syntax }) } else { None } | ||
779 | } | ||
798 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 780 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
799 | } | 781 | } |
800 | 782 | ||
@@ -816,12 +798,15 @@ pub struct FieldExpr { | |||
816 | } | 798 | } |
817 | 799 | ||
818 | impl AstNode for FieldExpr { | 800 | impl AstNode for FieldExpr { |
819 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 801 | fn can_cast(kind: SyntaxKind) -> bool { |
820 | match syntax.kind() { | 802 | match kind { |
821 | FIELD_EXPR => Some(FieldExpr { syntax }), | 803 | FIELD_EXPR => true, |
822 | _ => None, | 804 | _ => false, |
823 | } | 805 | } |
824 | } | 806 | } |
807 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
808 | if Self::can_cast(syntax.kind()) { Some(FieldExpr { syntax }) } else { None } | ||
809 | } | ||
825 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 810 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
826 | } | 811 | } |
827 | 812 | ||
@@ -843,12 +828,15 @@ pub struct FieldPat { | |||
843 | } | 828 | } |
844 | 829 | ||
845 | impl AstNode for FieldPat { | 830 | impl AstNode for FieldPat { |
846 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 831 | fn can_cast(kind: SyntaxKind) -> bool { |
847 | match syntax.kind() { | 832 | match kind { |
848 | FIELD_PAT => Some(FieldPat { syntax }), | 833 | FIELD_PAT => true, |
849 | _ => None, | 834 | _ => false, |
850 | } | 835 | } |
851 | } | 836 | } |
837 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
838 | if Self::can_cast(syntax.kind()) { Some(FieldPat { syntax }) } else { None } | ||
839 | } | ||
852 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 840 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
853 | } | 841 | } |
854 | 842 | ||
@@ -867,12 +855,15 @@ pub struct FieldPatList { | |||
867 | } | 855 | } |
868 | 856 | ||
869 | impl AstNode for FieldPatList { | 857 | impl AstNode for FieldPatList { |
870 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 858 | fn can_cast(kind: SyntaxKind) -> bool { |
871 | match syntax.kind() { | 859 | match kind { |
872 | FIELD_PAT_LIST => Some(FieldPatList { syntax }), | 860 | FIELD_PAT_LIST => true, |
873 | _ => None, | 861 | _ => false, |
874 | } | 862 | } |
875 | } | 863 | } |
864 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
865 | if Self::can_cast(syntax.kind()) { Some(FieldPatList { syntax }) } else { None } | ||
866 | } | ||
876 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 867 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
877 | } | 868 | } |
878 | 869 | ||
@@ -894,12 +885,15 @@ pub struct FnDef { | |||
894 | } | 885 | } |
895 | 886 | ||
896 | impl AstNode for FnDef { | 887 | impl AstNode for FnDef { |
897 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 888 | fn can_cast(kind: SyntaxKind) -> bool { |
898 | match syntax.kind() { | 889 | match kind { |
899 | FN_DEF => Some(FnDef { syntax }), | 890 | FN_DEF => true, |
900 | _ => None, | 891 | _ => false, |
901 | } | 892 | } |
902 | } | 893 | } |
894 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
895 | if Self::can_cast(syntax.kind()) { Some(FnDef { syntax }) } else { None } | ||
896 | } | ||
903 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 897 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
904 | } | 898 | } |
905 | 899 | ||
@@ -930,12 +924,15 @@ pub struct FnPointerType { | |||
930 | } | 924 | } |
931 | 925 | ||
932 | impl AstNode for FnPointerType { | 926 | impl AstNode for FnPointerType { |
933 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 927 | fn can_cast(kind: SyntaxKind) -> bool { |
934 | match syntax.kind() { | 928 | match kind { |
935 | FN_POINTER_TYPE => Some(FnPointerType { syntax }), | 929 | FN_POINTER_TYPE => true, |
936 | _ => None, | 930 | _ => false, |
937 | } | 931 | } |
938 | } | 932 | } |
933 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
934 | if Self::can_cast(syntax.kind()) { Some(FnPointerType { syntax }) } else { None } | ||
935 | } | ||
939 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 936 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
940 | } | 937 | } |
941 | 938 | ||
@@ -957,12 +954,15 @@ pub struct ForExpr { | |||
957 | } | 954 | } |
958 | 955 | ||
959 | impl AstNode for ForExpr { | 956 | impl AstNode for ForExpr { |
960 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 957 | fn can_cast(kind: SyntaxKind) -> bool { |
961 | match syntax.kind() { | 958 | match kind { |
962 | FOR_EXPR => Some(ForExpr { syntax }), | 959 | FOR_EXPR => true, |
963 | _ => None, | 960 | _ => false, |
964 | } | 961 | } |
965 | } | 962 | } |
963 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
964 | if Self::can_cast(syntax.kind()) { Some(ForExpr { syntax }) } else { None } | ||
965 | } | ||
966 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 966 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
967 | } | 967 | } |
968 | 968 | ||
@@ -985,12 +985,15 @@ pub struct ForType { | |||
985 | } | 985 | } |
986 | 986 | ||
987 | impl AstNode for ForType { | 987 | impl AstNode for ForType { |
988 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 988 | fn can_cast(kind: SyntaxKind) -> bool { |
989 | match syntax.kind() { | 989 | match kind { |
990 | FOR_TYPE => Some(ForType { syntax }), | 990 | FOR_TYPE => true, |
991 | _ => None, | 991 | _ => false, |
992 | } | 992 | } |
993 | } | 993 | } |
994 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
995 | if Self::can_cast(syntax.kind()) { Some(ForType { syntax }) } else { None } | ||
996 | } | ||
994 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 997 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
995 | } | 998 | } |
996 | 999 | ||
@@ -1008,12 +1011,15 @@ pub struct IfExpr { | |||
1008 | } | 1011 | } |
1009 | 1012 | ||
1010 | impl AstNode for IfExpr { | 1013 | impl AstNode for IfExpr { |
1011 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1014 | fn can_cast(kind: SyntaxKind) -> bool { |
1012 | match syntax.kind() { | 1015 | match kind { |
1013 | IF_EXPR => Some(IfExpr { syntax }), | 1016 | IF_EXPR => true, |
1014 | _ => None, | 1017 | _ => false, |
1015 | } | 1018 | } |
1016 | } | 1019 | } |
1020 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1021 | if Self::can_cast(syntax.kind()) { Some(IfExpr { syntax }) } else { None } | ||
1022 | } | ||
1017 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1023 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1018 | } | 1024 | } |
1019 | 1025 | ||
@@ -1031,12 +1037,15 @@ pub struct ImplBlock { | |||
1031 | } | 1037 | } |
1032 | 1038 | ||
1033 | impl AstNode for ImplBlock { | 1039 | impl AstNode for ImplBlock { |
1034 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1040 | fn can_cast(kind: SyntaxKind) -> bool { |
1035 | match syntax.kind() { | 1041 | match kind { |
1036 | IMPL_BLOCK => Some(ImplBlock { syntax }), | 1042 | IMPL_BLOCK => true, |
1037 | _ => None, | 1043 | _ => false, |
1038 | } | 1044 | } |
1039 | } | 1045 | } |
1046 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1047 | if Self::can_cast(syntax.kind()) { Some(ImplBlock { syntax }) } else { None } | ||
1048 | } | ||
1040 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1049 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1041 | } | 1050 | } |
1042 | 1051 | ||
@@ -1055,6 +1064,20 @@ pub struct ImplItem { | |||
1055 | pub(crate) syntax: SyntaxNode, | 1064 | pub(crate) syntax: SyntaxNode, |
1056 | } | 1065 | } |
1057 | 1066 | ||
1067 | impl AstNode for ImplItem { | ||
1068 | fn can_cast(kind: SyntaxKind) -> bool { | ||
1069 | match kind { | ||
1070 | | FN_DEF | TYPE_ALIAS_DEF | CONST_DEF => true, | ||
1071 | _ => false, | ||
1072 | } | ||
1073 | } | ||
1074 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1075 | if Self::can_cast(syntax.kind()) { Some(ImplItem { syntax }) } else { None } | ||
1076 | } | ||
1077 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1078 | } | ||
1079 | |||
1080 | |||
1058 | #[derive(Debug, Clone, PartialEq, Eq)] | 1081 | #[derive(Debug, Clone, PartialEq, Eq)] |
1059 | pub enum ImplItemKind { | 1082 | pub enum ImplItemKind { |
1060 | FnDef(FnDef), | 1083 | FnDef(FnDef), |
@@ -1062,34 +1085,14 @@ pub enum ImplItemKind { | |||
1062 | ConstDef(ConstDef), | 1085 | ConstDef(ConstDef), |
1063 | } | 1086 | } |
1064 | impl From<FnDef> for ImplItem { | 1087 | impl From<FnDef> for ImplItem { |
1065 | fn from(n: FnDef) -> ImplItem { | 1088 | fn from(n: FnDef) -> ImplItem { ImplItem { syntax: n.syntax } } |
1066 | ImplItem::cast(n.syntax).unwrap() | ||
1067 | } | ||
1068 | } | 1089 | } |
1069 | impl From<TypeAliasDef> for ImplItem { | 1090 | impl From<TypeAliasDef> for ImplItem { |
1070 | fn from(n: TypeAliasDef) -> ImplItem { | 1091 | fn from(n: TypeAliasDef) -> ImplItem { ImplItem { syntax: n.syntax } } |
1071 | ImplItem::cast(n.syntax).unwrap() | ||
1072 | } | ||
1073 | } | 1092 | } |
1074 | impl From<ConstDef> for ImplItem { | 1093 | impl From<ConstDef> for ImplItem { |
1075 | fn from(n: ConstDef) -> ImplItem { | 1094 | fn from(n: ConstDef) -> ImplItem { ImplItem { syntax: n.syntax } } |
1076 | ImplItem::cast(n.syntax).unwrap() | ||
1077 | } | ||
1078 | } | ||
1079 | |||
1080 | |||
1081 | impl AstNode for ImplItem { | ||
1082 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1083 | match syntax.kind() { | ||
1084 | | FN_DEF | ||
1085 | | TYPE_ALIAS_DEF | ||
1086 | | CONST_DEF => Some(ImplItem { syntax }), | ||
1087 | _ => None, | ||
1088 | } | ||
1089 | } | ||
1090 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1091 | } | 1095 | } |
1092 | |||
1093 | impl ImplItem { | 1096 | impl ImplItem { |
1094 | pub fn kind(&self) -> ImplItemKind { | 1097 | pub fn kind(&self) -> ImplItemKind { |
1095 | match self.syntax.kind() { | 1098 | match self.syntax.kind() { |
@@ -1110,12 +1113,15 @@ pub struct ImplTraitType { | |||
1110 | } | 1113 | } |
1111 | 1114 | ||
1112 | impl AstNode for ImplTraitType { | 1115 | impl AstNode for ImplTraitType { |
1113 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1116 | fn can_cast(kind: SyntaxKind) -> bool { |
1114 | match syntax.kind() { | 1117 | match kind { |
1115 | IMPL_TRAIT_TYPE => Some(ImplTraitType { syntax }), | 1118 | IMPL_TRAIT_TYPE => true, |
1116 | _ => None, | 1119 | _ => false, |
1117 | } | 1120 | } |
1118 | } | 1121 | } |
1122 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1123 | if Self::can_cast(syntax.kind()) { Some(ImplTraitType { syntax }) } else { None } | ||
1124 | } | ||
1119 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1125 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1120 | } | 1126 | } |
1121 | 1127 | ||
@@ -1130,12 +1136,15 @@ pub struct IndexExpr { | |||
1130 | } | 1136 | } |
1131 | 1137 | ||
1132 | impl AstNode for IndexExpr { | 1138 | impl AstNode for IndexExpr { |
1133 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1139 | fn can_cast(kind: SyntaxKind) -> bool { |
1134 | match syntax.kind() { | 1140 | match kind { |
1135 | INDEX_EXPR => Some(IndexExpr { syntax }), | 1141 | INDEX_EXPR => true, |
1136 | _ => None, | 1142 | _ => false, |
1137 | } | 1143 | } |
1138 | } | 1144 | } |
1145 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1146 | if Self::can_cast(syntax.kind()) { Some(IndexExpr { syntax }) } else { None } | ||
1147 | } | ||
1139 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1148 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1140 | } | 1149 | } |
1141 | 1150 | ||
@@ -1149,12 +1158,15 @@ pub struct ItemList { | |||
1149 | } | 1158 | } |
1150 | 1159 | ||
1151 | impl AstNode for ItemList { | 1160 | impl AstNode for ItemList { |
1152 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1161 | fn can_cast(kind: SyntaxKind) -> bool { |
1153 | match syntax.kind() { | 1162 | match kind { |
1154 | ITEM_LIST => Some(ItemList { syntax }), | 1163 | ITEM_LIST => true, |
1155 | _ => None, | 1164 | _ => false, |
1156 | } | 1165 | } |
1157 | } | 1166 | } |
1167 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1168 | if Self::can_cast(syntax.kind()) { Some(ItemList { syntax }) } else { None } | ||
1169 | } | ||
1158 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1170 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1159 | } | 1171 | } |
1160 | 1172 | ||
@@ -1174,12 +1186,15 @@ pub struct Label { | |||
1174 | } | 1186 | } |
1175 | 1187 | ||
1176 | impl AstNode for Label { | 1188 | impl AstNode for Label { |
1177 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1189 | fn can_cast(kind: SyntaxKind) -> bool { |
1178 | match syntax.kind() { | 1190 | match kind { |
1179 | LABEL => Some(Label { syntax }), | 1191 | LABEL => true, |
1180 | _ => None, | 1192 | _ => false, |
1181 | } | 1193 | } |
1182 | } | 1194 | } |
1195 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1196 | if Self::can_cast(syntax.kind()) { Some(Label { syntax }) } else { None } | ||
1197 | } | ||
1183 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1198 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1184 | } | 1199 | } |
1185 | 1200 | ||
@@ -1193,12 +1208,15 @@ pub struct LambdaExpr { | |||
1193 | } | 1208 | } |
1194 | 1209 | ||
1195 | impl AstNode for LambdaExpr { | 1210 | impl AstNode for LambdaExpr { |
1196 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1211 | fn can_cast(kind: SyntaxKind) -> bool { |
1197 | match syntax.kind() { | 1212 | match kind { |
1198 | LAMBDA_EXPR => Some(LambdaExpr { syntax }), | 1213 | LAMBDA_EXPR => true, |
1199 | _ => None, | 1214 | _ => false, |
1200 | } | 1215 | } |
1201 | } | 1216 | } |
1217 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1218 | if Self::can_cast(syntax.kind()) { Some(LambdaExpr { syntax }) } else { None } | ||
1219 | } | ||
1202 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1220 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1203 | } | 1221 | } |
1204 | 1222 | ||
@@ -1220,12 +1238,15 @@ pub struct LetStmt { | |||
1220 | } | 1238 | } |
1221 | 1239 | ||
1222 | impl AstNode for LetStmt { | 1240 | impl AstNode for LetStmt { |
1223 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1241 | fn can_cast(kind: SyntaxKind) -> bool { |
1224 | match syntax.kind() { | 1242 | match kind { |
1225 | LET_STMT => Some(LetStmt { syntax }), | 1243 | LET_STMT => true, |
1226 | _ => None, | 1244 | _ => false, |
1227 | } | 1245 | } |
1228 | } | 1246 | } |
1247 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1248 | if Self::can_cast(syntax.kind()) { Some(LetStmt { syntax }) } else { None } | ||
1249 | } | ||
1229 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1250 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1230 | } | 1251 | } |
1231 | 1252 | ||
@@ -1248,12 +1269,15 @@ pub struct LifetimeArg { | |||
1248 | } | 1269 | } |
1249 | 1270 | ||
1250 | impl AstNode for LifetimeArg { | 1271 | impl AstNode for LifetimeArg { |
1251 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1272 | fn can_cast(kind: SyntaxKind) -> bool { |
1252 | match syntax.kind() { | 1273 | match kind { |
1253 | LIFETIME_ARG => Some(LifetimeArg { syntax }), | 1274 | LIFETIME_ARG => true, |
1254 | _ => None, | 1275 | _ => false, |
1255 | } | 1276 | } |
1256 | } | 1277 | } |
1278 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1279 | if Self::can_cast(syntax.kind()) { Some(LifetimeArg { syntax }) } else { None } | ||
1280 | } | ||
1257 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1281 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1258 | } | 1282 | } |
1259 | 1283 | ||
@@ -1267,12 +1291,15 @@ pub struct LifetimeParam { | |||
1267 | } | 1291 | } |
1268 | 1292 | ||
1269 | impl AstNode for LifetimeParam { | 1293 | impl AstNode for LifetimeParam { |
1270 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1294 | fn can_cast(kind: SyntaxKind) -> bool { |
1271 | match syntax.kind() { | 1295 | match kind { |
1272 | LIFETIME_PARAM => Some(LifetimeParam { syntax }), | 1296 | LIFETIME_PARAM => true, |
1273 | _ => None, | 1297 | _ => false, |
1274 | } | 1298 | } |
1275 | } | 1299 | } |
1300 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1301 | if Self::can_cast(syntax.kind()) { Some(LifetimeParam { syntax }) } else { None } | ||
1302 | } | ||
1276 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1303 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1277 | } | 1304 | } |
1278 | 1305 | ||
@@ -1287,12 +1314,15 @@ pub struct Literal { | |||
1287 | } | 1314 | } |
1288 | 1315 | ||
1289 | impl AstNode for Literal { | 1316 | impl AstNode for Literal { |
1290 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1317 | fn can_cast(kind: SyntaxKind) -> bool { |
1291 | match syntax.kind() { | 1318 | match kind { |
1292 | LITERAL => Some(Literal { syntax }), | 1319 | LITERAL => true, |
1293 | _ => None, | 1320 | _ => false, |
1294 | } | 1321 | } |
1295 | } | 1322 | } |
1323 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1324 | if Self::can_cast(syntax.kind()) { Some(Literal { syntax }) } else { None } | ||
1325 | } | ||
1296 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1326 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1297 | } | 1327 | } |
1298 | 1328 | ||
@@ -1306,12 +1336,15 @@ pub struct LiteralPat { | |||
1306 | } | 1336 | } |
1307 | 1337 | ||
1308 | impl AstNode for LiteralPat { | 1338 | impl AstNode for LiteralPat { |
1309 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1339 | fn can_cast(kind: SyntaxKind) -> bool { |
1310 | match syntax.kind() { | 1340 | match kind { |
1311 | LITERAL_PAT => Some(LiteralPat { syntax }), | 1341 | LITERAL_PAT => true, |
1312 | _ => None, | 1342 | _ => false, |
1313 | } | 1343 | } |
1314 | } | 1344 | } |
1345 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1346 | if Self::can_cast(syntax.kind()) { Some(LiteralPat { syntax }) } else { None } | ||
1347 | } | ||
1315 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1348 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1316 | } | 1349 | } |
1317 | 1350 | ||
@@ -1329,12 +1362,15 @@ pub struct LoopExpr { | |||
1329 | } | 1362 | } |
1330 | 1363 | ||
1331 | impl AstNode for LoopExpr { | 1364 | impl AstNode for LoopExpr { |
1332 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1365 | fn can_cast(kind: SyntaxKind) -> bool { |
1333 | match syntax.kind() { | 1366 | match kind { |
1334 | LOOP_EXPR => Some(LoopExpr { syntax }), | 1367 | LOOP_EXPR => true, |
1335 | _ => None, | 1368 | _ => false, |
1336 | } | 1369 | } |
1337 | } | 1370 | } |
1371 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1372 | if Self::can_cast(syntax.kind()) { Some(LoopExpr { syntax }) } else { None } | ||
1373 | } | ||
1338 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1374 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1339 | } | 1375 | } |
1340 | 1376 | ||
@@ -1349,12 +1385,15 @@ pub struct MacroCall { | |||
1349 | } | 1385 | } |
1350 | 1386 | ||
1351 | impl AstNode for MacroCall { | 1387 | impl AstNode for MacroCall { |
1352 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1388 | fn can_cast(kind: SyntaxKind) -> bool { |
1353 | match syntax.kind() { | 1389 | match kind { |
1354 | MACRO_CALL => Some(MacroCall { syntax }), | 1390 | MACRO_CALL => true, |
1355 | _ => None, | 1391 | _ => false, |
1356 | } | 1392 | } |
1357 | } | 1393 | } |
1394 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1395 | if Self::can_cast(syntax.kind()) { Some(MacroCall { syntax }) } else { None } | ||
1396 | } | ||
1358 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1397 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1359 | } | 1398 | } |
1360 | 1399 | ||
@@ -1379,12 +1418,15 @@ pub struct MacroItems { | |||
1379 | } | 1418 | } |
1380 | 1419 | ||
1381 | impl AstNode for MacroItems { | 1420 | impl AstNode for MacroItems { |
1382 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1421 | fn can_cast(kind: SyntaxKind) -> bool { |
1383 | match syntax.kind() { | 1422 | match kind { |
1384 | MACRO_ITEMS => Some(MacroItems { syntax }), | 1423 | MACRO_ITEMS => true, |
1385 | _ => None, | 1424 | _ => false, |
1386 | } | 1425 | } |
1387 | } | 1426 | } |
1427 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1428 | if Self::can_cast(syntax.kind()) { Some(MacroItems { syntax }) } else { None } | ||
1429 | } | ||
1388 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1430 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1389 | } | 1431 | } |
1390 | 1432 | ||
@@ -1400,12 +1442,15 @@ pub struct MacroStmts { | |||
1400 | } | 1442 | } |
1401 | 1443 | ||
1402 | impl AstNode for MacroStmts { | 1444 | impl AstNode for MacroStmts { |
1403 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1445 | fn can_cast(kind: SyntaxKind) -> bool { |
1404 | match syntax.kind() { | 1446 | match kind { |
1405 | MACRO_STMTS => Some(MacroStmts { syntax }), | 1447 | MACRO_STMTS => true, |
1406 | _ => None, | 1448 | _ => false, |
1407 | } | 1449 | } |
1408 | } | 1450 | } |
1451 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1452 | if Self::can_cast(syntax.kind()) { Some(MacroStmts { syntax }) } else { None } | ||
1453 | } | ||
1409 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1454 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1410 | } | 1455 | } |
1411 | 1456 | ||
@@ -1427,12 +1472,15 @@ pub struct MatchArm { | |||
1427 | } | 1472 | } |
1428 | 1473 | ||
1429 | impl AstNode for MatchArm { | 1474 | impl AstNode for MatchArm { |
1430 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1475 | fn can_cast(kind: SyntaxKind) -> bool { |
1431 | match syntax.kind() { | 1476 | match kind { |
1432 | MATCH_ARM => Some(MatchArm { syntax }), | 1477 | MATCH_ARM => true, |
1433 | _ => None, | 1478 | _ => false, |
1434 | } | 1479 | } |
1435 | } | 1480 | } |
1481 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1482 | if Self::can_cast(syntax.kind()) { Some(MatchArm { syntax }) } else { None } | ||
1483 | } | ||
1436 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1484 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1437 | } | 1485 | } |
1438 | 1486 | ||
@@ -1459,12 +1507,15 @@ pub struct MatchArmList { | |||
1459 | } | 1507 | } |
1460 | 1508 | ||
1461 | impl AstNode for MatchArmList { | 1509 | impl AstNode for MatchArmList { |
1462 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1510 | fn can_cast(kind: SyntaxKind) -> bool { |
1463 | match syntax.kind() { | 1511 | match kind { |
1464 | MATCH_ARM_LIST => Some(MatchArmList { syntax }), | 1512 | MATCH_ARM_LIST => true, |
1465 | _ => None, | 1513 | _ => false, |
1466 | } | 1514 | } |
1467 | } | 1515 | } |
1516 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1517 | if Self::can_cast(syntax.kind()) { Some(MatchArmList { syntax }) } else { None } | ||
1518 | } | ||
1468 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1519 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1469 | } | 1520 | } |
1470 | 1521 | ||
@@ -1483,12 +1534,15 @@ pub struct MatchExpr { | |||
1483 | } | 1534 | } |
1484 | 1535 | ||
1485 | impl AstNode for MatchExpr { | 1536 | impl AstNode for MatchExpr { |
1486 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1537 | fn can_cast(kind: SyntaxKind) -> bool { |
1487 | match syntax.kind() { | 1538 | match kind { |
1488 | MATCH_EXPR => Some(MatchExpr { syntax }), | 1539 | MATCH_EXPR => true, |
1489 | _ => None, | 1540 | _ => false, |
1490 | } | 1541 | } |
1491 | } | 1542 | } |
1543 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1544 | if Self::can_cast(syntax.kind()) { Some(MatchExpr { syntax }) } else { None } | ||
1545 | } | ||
1492 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1546 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1493 | } | 1547 | } |
1494 | 1548 | ||
@@ -1510,12 +1564,15 @@ pub struct MatchGuard { | |||
1510 | } | 1564 | } |
1511 | 1565 | ||
1512 | impl AstNode for MatchGuard { | 1566 | impl AstNode for MatchGuard { |
1513 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1567 | fn can_cast(kind: SyntaxKind) -> bool { |
1514 | match syntax.kind() { | 1568 | match kind { |
1515 | MATCH_GUARD => Some(MatchGuard { syntax }), | 1569 | MATCH_GUARD => true, |
1516 | _ => None, | 1570 | _ => false, |
1517 | } | 1571 | } |
1518 | } | 1572 | } |
1573 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1574 | if Self::can_cast(syntax.kind()) { Some(MatchGuard { syntax }) } else { None } | ||
1575 | } | ||
1519 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1576 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1520 | } | 1577 | } |
1521 | 1578 | ||
@@ -1533,12 +1590,15 @@ pub struct MethodCallExpr { | |||
1533 | } | 1590 | } |
1534 | 1591 | ||
1535 | impl AstNode for MethodCallExpr { | 1592 | impl AstNode for MethodCallExpr { |
1536 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1593 | fn can_cast(kind: SyntaxKind) -> bool { |
1537 | match syntax.kind() { | 1594 | match kind { |
1538 | METHOD_CALL_EXPR => Some(MethodCallExpr { syntax }), | 1595 | METHOD_CALL_EXPR => true, |
1539 | _ => None, | 1596 | _ => false, |
1540 | } | 1597 | } |
1541 | } | 1598 | } |
1599 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1600 | if Self::can_cast(syntax.kind()) { Some(MethodCallExpr { syntax }) } else { None } | ||
1601 | } | ||
1542 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1602 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1543 | } | 1603 | } |
1544 | 1604 | ||
@@ -1565,12 +1625,15 @@ pub struct Module { | |||
1565 | } | 1625 | } |
1566 | 1626 | ||
1567 | impl AstNode for Module { | 1627 | impl AstNode for Module { |
1568 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1628 | fn can_cast(kind: SyntaxKind) -> bool { |
1569 | match syntax.kind() { | 1629 | match kind { |
1570 | MODULE => Some(Module { syntax }), | 1630 | MODULE => true, |
1571 | _ => None, | 1631 | _ => false, |
1572 | } | 1632 | } |
1573 | } | 1633 | } |
1634 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1635 | if Self::can_cast(syntax.kind()) { Some(Module { syntax }) } else { None } | ||
1636 | } | ||
1574 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1637 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1575 | } | 1638 | } |
1576 | 1639 | ||
@@ -1591,6 +1654,20 @@ pub struct ModuleItem { | |||
1591 | pub(crate) syntax: SyntaxNode, | 1654 | pub(crate) syntax: SyntaxNode, |
1592 | } | 1655 | } |
1593 | 1656 | ||
1657 | impl AstNode for ModuleItem { | ||
1658 | fn can_cast(kind: SyntaxKind) -> bool { | ||
1659 | match kind { | ||
1660 | | STRUCT_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | TYPE_ALIAS_DEF | IMPL_BLOCK | USE_ITEM | EXTERN_CRATE_ITEM | CONST_DEF | STATIC_DEF | MODULE => true, | ||
1661 | _ => false, | ||
1662 | } | ||
1663 | } | ||
1664 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1665 | if Self::can_cast(syntax.kind()) { Some(ModuleItem { syntax }) } else { None } | ||
1666 | } | ||
1667 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1668 | } | ||
1669 | |||
1670 | |||
1594 | #[derive(Debug, Clone, PartialEq, Eq)] | 1671 | #[derive(Debug, Clone, PartialEq, Eq)] |
1595 | pub enum ModuleItemKind { | 1672 | pub enum ModuleItemKind { |
1596 | StructDef(StructDef), | 1673 | StructDef(StructDef), |
@@ -1606,82 +1683,38 @@ pub enum ModuleItemKind { | |||
1606 | Module(Module), | 1683 | Module(Module), |
1607 | } | 1684 | } |
1608 | impl From<StructDef> for ModuleItem { | 1685 | impl From<StructDef> for ModuleItem { |
1609 | fn from(n: StructDef) -> ModuleItem { | 1686 | fn from(n: StructDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1610 | ModuleItem::cast(n.syntax).unwrap() | ||
1611 | } | ||
1612 | } | 1687 | } |
1613 | impl From<EnumDef> for ModuleItem { | 1688 | impl From<EnumDef> for ModuleItem { |
1614 | fn from(n: EnumDef) -> ModuleItem { | 1689 | fn from(n: EnumDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1615 | ModuleItem::cast(n.syntax).unwrap() | ||
1616 | } | ||
1617 | } | 1690 | } |
1618 | impl From<FnDef> for ModuleItem { | 1691 | impl From<FnDef> for ModuleItem { |
1619 | fn from(n: FnDef) -> ModuleItem { | 1692 | fn from(n: FnDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1620 | ModuleItem::cast(n.syntax).unwrap() | ||
1621 | } | ||
1622 | } | 1693 | } |
1623 | impl From<TraitDef> for ModuleItem { | 1694 | impl From<TraitDef> for ModuleItem { |
1624 | fn from(n: TraitDef) -> ModuleItem { | 1695 | fn from(n: TraitDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1625 | ModuleItem::cast(n.syntax).unwrap() | ||
1626 | } | ||
1627 | } | 1696 | } |
1628 | impl From<TypeAliasDef> for ModuleItem { | 1697 | impl From<TypeAliasDef> for ModuleItem { |
1629 | fn from(n: TypeAliasDef) -> ModuleItem { | 1698 | fn from(n: TypeAliasDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1630 | ModuleItem::cast(n.syntax).unwrap() | ||
1631 | } | ||
1632 | } | 1699 | } |
1633 | impl From<ImplBlock> for ModuleItem { | 1700 | impl From<ImplBlock> for ModuleItem { |
1634 | fn from(n: ImplBlock) -> ModuleItem { | 1701 | fn from(n: ImplBlock) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1635 | ModuleItem::cast(n.syntax).unwrap() | ||
1636 | } | ||
1637 | } | 1702 | } |
1638 | impl From<UseItem> for ModuleItem { | 1703 | impl From<UseItem> for ModuleItem { |
1639 | fn from(n: UseItem) -> ModuleItem { | 1704 | fn from(n: UseItem) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1640 | ModuleItem::cast(n.syntax).unwrap() | ||
1641 | } | ||
1642 | } | 1705 | } |
1643 | impl From<ExternCrateItem> for ModuleItem { | 1706 | impl From<ExternCrateItem> for ModuleItem { |
1644 | fn from(n: ExternCrateItem) -> ModuleItem { | 1707 | fn from(n: ExternCrateItem) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1645 | ModuleItem::cast(n.syntax).unwrap() | ||
1646 | } | ||
1647 | } | 1708 | } |
1648 | impl From<ConstDef> for ModuleItem { | 1709 | impl From<ConstDef> for ModuleItem { |
1649 | fn from(n: ConstDef) -> ModuleItem { | 1710 | fn from(n: ConstDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1650 | ModuleItem::cast(n.syntax).unwrap() | ||
1651 | } | ||
1652 | } | 1711 | } |
1653 | impl From<StaticDef> for ModuleItem { | 1712 | impl From<StaticDef> for ModuleItem { |
1654 | fn from(n: StaticDef) -> ModuleItem { | 1713 | fn from(n: StaticDef) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1655 | ModuleItem::cast(n.syntax).unwrap() | ||
1656 | } | ||
1657 | } | 1714 | } |
1658 | impl From<Module> for ModuleItem { | 1715 | impl From<Module> for ModuleItem { |
1659 | fn from(n: Module) -> ModuleItem { | 1716 | fn from(n: Module) -> ModuleItem { ModuleItem { syntax: n.syntax } } |
1660 | ModuleItem::cast(n.syntax).unwrap() | ||
1661 | } | ||
1662 | } | ||
1663 | |||
1664 | |||
1665 | impl AstNode for ModuleItem { | ||
1666 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1667 | match syntax.kind() { | ||
1668 | | STRUCT_DEF | ||
1669 | | ENUM_DEF | ||
1670 | | FN_DEF | ||
1671 | | TRAIT_DEF | ||
1672 | | TYPE_ALIAS_DEF | ||
1673 | | IMPL_BLOCK | ||
1674 | | USE_ITEM | ||
1675 | | EXTERN_CRATE_ITEM | ||
1676 | | CONST_DEF | ||
1677 | | STATIC_DEF | ||
1678 | | MODULE => Some(ModuleItem { syntax }), | ||
1679 | _ => None, | ||
1680 | } | ||
1681 | } | ||
1682 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1683 | } | 1717 | } |
1684 | |||
1685 | impl ModuleItem { | 1718 | impl ModuleItem { |
1686 | pub fn kind(&self) -> ModuleItemKind { | 1719 | pub fn kind(&self) -> ModuleItemKind { |
1687 | match self.syntax.kind() { | 1720 | match self.syntax.kind() { |
@@ -1710,12 +1743,15 @@ pub struct Name { | |||
1710 | } | 1743 | } |
1711 | 1744 | ||
1712 | impl AstNode for Name { | 1745 | impl AstNode for Name { |
1713 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1746 | fn can_cast(kind: SyntaxKind) -> bool { |
1714 | match syntax.kind() { | 1747 | match kind { |
1715 | NAME => Some(Name { syntax }), | 1748 | NAME => true, |
1716 | _ => None, | 1749 | _ => false, |
1717 | } | 1750 | } |
1718 | } | 1751 | } |
1752 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1753 | if Self::can_cast(syntax.kind()) { Some(Name { syntax }) } else { None } | ||
1754 | } | ||
1719 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1755 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1720 | } | 1756 | } |
1721 | 1757 | ||
@@ -1729,12 +1765,15 @@ pub struct NameRef { | |||
1729 | } | 1765 | } |
1730 | 1766 | ||
1731 | impl AstNode for NameRef { | 1767 | impl AstNode for NameRef { |
1732 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1768 | fn can_cast(kind: SyntaxKind) -> bool { |
1733 | match syntax.kind() { | 1769 | match kind { |
1734 | NAME_REF => Some(NameRef { syntax }), | 1770 | NAME_REF => true, |
1735 | _ => None, | 1771 | _ => false, |
1736 | } | 1772 | } |
1737 | } | 1773 | } |
1774 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1775 | if Self::can_cast(syntax.kind()) { Some(NameRef { syntax }) } else { None } | ||
1776 | } | ||
1738 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1777 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1739 | } | 1778 | } |
1740 | 1779 | ||
@@ -1748,12 +1787,15 @@ pub struct NamedField { | |||
1748 | } | 1787 | } |
1749 | 1788 | ||
1750 | impl AstNode for NamedField { | 1789 | impl AstNode for NamedField { |
1751 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1790 | fn can_cast(kind: SyntaxKind) -> bool { |
1752 | match syntax.kind() { | 1791 | match kind { |
1753 | NAMED_FIELD => Some(NamedField { syntax }), | 1792 | NAMED_FIELD => true, |
1754 | _ => None, | 1793 | _ => false, |
1755 | } | 1794 | } |
1756 | } | 1795 | } |
1796 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1797 | if Self::can_cast(syntax.kind()) { Some(NamedField { syntax }) } else { None } | ||
1798 | } | ||
1757 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1799 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1758 | } | 1800 | } |
1759 | 1801 | ||
@@ -1775,12 +1817,15 @@ pub struct NamedFieldDef { | |||
1775 | } | 1817 | } |
1776 | 1818 | ||
1777 | impl AstNode for NamedFieldDef { | 1819 | impl AstNode for NamedFieldDef { |
1778 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1820 | fn can_cast(kind: SyntaxKind) -> bool { |
1779 | match syntax.kind() { | 1821 | match kind { |
1780 | NAMED_FIELD_DEF => Some(NamedFieldDef { syntax }), | 1822 | NAMED_FIELD_DEF => true, |
1781 | _ => None, | 1823 | _ => false, |
1782 | } | 1824 | } |
1783 | } | 1825 | } |
1826 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1827 | if Self::can_cast(syntax.kind()) { Some(NamedFieldDef { syntax }) } else { None } | ||
1828 | } | ||
1784 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1829 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1785 | } | 1830 | } |
1786 | 1831 | ||
@@ -1799,12 +1844,15 @@ pub struct NamedFieldDefList { | |||
1799 | } | 1844 | } |
1800 | 1845 | ||
1801 | impl AstNode for NamedFieldDefList { | 1846 | impl AstNode for NamedFieldDefList { |
1802 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1847 | fn can_cast(kind: SyntaxKind) -> bool { |
1803 | match syntax.kind() { | 1848 | match kind { |
1804 | NAMED_FIELD_DEF_LIST => Some(NamedFieldDefList { syntax }), | 1849 | NAMED_FIELD_DEF_LIST => true, |
1805 | _ => None, | 1850 | _ => false, |
1806 | } | 1851 | } |
1807 | } | 1852 | } |
1853 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1854 | if Self::can_cast(syntax.kind()) { Some(NamedFieldDefList { syntax }) } else { None } | ||
1855 | } | ||
1808 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1856 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1809 | } | 1857 | } |
1810 | 1858 | ||
@@ -1822,12 +1870,15 @@ pub struct NamedFieldList { | |||
1822 | } | 1870 | } |
1823 | 1871 | ||
1824 | impl AstNode for NamedFieldList { | 1872 | impl AstNode for NamedFieldList { |
1825 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1873 | fn can_cast(kind: SyntaxKind) -> bool { |
1826 | match syntax.kind() { | 1874 | match kind { |
1827 | NAMED_FIELD_LIST => Some(NamedFieldList { syntax }), | 1875 | NAMED_FIELD_LIST => true, |
1828 | _ => None, | 1876 | _ => false, |
1829 | } | 1877 | } |
1830 | } | 1878 | } |
1879 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1880 | if Self::can_cast(syntax.kind()) { Some(NamedFieldList { syntax }) } else { None } | ||
1881 | } | ||
1831 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1882 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1832 | } | 1883 | } |
1833 | 1884 | ||
@@ -1849,12 +1900,15 @@ pub struct NeverType { | |||
1849 | } | 1900 | } |
1850 | 1901 | ||
1851 | impl AstNode for NeverType { | 1902 | impl AstNode for NeverType { |
1852 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1903 | fn can_cast(kind: SyntaxKind) -> bool { |
1853 | match syntax.kind() { | 1904 | match kind { |
1854 | NEVER_TYPE => Some(NeverType { syntax }), | 1905 | NEVER_TYPE => true, |
1855 | _ => None, | 1906 | _ => false, |
1856 | } | 1907 | } |
1857 | } | 1908 | } |
1909 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1910 | if Self::can_cast(syntax.kind()) { Some(NeverType { syntax }) } else { None } | ||
1911 | } | ||
1858 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1912 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1859 | } | 1913 | } |
1860 | 1914 | ||
@@ -1867,34 +1921,31 @@ pub struct NominalDef { | |||
1867 | pub(crate) syntax: SyntaxNode, | 1921 | pub(crate) syntax: SyntaxNode, |
1868 | } | 1922 | } |
1869 | 1923 | ||
1924 | impl AstNode for NominalDef { | ||
1925 | fn can_cast(kind: SyntaxKind) -> bool { | ||
1926 | match kind { | ||
1927 | | STRUCT_DEF | ENUM_DEF => true, | ||
1928 | _ => false, | ||
1929 | } | ||
1930 | } | ||
1931 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1932 | if Self::can_cast(syntax.kind()) { Some(NominalDef { syntax }) } else { None } | ||
1933 | } | ||
1934 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1935 | } | ||
1936 | |||
1937 | |||
1870 | #[derive(Debug, Clone, PartialEq, Eq)] | 1938 | #[derive(Debug, Clone, PartialEq, Eq)] |
1871 | pub enum NominalDefKind { | 1939 | pub enum NominalDefKind { |
1872 | StructDef(StructDef), | 1940 | StructDef(StructDef), |
1873 | EnumDef(EnumDef), | 1941 | EnumDef(EnumDef), |
1874 | } | 1942 | } |
1875 | impl From<StructDef> for NominalDef { | 1943 | impl From<StructDef> for NominalDef { |
1876 | fn from(n: StructDef) -> NominalDef { | 1944 | fn from(n: StructDef) -> NominalDef { NominalDef { syntax: n.syntax } } |
1877 | NominalDef::cast(n.syntax).unwrap() | ||
1878 | } | ||
1879 | } | 1945 | } |
1880 | impl From<EnumDef> for NominalDef { | 1946 | impl From<EnumDef> for NominalDef { |
1881 | fn from(n: EnumDef) -> NominalDef { | 1947 | fn from(n: EnumDef) -> NominalDef { NominalDef { syntax: n.syntax } } |
1882 | NominalDef::cast(n.syntax).unwrap() | ||
1883 | } | ||
1884 | } | ||
1885 | |||
1886 | |||
1887 | impl AstNode for NominalDef { | ||
1888 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1889 | match syntax.kind() { | ||
1890 | | STRUCT_DEF | ||
1891 | | ENUM_DEF => Some(NominalDef { syntax }), | ||
1892 | _ => None, | ||
1893 | } | ||
1894 | } | ||
1895 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
1896 | } | 1948 | } |
1897 | |||
1898 | impl NominalDef { | 1949 | impl NominalDef { |
1899 | pub fn kind(&self) -> NominalDefKind { | 1950 | pub fn kind(&self) -> NominalDefKind { |
1900 | match self.syntax.kind() { | 1951 | match self.syntax.kind() { |
@@ -1917,12 +1968,15 @@ pub struct Param { | |||
1917 | } | 1968 | } |
1918 | 1969 | ||
1919 | impl AstNode for Param { | 1970 | impl AstNode for Param { |
1920 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1971 | fn can_cast(kind: SyntaxKind) -> bool { |
1921 | match syntax.kind() { | 1972 | match kind { |
1922 | PARAM => Some(Param { syntax }), | 1973 | PARAM => true, |
1923 | _ => None, | 1974 | _ => false, |
1924 | } | 1975 | } |
1925 | } | 1976 | } |
1977 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
1978 | if Self::can_cast(syntax.kind()) { Some(Param { syntax }) } else { None } | ||
1979 | } | ||
1926 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 1980 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1927 | } | 1981 | } |
1928 | 1982 | ||
@@ -1941,12 +1995,15 @@ pub struct ParamList { | |||
1941 | } | 1995 | } |
1942 | 1996 | ||
1943 | impl AstNode for ParamList { | 1997 | impl AstNode for ParamList { |
1944 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 1998 | fn can_cast(kind: SyntaxKind) -> bool { |
1945 | match syntax.kind() { | 1999 | match kind { |
1946 | PARAM_LIST => Some(ParamList { syntax }), | 2000 | PARAM_LIST => true, |
1947 | _ => None, | 2001 | _ => false, |
1948 | } | 2002 | } |
1949 | } | 2003 | } |
2004 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2005 | if Self::can_cast(syntax.kind()) { Some(ParamList { syntax }) } else { None } | ||
2006 | } | ||
1950 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2007 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1951 | } | 2008 | } |
1952 | 2009 | ||
@@ -1968,12 +2025,15 @@ pub struct ParenExpr { | |||
1968 | } | 2025 | } |
1969 | 2026 | ||
1970 | impl AstNode for ParenExpr { | 2027 | impl AstNode for ParenExpr { |
1971 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2028 | fn can_cast(kind: SyntaxKind) -> bool { |
1972 | match syntax.kind() { | 2029 | match kind { |
1973 | PAREN_EXPR => Some(ParenExpr { syntax }), | 2030 | PAREN_EXPR => true, |
1974 | _ => None, | 2031 | _ => false, |
1975 | } | 2032 | } |
1976 | } | 2033 | } |
2034 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2035 | if Self::can_cast(syntax.kind()) { Some(ParenExpr { syntax }) } else { None } | ||
2036 | } | ||
1977 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2037 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
1978 | } | 2038 | } |
1979 | 2039 | ||
@@ -1991,12 +2051,15 @@ pub struct ParenType { | |||
1991 | } | 2051 | } |
1992 | 2052 | ||
1993 | impl AstNode for ParenType { | 2053 | impl AstNode for ParenType { |
1994 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2054 | fn can_cast(kind: SyntaxKind) -> bool { |
1995 | match syntax.kind() { | 2055 | match kind { |
1996 | PAREN_TYPE => Some(ParenType { syntax }), | 2056 | PAREN_TYPE => true, |
1997 | _ => None, | 2057 | _ => false, |
1998 | } | 2058 | } |
1999 | } | 2059 | } |
2060 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2061 | if Self::can_cast(syntax.kind()) { Some(ParenType { syntax }) } else { None } | ||
2062 | } | ||
2000 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2063 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2001 | } | 2064 | } |
2002 | 2065 | ||
@@ -2013,6 +2076,20 @@ pub struct Pat { | |||
2013 | pub(crate) syntax: SyntaxNode, | 2076 | pub(crate) syntax: SyntaxNode, |
2014 | } | 2077 | } |
2015 | 2078 | ||
2079 | impl AstNode for Pat { | ||
2080 | fn can_cast(kind: SyntaxKind) -> bool { | ||
2081 | match kind { | ||
2082 | | REF_PAT | BIND_PAT | PLACEHOLDER_PAT | PATH_PAT | STRUCT_PAT | TUPLE_STRUCT_PAT | TUPLE_PAT | SLICE_PAT | RANGE_PAT | LITERAL_PAT => true, | ||
2083 | _ => false, | ||
2084 | } | ||
2085 | } | ||
2086 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2087 | if Self::can_cast(syntax.kind()) { Some(Pat { syntax }) } else { None } | ||
2088 | } | ||
2089 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
2090 | } | ||
2091 | |||
2092 | |||
2016 | #[derive(Debug, Clone, PartialEq, Eq)] | 2093 | #[derive(Debug, Clone, PartialEq, Eq)] |
2017 | pub enum PatKind { | 2094 | pub enum PatKind { |
2018 | RefPat(RefPat), | 2095 | RefPat(RefPat), |
@@ -2027,76 +2104,35 @@ pub enum PatKind { | |||
2027 | LiteralPat(LiteralPat), | 2104 | LiteralPat(LiteralPat), |
2028 | } | 2105 | } |
2029 | impl From<RefPat> for Pat { | 2106 | impl From<RefPat> for Pat { |
2030 | fn from(n: RefPat) -> Pat { | 2107 | fn from(n: RefPat) -> Pat { Pat { syntax: n.syntax } } |
2031 | Pat::cast(n.syntax).unwrap() | ||
2032 | } | ||
2033 | } | 2108 | } |
2034 | impl From<BindPat> for Pat { | 2109 | impl From<BindPat> for Pat { |
2035 | fn from(n: BindPat) -> Pat { | 2110 | fn from(n: BindPat) -> Pat { Pat { syntax: n.syntax } } |
2036 | Pat::cast(n.syntax).unwrap() | ||
2037 | } | ||
2038 | } | 2111 | } |
2039 | impl From<PlaceholderPat> for Pat { | 2112 | impl From<PlaceholderPat> for Pat { |
2040 | fn from(n: PlaceholderPat) -> Pat { | 2113 | fn from(n: PlaceholderPat) -> Pat { Pat { syntax: n.syntax } } |
2041 | Pat::cast(n.syntax).unwrap() | ||
2042 | } | ||
2043 | } | 2114 | } |
2044 | impl From<PathPat> for Pat { | 2115 | impl From<PathPat> for Pat { |
2045 | fn from(n: PathPat) -> Pat { | 2116 | fn from(n: PathPat) -> Pat { Pat { syntax: n.syntax } } |
2046 | Pat::cast(n.syntax).unwrap() | ||
2047 | } | ||
2048 | } | 2117 | } |
2049 | impl From<StructPat> for Pat { | 2118 | impl From<StructPat> for Pat { |
2050 | fn from(n: StructPat) -> Pat { | 2119 | fn from(n: StructPat) -> Pat { Pat { syntax: n.syntax } } |
2051 | Pat::cast(n.syntax).unwrap() | ||
2052 | } | ||
2053 | } | 2120 | } |
2054 | impl From<TupleStructPat> for Pat { | 2121 | impl From<TupleStructPat> for Pat { |
2055 | fn from(n: TupleStructPat) -> Pat { | 2122 | fn from(n: TupleStructPat) -> Pat { Pat { syntax: n.syntax } } |
2056 | Pat::cast(n.syntax).unwrap() | ||
2057 | } | ||
2058 | } | 2123 | } |
2059 | impl From<TuplePat> for Pat { | 2124 | impl From<TuplePat> for Pat { |
2060 | fn from(n: TuplePat) -> Pat { | 2125 | fn from(n: TuplePat) -> Pat { Pat { syntax: n.syntax } } |
2061 | Pat::cast(n.syntax).unwrap() | ||
2062 | } | ||
2063 | } | 2126 | } |
2064 | impl From<SlicePat> for Pat { | 2127 | impl From<SlicePat> for Pat { |
2065 | fn from(n: SlicePat) -> Pat { | 2128 | fn from(n: SlicePat) -> Pat { Pat { syntax: n.syntax } } |
2066 | Pat::cast(n.syntax).unwrap() | ||
2067 | } | ||
2068 | } | 2129 | } |
2069 | impl From<RangePat> for Pat { | 2130 | impl From<RangePat> for Pat { |
2070 | fn from(n: RangePat) -> Pat { | 2131 | fn from(n: RangePat) -> Pat { Pat { syntax: n.syntax } } |
2071 | Pat::cast(n.syntax).unwrap() | ||
2072 | } | ||
2073 | } | 2132 | } |
2074 | impl From<LiteralPat> for Pat { | 2133 | impl From<LiteralPat> for Pat { |
2075 | fn from(n: LiteralPat) -> Pat { | 2134 | fn from(n: LiteralPat) -> Pat { Pat { syntax: n.syntax } } |
2076 | Pat::cast(n.syntax).unwrap() | ||
2077 | } | ||
2078 | } | ||
2079 | |||
2080 | |||
2081 | impl AstNode for Pat { | ||
2082 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2083 | match syntax.kind() { | ||
2084 | | REF_PAT | ||
2085 | | BIND_PAT | ||
2086 | | PLACEHOLDER_PAT | ||
2087 | | PATH_PAT | ||
2088 | | STRUCT_PAT | ||
2089 | | TUPLE_STRUCT_PAT | ||
2090 | | TUPLE_PAT | ||
2091 | | SLICE_PAT | ||
2092 | | RANGE_PAT | ||
2093 | | LITERAL_PAT => Some(Pat { syntax }), | ||
2094 | _ => None, | ||
2095 | } | ||
2096 | } | ||
2097 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
2098 | } | 2135 | } |
2099 | |||
2100 | impl Pat { | 2136 | impl Pat { |
2101 | pub fn kind(&self) -> PatKind { | 2137 | pub fn kind(&self) -> PatKind { |
2102 | match self.syntax.kind() { | 2138 | match self.syntax.kind() { |
@@ -2124,12 +2160,15 @@ pub struct Path { | |||
2124 | } | 2160 | } |
2125 | 2161 | ||
2126 | impl AstNode for Path { | 2162 | impl AstNode for Path { |
2127 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2163 | fn can_cast(kind: SyntaxKind) -> bool { |
2128 | match syntax.kind() { | 2164 | match kind { |
2129 | PATH => Some(Path { syntax }), | 2165 | PATH => true, |
2130 | _ => None, | 2166 | _ => false, |
2131 | } | 2167 | } |
2132 | } | 2168 | } |
2169 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2170 | if Self::can_cast(syntax.kind()) { Some(Path { syntax }) } else { None } | ||
2171 | } | ||
2133 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2172 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2134 | } | 2173 | } |
2135 | 2174 | ||
@@ -2151,12 +2190,15 @@ pub struct PathExpr { | |||
2151 | } | 2190 | } |
2152 | 2191 | ||
2153 | impl AstNode for PathExpr { | 2192 | impl AstNode for PathExpr { |
2154 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2193 | fn can_cast(kind: SyntaxKind) -> bool { |
2155 | match syntax.kind() { | 2194 | match kind { |
2156 | PATH_EXPR => Some(PathExpr { syntax }), | 2195 | PATH_EXPR => true, |
2157 | _ => None, | 2196 | _ => false, |
2158 | } | 2197 | } |
2159 | } | 2198 | } |
2199 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2200 | if Self::can_cast(syntax.kind()) { Some(PathExpr { syntax }) } else { None } | ||
2201 | } | ||
2160 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2202 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2161 | } | 2203 | } |
2162 | 2204 | ||
@@ -2174,12 +2216,15 @@ pub struct PathPat { | |||
2174 | } | 2216 | } |
2175 | 2217 | ||
2176 | impl AstNode for PathPat { | 2218 | impl AstNode for PathPat { |
2177 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2219 | fn can_cast(kind: SyntaxKind) -> bool { |
2178 | match syntax.kind() { | 2220 | match kind { |
2179 | PATH_PAT => Some(PathPat { syntax }), | 2221 | PATH_PAT => true, |
2180 | _ => None, | 2222 | _ => false, |
2181 | } | 2223 | } |
2182 | } | 2224 | } |
2225 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2226 | if Self::can_cast(syntax.kind()) { Some(PathPat { syntax }) } else { None } | ||
2227 | } | ||
2183 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2228 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2184 | } | 2229 | } |
2185 | 2230 | ||
@@ -2197,12 +2242,15 @@ pub struct PathSegment { | |||
2197 | } | 2242 | } |
2198 | 2243 | ||
2199 | impl AstNode for PathSegment { | 2244 | impl AstNode for PathSegment { |
2200 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2245 | fn can_cast(kind: SyntaxKind) -> bool { |
2201 | match syntax.kind() { | 2246 | match kind { |
2202 | PATH_SEGMENT => Some(PathSegment { syntax }), | 2247 | PATH_SEGMENT => true, |
2203 | _ => None, | 2248 | _ => false, |
2204 | } | 2249 | } |
2205 | } | 2250 | } |
2251 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2252 | if Self::can_cast(syntax.kind()) { Some(PathSegment { syntax }) } else { None } | ||
2253 | } | ||
2206 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2254 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2207 | } | 2255 | } |
2208 | 2256 | ||
@@ -2224,12 +2272,15 @@ pub struct PathType { | |||
2224 | } | 2272 | } |
2225 | 2273 | ||
2226 | impl AstNode for PathType { | 2274 | impl AstNode for PathType { |
2227 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2275 | fn can_cast(kind: SyntaxKind) -> bool { |
2228 | match syntax.kind() { | 2276 | match kind { |
2229 | PATH_TYPE => Some(PathType { syntax }), | 2277 | PATH_TYPE => true, |
2230 | _ => None, | 2278 | _ => false, |
2231 | } | 2279 | } |
2232 | } | 2280 | } |
2281 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2282 | if Self::can_cast(syntax.kind()) { Some(PathType { syntax }) } else { None } | ||
2283 | } | ||
2233 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2284 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2234 | } | 2285 | } |
2235 | 2286 | ||
@@ -2247,12 +2298,15 @@ pub struct PlaceholderPat { | |||
2247 | } | 2298 | } |
2248 | 2299 | ||
2249 | impl AstNode for PlaceholderPat { | 2300 | impl AstNode for PlaceholderPat { |
2250 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2301 | fn can_cast(kind: SyntaxKind) -> bool { |
2251 | match syntax.kind() { | 2302 | match kind { |
2252 | PLACEHOLDER_PAT => Some(PlaceholderPat { syntax }), | 2303 | PLACEHOLDER_PAT => true, |
2253 | _ => None, | 2304 | _ => false, |
2254 | } | 2305 | } |
2255 | } | 2306 | } |
2307 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2308 | if Self::can_cast(syntax.kind()) { Some(PlaceholderPat { syntax }) } else { None } | ||
2309 | } | ||
2256 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2310 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2257 | } | 2311 | } |
2258 | 2312 | ||
@@ -2266,12 +2320,15 @@ pub struct PlaceholderType { | |||
2266 | } | 2320 | } |
2267 | 2321 | ||
2268 | impl AstNode for PlaceholderType { | 2322 | impl AstNode for PlaceholderType { |
2269 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2323 | fn can_cast(kind: SyntaxKind) -> bool { |
2270 | match syntax.kind() { | 2324 | match kind { |
2271 | PLACEHOLDER_TYPE => Some(PlaceholderType { syntax }), | 2325 | PLACEHOLDER_TYPE => true, |
2272 | _ => None, | 2326 | _ => false, |
2273 | } | 2327 | } |
2274 | } | 2328 | } |
2329 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2330 | if Self::can_cast(syntax.kind()) { Some(PlaceholderType { syntax }) } else { None } | ||
2331 | } | ||
2275 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2332 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2276 | } | 2333 | } |
2277 | 2334 | ||
@@ -2285,12 +2342,15 @@ pub struct PointerType { | |||
2285 | } | 2342 | } |
2286 | 2343 | ||
2287 | impl AstNode for PointerType { | 2344 | impl AstNode for PointerType { |
2288 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2345 | fn can_cast(kind: SyntaxKind) -> bool { |
2289 | match syntax.kind() { | 2346 | match kind { |
2290 | POINTER_TYPE => Some(PointerType { syntax }), | 2347 | POINTER_TYPE => true, |
2291 | _ => None, | 2348 | _ => false, |
2292 | } | 2349 | } |
2293 | } | 2350 | } |
2351 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2352 | if Self::can_cast(syntax.kind()) { Some(PointerType { syntax }) } else { None } | ||
2353 | } | ||
2294 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2354 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2295 | } | 2355 | } |
2296 | 2356 | ||
@@ -2308,12 +2368,15 @@ pub struct PosFieldDef { | |||
2308 | } | 2368 | } |
2309 | 2369 | ||
2310 | impl AstNode for PosFieldDef { | 2370 | impl AstNode for PosFieldDef { |
2311 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2371 | fn can_cast(kind: SyntaxKind) -> bool { |
2312 | match syntax.kind() { | 2372 | match kind { |
2313 | POS_FIELD_DEF => Some(PosFieldDef { syntax }), | 2373 | POS_FIELD_DEF => true, |
2314 | _ => None, | 2374 | _ => false, |
2315 | } | 2375 | } |
2316 | } | 2376 | } |
2377 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2378 | if Self::can_cast(syntax.kind()) { Some(PosFieldDef { syntax }) } else { None } | ||
2379 | } | ||
2317 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2380 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2318 | } | 2381 | } |
2319 | 2382 | ||
@@ -2333,12 +2396,15 @@ pub struct PosFieldDefList { | |||
2333 | } | 2396 | } |
2334 | 2397 | ||
2335 | impl AstNode for PosFieldDefList { | 2398 | impl AstNode for PosFieldDefList { |
2336 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2399 | fn can_cast(kind: SyntaxKind) -> bool { |
2337 | match syntax.kind() { | 2400 | match kind { |
2338 | POS_FIELD_DEF_LIST => Some(PosFieldDefList { syntax }), | 2401 | POS_FIELD_DEF_LIST => true, |
2339 | _ => None, | 2402 | _ => false, |
2340 | } | 2403 | } |
2341 | } | 2404 | } |
2405 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2406 | if Self::can_cast(syntax.kind()) { Some(PosFieldDefList { syntax }) } else { None } | ||
2407 | } | ||
2342 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2408 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2343 | } | 2409 | } |
2344 | 2410 | ||
@@ -2356,12 +2422,15 @@ pub struct PrefixExpr { | |||
2356 | } | 2422 | } |
2357 | 2423 | ||
2358 | impl AstNode for PrefixExpr { | 2424 | impl AstNode for PrefixExpr { |
2359 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2425 | fn can_cast(kind: SyntaxKind) -> bool { |
2360 | match syntax.kind() { | 2426 | match kind { |
2361 | PREFIX_EXPR => Some(PrefixExpr { syntax }), | 2427 | PREFIX_EXPR => true, |
2362 | _ => None, | 2428 | _ => false, |
2363 | } | 2429 | } |
2364 | } | 2430 | } |
2431 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2432 | if Self::can_cast(syntax.kind()) { Some(PrefixExpr { syntax }) } else { None } | ||
2433 | } | ||
2365 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2434 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2366 | } | 2435 | } |
2367 | 2436 | ||
@@ -2379,12 +2448,15 @@ pub struct RangeExpr { | |||
2379 | } | 2448 | } |
2380 | 2449 | ||
2381 | impl AstNode for RangeExpr { | 2450 | impl AstNode for RangeExpr { |
2382 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2451 | fn can_cast(kind: SyntaxKind) -> bool { |
2383 | match syntax.kind() { | 2452 | match kind { |
2384 | RANGE_EXPR => Some(RangeExpr { syntax }), | 2453 | RANGE_EXPR => true, |
2385 | _ => None, | 2454 | _ => false, |
2386 | } | 2455 | } |
2387 | } | 2456 | } |
2457 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2458 | if Self::can_cast(syntax.kind()) { Some(RangeExpr { syntax }) } else { None } | ||
2459 | } | ||
2388 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2460 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2389 | } | 2461 | } |
2390 | 2462 | ||
@@ -2398,12 +2470,15 @@ pub struct RangePat { | |||
2398 | } | 2470 | } |
2399 | 2471 | ||
2400 | impl AstNode for RangePat { | 2472 | impl AstNode for RangePat { |
2401 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2473 | fn can_cast(kind: SyntaxKind) -> bool { |
2402 | match syntax.kind() { | 2474 | match kind { |
2403 | RANGE_PAT => Some(RangePat { syntax }), | 2475 | RANGE_PAT => true, |
2404 | _ => None, | 2476 | _ => false, |
2405 | } | 2477 | } |
2406 | } | 2478 | } |
2479 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2480 | if Self::can_cast(syntax.kind()) { Some(RangePat { syntax }) } else { None } | ||
2481 | } | ||
2407 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2482 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2408 | } | 2483 | } |
2409 | 2484 | ||
@@ -2417,12 +2492,15 @@ pub struct RefExpr { | |||
2417 | } | 2492 | } |
2418 | 2493 | ||
2419 | impl AstNode for RefExpr { | 2494 | impl AstNode for RefExpr { |
2420 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2495 | fn can_cast(kind: SyntaxKind) -> bool { |
2421 | match syntax.kind() { | 2496 | match kind { |
2422 | REF_EXPR => Some(RefExpr { syntax }), | 2497 | REF_EXPR => true, |
2423 | _ => None, | 2498 | _ => false, |
2424 | } | 2499 | } |
2425 | } | 2500 | } |
2501 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2502 | if Self::can_cast(syntax.kind()) { Some(RefExpr { syntax }) } else { None } | ||
2503 | } | ||
2426 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2504 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2427 | } | 2505 | } |
2428 | 2506 | ||
@@ -2440,12 +2518,15 @@ pub struct RefPat { | |||
2440 | } | 2518 | } |
2441 | 2519 | ||
2442 | impl AstNode for RefPat { | 2520 | impl AstNode for RefPat { |
2443 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2521 | fn can_cast(kind: SyntaxKind) -> bool { |
2444 | match syntax.kind() { | 2522 | match kind { |
2445 | REF_PAT => Some(RefPat { syntax }), | 2523 | REF_PAT => true, |
2446 | _ => None, | 2524 | _ => false, |
2447 | } | 2525 | } |
2448 | } | 2526 | } |
2527 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2528 | if Self::can_cast(syntax.kind()) { Some(RefPat { syntax }) } else { None } | ||
2529 | } | ||
2449 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2530 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2450 | } | 2531 | } |
2451 | 2532 | ||
@@ -2463,12 +2544,15 @@ pub struct ReferenceType { | |||
2463 | } | 2544 | } |
2464 | 2545 | ||
2465 | impl AstNode for ReferenceType { | 2546 | impl AstNode for ReferenceType { |
2466 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2547 | fn can_cast(kind: SyntaxKind) -> bool { |
2467 | match syntax.kind() { | 2548 | match kind { |
2468 | REFERENCE_TYPE => Some(ReferenceType { syntax }), | 2549 | REFERENCE_TYPE => true, |
2469 | _ => None, | 2550 | _ => false, |
2470 | } | 2551 | } |
2471 | } | 2552 | } |
2553 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2554 | if Self::can_cast(syntax.kind()) { Some(ReferenceType { syntax }) } else { None } | ||
2555 | } | ||
2472 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2556 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2473 | } | 2557 | } |
2474 | 2558 | ||
@@ -2486,12 +2570,15 @@ pub struct RetType { | |||
2486 | } | 2570 | } |
2487 | 2571 | ||
2488 | impl AstNode for RetType { | 2572 | impl AstNode for RetType { |
2489 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2573 | fn can_cast(kind: SyntaxKind) -> bool { |
2490 | match syntax.kind() { | 2574 | match kind { |
2491 | RET_TYPE => Some(RetType { syntax }), | 2575 | RET_TYPE => true, |
2492 | _ => None, | 2576 | _ => false, |
2493 | } | 2577 | } |
2494 | } | 2578 | } |
2579 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2580 | if Self::can_cast(syntax.kind()) { Some(RetType { syntax }) } else { None } | ||
2581 | } | ||
2495 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2582 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2496 | } | 2583 | } |
2497 | 2584 | ||
@@ -2509,12 +2596,15 @@ pub struct ReturnExpr { | |||
2509 | } | 2596 | } |
2510 | 2597 | ||
2511 | impl AstNode for ReturnExpr { | 2598 | impl AstNode for ReturnExpr { |
2512 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2599 | fn can_cast(kind: SyntaxKind) -> bool { |
2513 | match syntax.kind() { | 2600 | match kind { |
2514 | RETURN_EXPR => Some(ReturnExpr { syntax }), | 2601 | RETURN_EXPR => true, |
2515 | _ => None, | 2602 | _ => false, |
2516 | } | 2603 | } |
2517 | } | 2604 | } |
2605 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2606 | if Self::can_cast(syntax.kind()) { Some(ReturnExpr { syntax }) } else { None } | ||
2607 | } | ||
2518 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2608 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2519 | } | 2609 | } |
2520 | 2610 | ||
@@ -2532,12 +2622,15 @@ pub struct SelfParam { | |||
2532 | } | 2622 | } |
2533 | 2623 | ||
2534 | impl AstNode for SelfParam { | 2624 | impl AstNode for SelfParam { |
2535 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2625 | fn can_cast(kind: SyntaxKind) -> bool { |
2536 | match syntax.kind() { | 2626 | match kind { |
2537 | SELF_PARAM => Some(SelfParam { syntax }), | 2627 | SELF_PARAM => true, |
2538 | _ => None, | 2628 | _ => false, |
2539 | } | 2629 | } |
2540 | } | 2630 | } |
2631 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2632 | if Self::can_cast(syntax.kind()) { Some(SelfParam { syntax }) } else { None } | ||
2633 | } | ||
2541 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2634 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2542 | } | 2635 | } |
2543 | 2636 | ||
@@ -2552,12 +2645,15 @@ pub struct SlicePat { | |||
2552 | } | 2645 | } |
2553 | 2646 | ||
2554 | impl AstNode for SlicePat { | 2647 | impl AstNode for SlicePat { |
2555 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2648 | fn can_cast(kind: SyntaxKind) -> bool { |
2556 | match syntax.kind() { | 2649 | match kind { |
2557 | SLICE_PAT => Some(SlicePat { syntax }), | 2650 | SLICE_PAT => true, |
2558 | _ => None, | 2651 | _ => false, |
2559 | } | 2652 | } |
2560 | } | 2653 | } |
2654 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2655 | if Self::can_cast(syntax.kind()) { Some(SlicePat { syntax }) } else { None } | ||
2656 | } | ||
2561 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2657 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2562 | } | 2658 | } |
2563 | 2659 | ||
@@ -2571,12 +2667,15 @@ pub struct SliceType { | |||
2571 | } | 2667 | } |
2572 | 2668 | ||
2573 | impl AstNode for SliceType { | 2669 | impl AstNode for SliceType { |
2574 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2670 | fn can_cast(kind: SyntaxKind) -> bool { |
2575 | match syntax.kind() { | 2671 | match kind { |
2576 | SLICE_TYPE => Some(SliceType { syntax }), | 2672 | SLICE_TYPE => true, |
2577 | _ => None, | 2673 | _ => false, |
2578 | } | 2674 | } |
2579 | } | 2675 | } |
2676 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2677 | if Self::can_cast(syntax.kind()) { Some(SliceType { syntax }) } else { None } | ||
2678 | } | ||
2580 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2679 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2581 | } | 2680 | } |
2582 | 2681 | ||
@@ -2594,12 +2693,15 @@ pub struct SourceFile { | |||
2594 | } | 2693 | } |
2595 | 2694 | ||
2596 | impl AstNode for SourceFile { | 2695 | impl AstNode for SourceFile { |
2597 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2696 | fn can_cast(kind: SyntaxKind) -> bool { |
2598 | match syntax.kind() { | 2697 | match kind { |
2599 | SOURCE_FILE => Some(SourceFile { syntax }), | 2698 | SOURCE_FILE => true, |
2600 | _ => None, | 2699 | _ => false, |
2601 | } | 2700 | } |
2602 | } | 2701 | } |
2702 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2703 | if Self::can_cast(syntax.kind()) { Some(SourceFile { syntax }) } else { None } | ||
2704 | } | ||
2603 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2705 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2604 | } | 2706 | } |
2605 | 2707 | ||
@@ -2619,12 +2721,15 @@ pub struct StaticDef { | |||
2619 | } | 2721 | } |
2620 | 2722 | ||
2621 | impl AstNode for StaticDef { | 2723 | impl AstNode for StaticDef { |
2622 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2724 | fn can_cast(kind: SyntaxKind) -> bool { |
2623 | match syntax.kind() { | 2725 | match kind { |
2624 | STATIC_DEF => Some(StaticDef { syntax }), | 2726 | STATIC_DEF => true, |
2625 | _ => None, | 2727 | _ => false, |
2626 | } | 2728 | } |
2627 | } | 2729 | } |
2730 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2731 | if Self::can_cast(syntax.kind()) { Some(StaticDef { syntax }) } else { None } | ||
2732 | } | ||
2628 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2733 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2629 | } | 2734 | } |
2630 | 2735 | ||
@@ -2647,34 +2752,31 @@ pub struct Stmt { | |||
2647 | pub(crate) syntax: SyntaxNode, | 2752 | pub(crate) syntax: SyntaxNode, |
2648 | } | 2753 | } |
2649 | 2754 | ||
2755 | impl AstNode for Stmt { | ||
2756 | fn can_cast(kind: SyntaxKind) -> bool { | ||
2757 | match kind { | ||
2758 | | EXPR_STMT | LET_STMT => true, | ||
2759 | _ => false, | ||
2760 | } | ||
2761 | } | ||
2762 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2763 | if Self::can_cast(syntax.kind()) { Some(Stmt { syntax }) } else { None } | ||
2764 | } | ||
2765 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
2766 | } | ||
2767 | |||
2768 | |||
2650 | #[derive(Debug, Clone, PartialEq, Eq)] | 2769 | #[derive(Debug, Clone, PartialEq, Eq)] |
2651 | pub enum StmtKind { | 2770 | pub enum StmtKind { |
2652 | ExprStmt(ExprStmt), | 2771 | ExprStmt(ExprStmt), |
2653 | LetStmt(LetStmt), | 2772 | LetStmt(LetStmt), |
2654 | } | 2773 | } |
2655 | impl From<ExprStmt> for Stmt { | 2774 | impl From<ExprStmt> for Stmt { |
2656 | fn from(n: ExprStmt) -> Stmt { | 2775 | fn from(n: ExprStmt) -> Stmt { Stmt { syntax: n.syntax } } |
2657 | Stmt::cast(n.syntax).unwrap() | ||
2658 | } | ||
2659 | } | 2776 | } |
2660 | impl From<LetStmt> for Stmt { | 2777 | impl From<LetStmt> for Stmt { |
2661 | fn from(n: LetStmt) -> Stmt { | 2778 | fn from(n: LetStmt) -> Stmt { Stmt { syntax: n.syntax } } |
2662 | Stmt::cast(n.syntax).unwrap() | ||
2663 | } | ||
2664 | } | 2779 | } |
2665 | |||
2666 | |||
2667 | impl AstNode for Stmt { | ||
2668 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2669 | match syntax.kind() { | ||
2670 | | EXPR_STMT | ||
2671 | | LET_STMT => Some(Stmt { syntax }), | ||
2672 | _ => None, | ||
2673 | } | ||
2674 | } | ||
2675 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
2676 | } | ||
2677 | |||
2678 | impl Stmt { | 2780 | impl Stmt { |
2679 | pub fn kind(&self) -> StmtKind { | 2781 | pub fn kind(&self) -> StmtKind { |
2680 | match self.syntax.kind() { | 2782 | match self.syntax.kind() { |
@@ -2694,12 +2796,15 @@ pub struct StructDef { | |||
2694 | } | 2796 | } |
2695 | 2797 | ||
2696 | impl AstNode for StructDef { | 2798 | impl AstNode for StructDef { |
2697 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2799 | fn can_cast(kind: SyntaxKind) -> bool { |
2698 | match syntax.kind() { | 2800 | match kind { |
2699 | STRUCT_DEF => Some(StructDef { syntax }), | 2801 | STRUCT_DEF => true, |
2700 | _ => None, | 2802 | _ => false, |
2701 | } | 2803 | } |
2702 | } | 2804 | } |
2805 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2806 | if Self::can_cast(syntax.kind()) { Some(StructDef { syntax }) } else { None } | ||
2807 | } | ||
2703 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2808 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2704 | } | 2809 | } |
2705 | 2810 | ||
@@ -2718,12 +2823,15 @@ pub struct StructLit { | |||
2718 | } | 2823 | } |
2719 | 2824 | ||
2720 | impl AstNode for StructLit { | 2825 | impl AstNode for StructLit { |
2721 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2826 | fn can_cast(kind: SyntaxKind) -> bool { |
2722 | match syntax.kind() { | 2827 | match kind { |
2723 | STRUCT_LIT => Some(StructLit { syntax }), | 2828 | STRUCT_LIT => true, |
2724 | _ => None, | 2829 | _ => false, |
2725 | } | 2830 | } |
2726 | } | 2831 | } |
2832 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2833 | if Self::can_cast(syntax.kind()) { Some(StructLit { syntax }) } else { None } | ||
2834 | } | ||
2727 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2835 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2728 | } | 2836 | } |
2729 | 2837 | ||
@@ -2745,12 +2853,15 @@ pub struct StructPat { | |||
2745 | } | 2853 | } |
2746 | 2854 | ||
2747 | impl AstNode for StructPat { | 2855 | impl AstNode for StructPat { |
2748 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2856 | fn can_cast(kind: SyntaxKind) -> bool { |
2749 | match syntax.kind() { | 2857 | match kind { |
2750 | STRUCT_PAT => Some(StructPat { syntax }), | 2858 | STRUCT_PAT => true, |
2751 | _ => None, | 2859 | _ => false, |
2752 | } | 2860 | } |
2753 | } | 2861 | } |
2862 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2863 | if Self::can_cast(syntax.kind()) { Some(StructPat { syntax }) } else { None } | ||
2864 | } | ||
2754 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2865 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2755 | } | 2866 | } |
2756 | 2867 | ||
@@ -2772,12 +2883,15 @@ pub struct TokenTree { | |||
2772 | } | 2883 | } |
2773 | 2884 | ||
2774 | impl AstNode for TokenTree { | 2885 | impl AstNode for TokenTree { |
2775 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2886 | fn can_cast(kind: SyntaxKind) -> bool { |
2776 | match syntax.kind() { | 2887 | match kind { |
2777 | TOKEN_TREE => Some(TokenTree { syntax }), | 2888 | TOKEN_TREE => true, |
2778 | _ => None, | 2889 | _ => false, |
2779 | } | 2890 | } |
2780 | } | 2891 | } |
2892 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2893 | if Self::can_cast(syntax.kind()) { Some(TokenTree { syntax }) } else { None } | ||
2894 | } | ||
2781 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2895 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2782 | } | 2896 | } |
2783 | 2897 | ||
@@ -2791,12 +2905,15 @@ pub struct TraitDef { | |||
2791 | } | 2905 | } |
2792 | 2906 | ||
2793 | impl AstNode for TraitDef { | 2907 | impl AstNode for TraitDef { |
2794 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2908 | fn can_cast(kind: SyntaxKind) -> bool { |
2795 | match syntax.kind() { | 2909 | match kind { |
2796 | TRAIT_DEF => Some(TraitDef { syntax }), | 2910 | TRAIT_DEF => true, |
2797 | _ => None, | 2911 | _ => false, |
2798 | } | 2912 | } |
2799 | } | 2913 | } |
2914 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2915 | if Self::can_cast(syntax.kind()) { Some(TraitDef { syntax }) } else { None } | ||
2916 | } | ||
2800 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2917 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2801 | } | 2918 | } |
2802 | 2919 | ||
@@ -2820,12 +2937,15 @@ pub struct TryBlockExpr { | |||
2820 | } | 2937 | } |
2821 | 2938 | ||
2822 | impl AstNode for TryBlockExpr { | 2939 | impl AstNode for TryBlockExpr { |
2823 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2940 | fn can_cast(kind: SyntaxKind) -> bool { |
2824 | match syntax.kind() { | 2941 | match kind { |
2825 | TRY_BLOCK_EXPR => Some(TryBlockExpr { syntax }), | 2942 | TRY_BLOCK_EXPR => true, |
2826 | _ => None, | 2943 | _ => false, |
2827 | } | 2944 | } |
2828 | } | 2945 | } |
2946 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2947 | if Self::can_cast(syntax.kind()) { Some(TryBlockExpr { syntax }) } else { None } | ||
2948 | } | ||
2829 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2949 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2830 | } | 2950 | } |
2831 | 2951 | ||
@@ -2840,12 +2960,15 @@ pub struct TryExpr { | |||
2840 | } | 2960 | } |
2841 | 2961 | ||
2842 | impl AstNode for TryExpr { | 2962 | impl AstNode for TryExpr { |
2843 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2963 | fn can_cast(kind: SyntaxKind) -> bool { |
2844 | match syntax.kind() { | 2964 | match kind { |
2845 | TRY_EXPR => Some(TryExpr { syntax }), | 2965 | TRY_EXPR => true, |
2846 | _ => None, | 2966 | _ => false, |
2847 | } | 2967 | } |
2848 | } | 2968 | } |
2969 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2970 | if Self::can_cast(syntax.kind()) { Some(TryExpr { syntax }) } else { None } | ||
2971 | } | ||
2849 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2972 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2850 | } | 2973 | } |
2851 | 2974 | ||
@@ -2863,12 +2986,15 @@ pub struct TupleExpr { | |||
2863 | } | 2986 | } |
2864 | 2987 | ||
2865 | impl AstNode for TupleExpr { | 2988 | impl AstNode for TupleExpr { |
2866 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 2989 | fn can_cast(kind: SyntaxKind) -> bool { |
2867 | match syntax.kind() { | 2990 | match kind { |
2868 | TUPLE_EXPR => Some(TupleExpr { syntax }), | 2991 | TUPLE_EXPR => true, |
2869 | _ => None, | 2992 | _ => false, |
2870 | } | 2993 | } |
2871 | } | 2994 | } |
2995 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
2996 | if Self::can_cast(syntax.kind()) { Some(TupleExpr { syntax }) } else { None } | ||
2997 | } | ||
2872 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 2998 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2873 | } | 2999 | } |
2874 | 3000 | ||
@@ -2886,12 +3012,15 @@ pub struct TuplePat { | |||
2886 | } | 3012 | } |
2887 | 3013 | ||
2888 | impl AstNode for TuplePat { | 3014 | impl AstNode for TuplePat { |
2889 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3015 | fn can_cast(kind: SyntaxKind) -> bool { |
2890 | match syntax.kind() { | 3016 | match kind { |
2891 | TUPLE_PAT => Some(TuplePat { syntax }), | 3017 | TUPLE_PAT => true, |
2892 | _ => None, | 3018 | _ => false, |
2893 | } | 3019 | } |
2894 | } | 3020 | } |
3021 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3022 | if Self::can_cast(syntax.kind()) { Some(TuplePat { syntax }) } else { None } | ||
3023 | } | ||
2895 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3024 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2896 | } | 3025 | } |
2897 | 3026 | ||
@@ -2909,12 +3038,15 @@ pub struct TupleStructPat { | |||
2909 | } | 3038 | } |
2910 | 3039 | ||
2911 | impl AstNode for TupleStructPat { | 3040 | impl AstNode for TupleStructPat { |
2912 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3041 | fn can_cast(kind: SyntaxKind) -> bool { |
2913 | match syntax.kind() { | 3042 | match kind { |
2914 | TUPLE_STRUCT_PAT => Some(TupleStructPat { syntax }), | 3043 | TUPLE_STRUCT_PAT => true, |
2915 | _ => None, | 3044 | _ => false, |
2916 | } | 3045 | } |
2917 | } | 3046 | } |
3047 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3048 | if Self::can_cast(syntax.kind()) { Some(TupleStructPat { syntax }) } else { None } | ||
3049 | } | ||
2918 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3050 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2919 | } | 3051 | } |
2920 | 3052 | ||
@@ -2936,12 +3068,15 @@ pub struct TupleType { | |||
2936 | } | 3068 | } |
2937 | 3069 | ||
2938 | impl AstNode for TupleType { | 3070 | impl AstNode for TupleType { |
2939 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3071 | fn can_cast(kind: SyntaxKind) -> bool { |
2940 | match syntax.kind() { | 3072 | match kind { |
2941 | TUPLE_TYPE => Some(TupleType { syntax }), | 3073 | TUPLE_TYPE => true, |
2942 | _ => None, | 3074 | _ => false, |
2943 | } | 3075 | } |
2944 | } | 3076 | } |
3077 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3078 | if Self::can_cast(syntax.kind()) { Some(TupleType { syntax }) } else { None } | ||
3079 | } | ||
2945 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3080 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2946 | } | 3081 | } |
2947 | 3082 | ||
@@ -2959,12 +3094,15 @@ pub struct TypeAliasDef { | |||
2959 | } | 3094 | } |
2960 | 3095 | ||
2961 | impl AstNode for TypeAliasDef { | 3096 | impl AstNode for TypeAliasDef { |
2962 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3097 | fn can_cast(kind: SyntaxKind) -> bool { |
2963 | match syntax.kind() { | 3098 | match kind { |
2964 | TYPE_ALIAS_DEF => Some(TypeAliasDef { syntax }), | 3099 | TYPE_ALIAS_DEF => true, |
2965 | _ => None, | 3100 | _ => false, |
2966 | } | 3101 | } |
2967 | } | 3102 | } |
3103 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3104 | if Self::can_cast(syntax.kind()) { Some(TypeAliasDef { syntax }) } else { None } | ||
3105 | } | ||
2968 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3106 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2969 | } | 3107 | } |
2970 | 3108 | ||
@@ -2988,12 +3126,15 @@ pub struct TypeArg { | |||
2988 | } | 3126 | } |
2989 | 3127 | ||
2990 | impl AstNode for TypeArg { | 3128 | impl AstNode for TypeArg { |
2991 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3129 | fn can_cast(kind: SyntaxKind) -> bool { |
2992 | match syntax.kind() { | 3130 | match kind { |
2993 | TYPE_ARG => Some(TypeArg { syntax }), | 3131 | TYPE_ARG => true, |
2994 | _ => None, | 3132 | _ => false, |
2995 | } | 3133 | } |
2996 | } | 3134 | } |
3135 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3136 | if Self::can_cast(syntax.kind()) { Some(TypeArg { syntax }) } else { None } | ||
3137 | } | ||
2997 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3138 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
2998 | } | 3139 | } |
2999 | 3140 | ||
@@ -3011,12 +3152,15 @@ pub struct TypeArgList { | |||
3011 | } | 3152 | } |
3012 | 3153 | ||
3013 | impl AstNode for TypeArgList { | 3154 | impl AstNode for TypeArgList { |
3014 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3155 | fn can_cast(kind: SyntaxKind) -> bool { |
3015 | match syntax.kind() { | 3156 | match kind { |
3016 | TYPE_ARG_LIST => Some(TypeArgList { syntax }), | 3157 | TYPE_ARG_LIST => true, |
3017 | _ => None, | 3158 | _ => false, |
3018 | } | 3159 | } |
3019 | } | 3160 | } |
3161 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3162 | if Self::can_cast(syntax.kind()) { Some(TypeArgList { syntax }) } else { None } | ||
3163 | } | ||
3020 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3164 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3021 | } | 3165 | } |
3022 | 3166 | ||
@@ -3042,12 +3186,15 @@ pub struct TypeBound { | |||
3042 | } | 3186 | } |
3043 | 3187 | ||
3044 | impl AstNode for TypeBound { | 3188 | impl AstNode for TypeBound { |
3045 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3189 | fn can_cast(kind: SyntaxKind) -> bool { |
3046 | match syntax.kind() { | 3190 | match kind { |
3047 | TYPE_BOUND => Some(TypeBound { syntax }), | 3191 | TYPE_BOUND => true, |
3048 | _ => None, | 3192 | _ => false, |
3049 | } | 3193 | } |
3050 | } | 3194 | } |
3195 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3196 | if Self::can_cast(syntax.kind()) { Some(TypeBound { syntax }) } else { None } | ||
3197 | } | ||
3051 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3198 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3052 | } | 3199 | } |
3053 | 3200 | ||
@@ -3065,12 +3212,15 @@ pub struct TypeBoundList { | |||
3065 | } | 3212 | } |
3066 | 3213 | ||
3067 | impl AstNode for TypeBoundList { | 3214 | impl AstNode for TypeBoundList { |
3068 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3215 | fn can_cast(kind: SyntaxKind) -> bool { |
3069 | match syntax.kind() { | 3216 | match kind { |
3070 | TYPE_BOUND_LIST => Some(TypeBoundList { syntax }), | 3217 | TYPE_BOUND_LIST => true, |
3071 | _ => None, | 3218 | _ => false, |
3072 | } | 3219 | } |
3073 | } | 3220 | } |
3221 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3222 | if Self::can_cast(syntax.kind()) { Some(TypeBoundList { syntax }) } else { None } | ||
3223 | } | ||
3074 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3224 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3075 | } | 3225 | } |
3076 | 3226 | ||
@@ -3088,12 +3238,15 @@ pub struct TypeParam { | |||
3088 | } | 3238 | } |
3089 | 3239 | ||
3090 | impl AstNode for TypeParam { | 3240 | impl AstNode for TypeParam { |
3091 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3241 | fn can_cast(kind: SyntaxKind) -> bool { |
3092 | match syntax.kind() { | 3242 | match kind { |
3093 | TYPE_PARAM => Some(TypeParam { syntax }), | 3243 | TYPE_PARAM => true, |
3094 | _ => None, | 3244 | _ => false, |
3095 | } | 3245 | } |
3096 | } | 3246 | } |
3247 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3248 | if Self::can_cast(syntax.kind()) { Some(TypeParam { syntax }) } else { None } | ||
3249 | } | ||
3097 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3250 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3098 | } | 3251 | } |
3099 | 3252 | ||
@@ -3111,12 +3264,15 @@ pub struct TypeParamList { | |||
3111 | } | 3264 | } |
3112 | 3265 | ||
3113 | impl AstNode for TypeParamList { | 3266 | impl AstNode for TypeParamList { |
3114 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3267 | fn can_cast(kind: SyntaxKind) -> bool { |
3115 | match syntax.kind() { | 3268 | match kind { |
3116 | TYPE_PARAM_LIST => Some(TypeParamList { syntax }), | 3269 | TYPE_PARAM_LIST => true, |
3117 | _ => None, | 3270 | _ => false, |
3118 | } | 3271 | } |
3119 | } | 3272 | } |
3273 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3274 | if Self::can_cast(syntax.kind()) { Some(TypeParamList { syntax }) } else { None } | ||
3275 | } | ||
3120 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3276 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3121 | } | 3277 | } |
3122 | 3278 | ||
@@ -3137,6 +3293,20 @@ pub struct TypeRef { | |||
3137 | pub(crate) syntax: SyntaxNode, | 3293 | pub(crate) syntax: SyntaxNode, |
3138 | } | 3294 | } |
3139 | 3295 | ||
3296 | impl AstNode for TypeRef { | ||
3297 | fn can_cast(kind: SyntaxKind) -> bool { | ||
3298 | match kind { | ||
3299 | | PAREN_TYPE | TUPLE_TYPE | NEVER_TYPE | PATH_TYPE | POINTER_TYPE | ARRAY_TYPE | SLICE_TYPE | REFERENCE_TYPE | PLACEHOLDER_TYPE | FN_POINTER_TYPE | FOR_TYPE | IMPL_TRAIT_TYPE | DYN_TRAIT_TYPE => true, | ||
3300 | _ => false, | ||
3301 | } | ||
3302 | } | ||
3303 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3304 | if Self::can_cast(syntax.kind()) { Some(TypeRef { syntax }) } else { None } | ||
3305 | } | ||
3306 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
3307 | } | ||
3308 | |||
3309 | |||
3140 | #[derive(Debug, Clone, PartialEq, Eq)] | 3310 | #[derive(Debug, Clone, PartialEq, Eq)] |
3141 | pub enum TypeRefKind { | 3311 | pub enum TypeRefKind { |
3142 | ParenType(ParenType), | 3312 | ParenType(ParenType), |
@@ -3154,94 +3324,44 @@ pub enum TypeRefKind { | |||
3154 | DynTraitType(DynTraitType), | 3324 | DynTraitType(DynTraitType), |
3155 | } | 3325 | } |
3156 | impl From<ParenType> for TypeRef { | 3326 | impl From<ParenType> for TypeRef { |
3157 | fn from(n: ParenType) -> TypeRef { | 3327 | fn from(n: ParenType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3158 | TypeRef::cast(n.syntax).unwrap() | ||
3159 | } | ||
3160 | } | 3328 | } |
3161 | impl From<TupleType> for TypeRef { | 3329 | impl From<TupleType> for TypeRef { |
3162 | fn from(n: TupleType) -> TypeRef { | 3330 | fn from(n: TupleType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3163 | TypeRef::cast(n.syntax).unwrap() | ||
3164 | } | ||
3165 | } | 3331 | } |
3166 | impl From<NeverType> for TypeRef { | 3332 | impl From<NeverType> for TypeRef { |
3167 | fn from(n: NeverType) -> TypeRef { | 3333 | fn from(n: NeverType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3168 | TypeRef::cast(n.syntax).unwrap() | ||
3169 | } | ||
3170 | } | 3334 | } |
3171 | impl From<PathType> for TypeRef { | 3335 | impl From<PathType> for TypeRef { |
3172 | fn from(n: PathType) -> TypeRef { | 3336 | fn from(n: PathType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3173 | TypeRef::cast(n.syntax).unwrap() | ||
3174 | } | ||
3175 | } | 3337 | } |
3176 | impl From<PointerType> for TypeRef { | 3338 | impl From<PointerType> for TypeRef { |
3177 | fn from(n: PointerType) -> TypeRef { | 3339 | fn from(n: PointerType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3178 | TypeRef::cast(n.syntax).unwrap() | ||
3179 | } | ||
3180 | } | 3340 | } |
3181 | impl From<ArrayType> for TypeRef { | 3341 | impl From<ArrayType> for TypeRef { |
3182 | fn from(n: ArrayType) -> TypeRef { | 3342 | fn from(n: ArrayType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3183 | TypeRef::cast(n.syntax).unwrap() | ||
3184 | } | ||
3185 | } | 3343 | } |
3186 | impl From<SliceType> for TypeRef { | 3344 | impl From<SliceType> for TypeRef { |
3187 | fn from(n: SliceType) -> TypeRef { | 3345 | fn from(n: SliceType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3188 | TypeRef::cast(n.syntax).unwrap() | ||
3189 | } | ||
3190 | } | 3346 | } |
3191 | impl From<ReferenceType> for TypeRef { | 3347 | impl From<ReferenceType> for TypeRef { |
3192 | fn from(n: ReferenceType) -> TypeRef { | 3348 | fn from(n: ReferenceType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3193 | TypeRef::cast(n.syntax).unwrap() | ||
3194 | } | ||
3195 | } | 3349 | } |
3196 | impl From<PlaceholderType> for TypeRef { | 3350 | impl From<PlaceholderType> for TypeRef { |
3197 | fn from(n: PlaceholderType) -> TypeRef { | 3351 | fn from(n: PlaceholderType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3198 | TypeRef::cast(n.syntax).unwrap() | ||
3199 | } | ||
3200 | } | 3352 | } |
3201 | impl From<FnPointerType> for TypeRef { | 3353 | impl From<FnPointerType> for TypeRef { |
3202 | fn from(n: FnPointerType) -> TypeRef { | 3354 | fn from(n: FnPointerType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3203 | TypeRef::cast(n.syntax).unwrap() | ||
3204 | } | ||
3205 | } | 3355 | } |
3206 | impl From<ForType> for TypeRef { | 3356 | impl From<ForType> for TypeRef { |
3207 | fn from(n: ForType) -> TypeRef { | 3357 | fn from(n: ForType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3208 | TypeRef::cast(n.syntax).unwrap() | ||
3209 | } | ||
3210 | } | 3358 | } |
3211 | impl From<ImplTraitType> for TypeRef { | 3359 | impl From<ImplTraitType> for TypeRef { |
3212 | fn from(n: ImplTraitType) -> TypeRef { | 3360 | fn from(n: ImplTraitType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3213 | TypeRef::cast(n.syntax).unwrap() | ||
3214 | } | ||
3215 | } | 3361 | } |
3216 | impl From<DynTraitType> for TypeRef { | 3362 | impl From<DynTraitType> for TypeRef { |
3217 | fn from(n: DynTraitType) -> TypeRef { | 3363 | fn from(n: DynTraitType) -> TypeRef { TypeRef { syntax: n.syntax } } |
3218 | TypeRef::cast(n.syntax).unwrap() | ||
3219 | } | ||
3220 | } | ||
3221 | |||
3222 | |||
3223 | impl AstNode for TypeRef { | ||
3224 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3225 | match syntax.kind() { | ||
3226 | | PAREN_TYPE | ||
3227 | | TUPLE_TYPE | ||
3228 | | NEVER_TYPE | ||
3229 | | PATH_TYPE | ||
3230 | | POINTER_TYPE | ||
3231 | | ARRAY_TYPE | ||
3232 | | SLICE_TYPE | ||
3233 | | REFERENCE_TYPE | ||
3234 | | PLACEHOLDER_TYPE | ||
3235 | | FN_POINTER_TYPE | ||
3236 | | FOR_TYPE | ||
3237 | | IMPL_TRAIT_TYPE | ||
3238 | | DYN_TRAIT_TYPE => Some(TypeRef { syntax }), | ||
3239 | _ => None, | ||
3240 | } | ||
3241 | } | ||
3242 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
3243 | } | 3364 | } |
3244 | |||
3245 | impl TypeRef { | 3365 | impl TypeRef { |
3246 | pub fn kind(&self) -> TypeRefKind { | 3366 | pub fn kind(&self) -> TypeRefKind { |
3247 | match self.syntax.kind() { | 3367 | match self.syntax.kind() { |
@@ -3272,12 +3392,15 @@ pub struct UseItem { | |||
3272 | } | 3392 | } |
3273 | 3393 | ||
3274 | impl AstNode for UseItem { | 3394 | impl AstNode for UseItem { |
3275 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3395 | fn can_cast(kind: SyntaxKind) -> bool { |
3276 | match syntax.kind() { | 3396 | match kind { |
3277 | USE_ITEM => Some(UseItem { syntax }), | 3397 | USE_ITEM => true, |
3278 | _ => None, | 3398 | _ => false, |
3279 | } | 3399 | } |
3280 | } | 3400 | } |
3401 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3402 | if Self::can_cast(syntax.kind()) { Some(UseItem { syntax }) } else { None } | ||
3403 | } | ||
3281 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3404 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3282 | } | 3405 | } |
3283 | 3406 | ||
@@ -3296,12 +3419,15 @@ pub struct UseTree { | |||
3296 | } | 3419 | } |
3297 | 3420 | ||
3298 | impl AstNode for UseTree { | 3421 | impl AstNode for UseTree { |
3299 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3422 | fn can_cast(kind: SyntaxKind) -> bool { |
3300 | match syntax.kind() { | 3423 | match kind { |
3301 | USE_TREE => Some(UseTree { syntax }), | 3424 | USE_TREE => true, |
3302 | _ => None, | 3425 | _ => false, |
3303 | } | 3426 | } |
3304 | } | 3427 | } |
3428 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3429 | if Self::can_cast(syntax.kind()) { Some(UseTree { syntax }) } else { None } | ||
3430 | } | ||
3305 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3431 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3306 | } | 3432 | } |
3307 | 3433 | ||
@@ -3327,12 +3453,15 @@ pub struct UseTreeList { | |||
3327 | } | 3453 | } |
3328 | 3454 | ||
3329 | impl AstNode for UseTreeList { | 3455 | impl AstNode for UseTreeList { |
3330 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3456 | fn can_cast(kind: SyntaxKind) -> bool { |
3331 | match syntax.kind() { | 3457 | match kind { |
3332 | USE_TREE_LIST => Some(UseTreeList { syntax }), | 3458 | USE_TREE_LIST => true, |
3333 | _ => None, | 3459 | _ => false, |
3334 | } | 3460 | } |
3335 | } | 3461 | } |
3462 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3463 | if Self::can_cast(syntax.kind()) { Some(UseTreeList { syntax }) } else { None } | ||
3464 | } | ||
3336 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3465 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3337 | } | 3466 | } |
3338 | 3467 | ||
@@ -3350,12 +3479,15 @@ pub struct Visibility { | |||
3350 | } | 3479 | } |
3351 | 3480 | ||
3352 | impl AstNode for Visibility { | 3481 | impl AstNode for Visibility { |
3353 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3482 | fn can_cast(kind: SyntaxKind) -> bool { |
3354 | match syntax.kind() { | 3483 | match kind { |
3355 | VISIBILITY => Some(Visibility { syntax }), | 3484 | VISIBILITY => true, |
3356 | _ => None, | 3485 | _ => false, |
3357 | } | 3486 | } |
3358 | } | 3487 | } |
3488 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3489 | if Self::can_cast(syntax.kind()) { Some(Visibility { syntax }) } else { None } | ||
3490 | } | ||
3359 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3491 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3360 | } | 3492 | } |
3361 | 3493 | ||
@@ -3369,12 +3501,15 @@ pub struct WhereClause { | |||
3369 | } | 3501 | } |
3370 | 3502 | ||
3371 | impl AstNode for WhereClause { | 3503 | impl AstNode for WhereClause { |
3372 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3504 | fn can_cast(kind: SyntaxKind) -> bool { |
3373 | match syntax.kind() { | 3505 | match kind { |
3374 | WHERE_CLAUSE => Some(WhereClause { syntax }), | 3506 | WHERE_CLAUSE => true, |
3375 | _ => None, | 3507 | _ => false, |
3376 | } | 3508 | } |
3377 | } | 3509 | } |
3510 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3511 | if Self::can_cast(syntax.kind()) { Some(WhereClause { syntax }) } else { None } | ||
3512 | } | ||
3378 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3513 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3379 | } | 3514 | } |
3380 | 3515 | ||
@@ -3392,12 +3527,15 @@ pub struct WherePred { | |||
3392 | } | 3527 | } |
3393 | 3528 | ||
3394 | impl AstNode for WherePred { | 3529 | impl AstNode for WherePred { |
3395 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3530 | fn can_cast(kind: SyntaxKind) -> bool { |
3396 | match syntax.kind() { | 3531 | match kind { |
3397 | WHERE_PRED => Some(WherePred { syntax }), | 3532 | WHERE_PRED => true, |
3398 | _ => None, | 3533 | _ => false, |
3399 | } | 3534 | } |
3400 | } | 3535 | } |
3536 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3537 | if Self::can_cast(syntax.kind()) { Some(WherePred { syntax }) } else { None } | ||
3538 | } | ||
3401 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3539 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3402 | } | 3540 | } |
3403 | 3541 | ||
@@ -3416,12 +3554,15 @@ pub struct WhileExpr { | |||
3416 | } | 3554 | } |
3417 | 3555 | ||
3418 | impl AstNode for WhileExpr { | 3556 | impl AstNode for WhileExpr { |
3419 | fn cast(syntax: SyntaxNode) -> Option<Self> { | 3557 | fn can_cast(kind: SyntaxKind) -> bool { |
3420 | match syntax.kind() { | 3558 | match kind { |
3421 | WHILE_EXPR => Some(WhileExpr { syntax }), | 3559 | WHILE_EXPR => true, |
3422 | _ => None, | 3560 | _ => false, |
3423 | } | 3561 | } |
3424 | } | 3562 | } |
3563 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
3564 | if Self::can_cast(syntax.kind()) { Some(WhileExpr { syntax }) } else { None } | ||
3565 | } | ||
3425 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | 3566 | fn syntax(&self) -> &SyntaxNode { &self.syntax } |
3426 | } | 3567 | } |
3427 | 3568 | ||
diff --git a/crates/ra_syntax/src/ast/generated.rs.tera b/crates/ra_syntax/src/ast/generated.rs.tera index f3365c560..03b4bf3a1 100644 --- a/crates/ra_syntax/src/ast/generated.rs.tera +++ b/crates/ra_syntax/src/ast/generated.rs.tera | |||
@@ -12,18 +12,34 @@ the below applies to the result of this template | |||
12 | #![cfg_attr(rustfmt, rustfmt_skip)] | 12 | #![cfg_attr(rustfmt, rustfmt_skip)] |
13 | 13 | ||
14 | use crate::{ | 14 | use crate::{ |
15 | SyntaxNode, SyntaxKind::*, | 15 | SyntaxNode, SyntaxKind::{self, *}, |
16 | ast::{self, AstNode}, | 16 | ast::{self, AstNode}, |
17 | }; | 17 | }; |
18 | {% for node, methods in ast %} | 18 | {% for node, methods in ast %} |
19 | // {{ node }} | 19 | // {{ node }} |
20 | |||
21 | {%- if methods.enum %} | ||
22 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 20 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
23 | pub struct {{ node }} { | 21 | pub struct {{ node }} { |
24 | pub(crate) syntax: SyntaxNode, | 22 | pub(crate) syntax: SyntaxNode, |
25 | } | 23 | } |
26 | 24 | ||
25 | impl AstNode for {{ node }} { | ||
26 | fn can_cast(kind: SyntaxKind) -> bool { | ||
27 | match kind { | ||
28 | {%- if methods.enum %} | ||
29 | {% for kind in methods.enum %} | {{ kind | SCREAM }} {%- endfor -%} | ||
30 | {% else %} | ||
31 | {{ node | SCREAM }} | ||
32 | {%- endif %} => true, | ||
33 | _ => false, | ||
34 | } | ||
35 | } | ||
36 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
37 | if Self::can_cast(syntax.kind()) { Some({{ node }} { syntax }) } else { None } | ||
38 | } | ||
39 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
40 | } | ||
41 | |||
42 | {% if methods.enum %} | ||
27 | #[derive(Debug, Clone, PartialEq, Eq)] | 43 | #[derive(Debug, Clone, PartialEq, Eq)] |
28 | pub enum {{ node }}Kind { | 44 | pub enum {{ node }}Kind { |
29 | {%- for kind in methods.enum %} | 45 | {%- for kind in methods.enum %} |
@@ -33,25 +49,9 @@ pub enum {{ node }}Kind { | |||
33 | 49 | ||
34 | {%- for kind in methods.enum %} | 50 | {%- for kind in methods.enum %} |
35 | impl From<{{ kind }}> for {{ node }} { | 51 | impl From<{{ kind }}> for {{ node }} { |
36 | fn from(n: {{ kind }}) -> {{ node }} { | 52 | fn from(n: {{ kind }}) -> {{ node }} { {{ node }} { syntax: n.syntax } } |
37 | {{ node }}::cast(n.syntax).unwrap() | ||
38 | } | ||
39 | } | 53 | } |
40 | {%- endfor %} | 54 | {%- endfor %} |
41 | |||
42 | |||
43 | impl AstNode for {{ node }} { | ||
44 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
45 | match syntax.kind() { | ||
46 | {%- for kind in methods.enum %} | ||
47 | | {{ kind | SCREAM }} | ||
48 | {%- endfor %} => Some({{ node }} { syntax }), | ||
49 | _ => None, | ||
50 | } | ||
51 | } | ||
52 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
53 | } | ||
54 | |||
55 | impl {{ node }} { | 55 | impl {{ node }} { |
56 | pub fn kind(&self) -> {{ node }}Kind { | 56 | pub fn kind(&self) -> {{ node }}Kind { |
57 | match self.syntax.kind() { | 57 | match self.syntax.kind() { |
@@ -62,22 +62,6 @@ impl {{ node }} { | |||
62 | } | 62 | } |
63 | } | 63 | } |
64 | } | 64 | } |
65 | {% else %} | ||
66 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
67 | pub struct {{ node }} { | ||
68 | pub(crate) syntax: SyntaxNode, | ||
69 | } | ||
70 | |||
71 | impl AstNode for {{ node }} { | ||
72 | fn cast(syntax: SyntaxNode) -> Option<Self> { | ||
73 | match syntax.kind() { | ||
74 | {{ node | SCREAM }} => Some({{ node }} { syntax }), | ||
75 | _ => None, | ||
76 | } | ||
77 | } | ||
78 | fn syntax(&self) -> &SyntaxNode { &self.syntax } | ||
79 | } | ||
80 | |||
81 | {% endif %} | 65 | {% endif %} |
82 | {% if methods.traits -%} | 66 | {% if methods.traits -%} |
83 | 67 | ||
diff --git a/crates/ra_syntax/src/ptr.rs b/crates/ra_syntax/src/ptr.rs index 25824722f..d1b30a2c9 100644 --- a/crates/ra_syntax/src/ptr.rs +++ b/crates/ra_syntax/src/ptr.rs | |||
@@ -61,12 +61,8 @@ impl<N: AstNode> AstPtr<N> { | |||
61 | self.raw | 61 | self.raw |
62 | } | 62 | } |
63 | 63 | ||
64 | // FIXME: extend AstNode to do this safely | 64 | pub fn cast<U: AstNode>(self) -> Option<AstPtr<U>> { |
65 | pub fn cast_checking_kind<U: AstNode>( | 65 | if !U::can_cast(self.raw.kind()) { |
66 | self, | ||
67 | cond: impl FnOnce(SyntaxKind) -> bool, | ||
68 | ) -> Option<AstPtr<U>> { | ||
69 | if !cond(self.raw.kind()) { | ||
70 | return None; | 66 | return None; |
71 | } | 67 | } |
72 | Some(AstPtr { raw: self.raw, _ty: PhantomData }) | 68 | Some(AstPtr { raw: self.raw, _ty: PhantomData }) |