Skip to main content

wat_syntax/ast/
ty.rs

1use super::{
2    AstChildren, AstNode,
3    module::{Index, TypeUse},
4    support::*,
5};
6use crate::{SyntaxKind, SyntaxNode, SyntaxToken};
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash)]
9pub struct AddrType {
10    syntax: SyntaxNode,
11}
12impl AddrType {
13    #[inline]
14    pub fn type_keyword(&self) -> Option<SyntaxToken> {
15        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
16    }
17}
18impl AstNode for AddrType {
19    #[inline]
20    fn can_cast(kind: SyntaxKind) -> bool
21    where
22        Self: Sized,
23    {
24        kind == SyntaxKind::ADDR_TYPE
25    }
26    #[inline]
27    fn cast(syntax: SyntaxNode) -> Option<Self>
28    where
29        Self: Sized,
30    {
31        if Self::can_cast(syntax.kind()) {
32            Some(AddrType { syntax })
33        } else {
34            None
35        }
36    }
37    #[inline]
38    fn syntax(&self) -> &SyntaxNode {
39        &self.syntax
40    }
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Hash)]
44pub struct ArrayType {
45    syntax: SyntaxNode,
46}
47impl ArrayType {
48    #[inline]
49    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
50        token(&self.syntax, SyntaxKind::L_PAREN)
51    }
52    #[inline]
53    pub fn keyword(&self) -> Option<SyntaxToken> {
54        token(&self.syntax, SyntaxKind::KEYWORD)
55    }
56    #[inline]
57    pub fn field_type(&self) -> Option<FieldType> {
58        child(&self.syntax)
59    }
60    #[inline]
61    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
62        token(&self.syntax, SyntaxKind::R_PAREN)
63    }
64}
65impl AstNode for ArrayType {
66    #[inline]
67    fn can_cast(kind: SyntaxKind) -> bool
68    where
69        Self: Sized,
70    {
71        kind == SyntaxKind::ARRAY_TYPE
72    }
73    #[inline]
74    fn cast(syntax: SyntaxNode) -> Option<Self>
75    where
76        Self: Sized,
77    {
78        if Self::can_cast(syntax.kind()) {
79            Some(ArrayType { syntax })
80        } else {
81            None
82        }
83    }
84    #[inline]
85    fn syntax(&self) -> &SyntaxNode {
86        &self.syntax
87    }
88}
89
90#[derive(Debug, Clone, PartialEq, Eq, Hash)]
91pub enum CompType {
92    Array(ArrayType),
93    Struct(StructType),
94    Func(FuncType),
95    Cont(ContType),
96}
97impl AstNode for CompType {
98    #[inline]
99    fn can_cast(kind: SyntaxKind) -> bool
100    where
101        Self: Sized,
102    {
103        matches!(
104            kind,
105            SyntaxKind::ARRAY_TYPE | SyntaxKind::STRUCT_TYPE | SyntaxKind::FUNC_TYPE | SyntaxKind::CONT_TYPE
106        )
107    }
108    #[inline]
109    fn cast(syntax: SyntaxNode) -> Option<Self>
110    where
111        Self: Sized,
112    {
113        match syntax.kind() {
114            SyntaxKind::ARRAY_TYPE => Some(CompType::Array(ArrayType { syntax })),
115            SyntaxKind::STRUCT_TYPE => Some(CompType::Struct(StructType { syntax })),
116            SyntaxKind::FUNC_TYPE => Some(CompType::Func(FuncType { syntax })),
117            SyntaxKind::CONT_TYPE => Some(CompType::Cont(ContType { syntax })),
118            _ => None,
119        }
120    }
121    #[inline]
122    fn syntax(&self) -> &SyntaxNode {
123        match self {
124            CompType::Array(it) => it.syntax(),
125            CompType::Struct(it) => it.syntax(),
126            CompType::Func(it) => it.syntax(),
127            CompType::Cont(it) => it.syntax(),
128        }
129    }
130}
131
132#[derive(Debug, Clone, PartialEq, Eq, Hash)]
133pub struct ContType {
134    syntax: SyntaxNode,
135}
136impl ContType {
137    #[inline]
138    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
139        token(&self.syntax, SyntaxKind::L_PAREN)
140    }
141    #[inline]
142    pub fn keyword(&self) -> Option<SyntaxToken> {
143        token(&self.syntax, SyntaxKind::KEYWORD)
144    }
145    #[inline]
146    pub fn index(&self) -> Option<Index> {
147        child(&self.syntax)
148    }
149    #[inline]
150    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
151        token(&self.syntax, SyntaxKind::R_PAREN)
152    }
153}
154impl AstNode for ContType {
155    #[inline]
156    fn can_cast(kind: SyntaxKind) -> bool
157    where
158        Self: Sized,
159    {
160        kind == SyntaxKind::CONT_TYPE
161    }
162    #[inline]
163    fn cast(syntax: SyntaxNode) -> Option<Self>
164    where
165        Self: Sized,
166    {
167        if Self::can_cast(syntax.kind()) {
168            Some(ContType { syntax })
169        } else {
170            None
171        }
172    }
173    #[inline]
174    fn syntax(&self) -> &SyntaxNode {
175        &self.syntax
176    }
177}
178
179#[derive(Debug, Clone, PartialEq, Eq, Hash)]
180pub enum ExternType {
181    Func(ExternTypeFunc),
182    Global(ExternTypeGlobal),
183    Memory(ExternTypeMemory),
184    Table(ExternTypeTable),
185    Tag(ExternTypeTag),
186}
187impl AstNode for ExternType {
188    #[inline]
189    fn can_cast(kind: SyntaxKind) -> bool
190    where
191        Self: Sized,
192    {
193        matches!(
194            kind,
195            SyntaxKind::EXTERN_TYPE_FUNC
196                | SyntaxKind::EXTERN_TYPE_GLOBAL
197                | SyntaxKind::EXTERN_TYPE_MEMORY
198                | SyntaxKind::EXTERN_TYPE_TABLE
199                | SyntaxKind::EXTERN_TYPE_TAG
200        )
201    }
202    #[inline]
203    fn cast(syntax: SyntaxNode) -> Option<Self>
204    where
205        Self: Sized,
206    {
207        match syntax.kind() {
208            SyntaxKind::EXTERN_TYPE_FUNC => Some(ExternType::Func(ExternTypeFunc { syntax })),
209            SyntaxKind::EXTERN_TYPE_GLOBAL => Some(ExternType::Global(ExternTypeGlobal { syntax })),
210            SyntaxKind::EXTERN_TYPE_MEMORY => Some(ExternType::Memory(ExternTypeMemory { syntax })),
211            SyntaxKind::EXTERN_TYPE_TABLE => Some(ExternType::Table(ExternTypeTable { syntax })),
212            SyntaxKind::EXTERN_TYPE_TAG => Some(ExternType::Tag(ExternTypeTag { syntax })),
213            _ => None,
214        }
215    }
216    #[inline]
217    fn syntax(&self) -> &SyntaxNode {
218        match self {
219            ExternType::Func(it) => it.syntax(),
220            ExternType::Global(it) => it.syntax(),
221            ExternType::Memory(it) => it.syntax(),
222            ExternType::Table(it) => it.syntax(),
223            ExternType::Tag(it) => it.syntax(),
224        }
225    }
226}
227
228#[derive(Debug, Clone, PartialEq, Eq, Hash)]
229pub struct ExternTypeFunc {
230    syntax: SyntaxNode,
231}
232impl ExternTypeFunc {
233    #[inline]
234    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
235        token(&self.syntax, SyntaxKind::L_PAREN)
236    }
237    #[inline]
238    pub fn keyword(&self) -> Option<SyntaxToken> {
239        token(&self.syntax, SyntaxKind::KEYWORD)
240    }
241    #[inline]
242    pub fn ident_token(&self) -> Option<SyntaxToken> {
243        token(&self.syntax, SyntaxKind::IDENT)
244    }
245    #[inline]
246    pub fn type_use(&self) -> Option<TypeUse> {
247        child(&self.syntax)
248    }
249    #[inline]
250    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
251        token(&self.syntax, SyntaxKind::R_PAREN)
252    }
253}
254impl AstNode for ExternTypeFunc {
255    #[inline]
256    fn can_cast(kind: SyntaxKind) -> bool
257    where
258        Self: Sized,
259    {
260        kind == SyntaxKind::EXTERN_TYPE_FUNC
261    }
262    #[inline]
263    fn cast(syntax: SyntaxNode) -> Option<Self>
264    where
265        Self: Sized,
266    {
267        if Self::can_cast(syntax.kind()) {
268            Some(ExternTypeFunc { syntax })
269        } else {
270            None
271        }
272    }
273    #[inline]
274    fn syntax(&self) -> &SyntaxNode {
275        &self.syntax
276    }
277}
278
279#[derive(Debug, Clone, PartialEq, Eq, Hash)]
280pub struct ExternTypeGlobal {
281    syntax: SyntaxNode,
282}
283impl ExternTypeGlobal {
284    #[inline]
285    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
286        token(&self.syntax, SyntaxKind::L_PAREN)
287    }
288    #[inline]
289    pub fn keyword(&self) -> Option<SyntaxToken> {
290        token(&self.syntax, SyntaxKind::KEYWORD)
291    }
292    #[inline]
293    pub fn ident_token(&self) -> Option<SyntaxToken> {
294        token(&self.syntax, SyntaxKind::IDENT)
295    }
296    #[inline]
297    pub fn global_type(&self) -> Option<GlobalType> {
298        child(&self.syntax)
299    }
300    #[inline]
301    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
302        token(&self.syntax, SyntaxKind::R_PAREN)
303    }
304}
305impl AstNode for ExternTypeGlobal {
306    #[inline]
307    fn can_cast(kind: SyntaxKind) -> bool
308    where
309        Self: Sized,
310    {
311        kind == SyntaxKind::EXTERN_TYPE_GLOBAL
312    }
313    #[inline]
314    fn cast(syntax: SyntaxNode) -> Option<Self>
315    where
316        Self: Sized,
317    {
318        if Self::can_cast(syntax.kind()) {
319            Some(ExternTypeGlobal { syntax })
320        } else {
321            None
322        }
323    }
324    #[inline]
325    fn syntax(&self) -> &SyntaxNode {
326        &self.syntax
327    }
328}
329
330#[derive(Debug, Clone, PartialEq, Eq, Hash)]
331pub struct ExternTypeMemory {
332    syntax: SyntaxNode,
333}
334impl ExternTypeMemory {
335    #[inline]
336    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
337        token(&self.syntax, SyntaxKind::L_PAREN)
338    }
339    #[inline]
340    pub fn keyword(&self) -> Option<SyntaxToken> {
341        token(&self.syntax, SyntaxKind::KEYWORD)
342    }
343    #[inline]
344    pub fn ident_token(&self) -> Option<SyntaxToken> {
345        token(&self.syntax, SyntaxKind::IDENT)
346    }
347    #[inline]
348    pub fn mem_type(&self) -> Option<MemType> {
349        child(&self.syntax)
350    }
351    #[inline]
352    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
353        token(&self.syntax, SyntaxKind::R_PAREN)
354    }
355}
356impl AstNode for ExternTypeMemory {
357    #[inline]
358    fn can_cast(kind: SyntaxKind) -> bool
359    where
360        Self: Sized,
361    {
362        kind == SyntaxKind::EXTERN_TYPE_MEMORY
363    }
364    #[inline]
365    fn cast(syntax: SyntaxNode) -> Option<Self>
366    where
367        Self: Sized,
368    {
369        if Self::can_cast(syntax.kind()) {
370            Some(ExternTypeMemory { syntax })
371        } else {
372            None
373        }
374    }
375    #[inline]
376    fn syntax(&self) -> &SyntaxNode {
377        &self.syntax
378    }
379}
380
381#[derive(Debug, Clone, PartialEq, Eq, Hash)]
382pub struct ExternTypeTable {
383    syntax: SyntaxNode,
384}
385impl ExternTypeTable {
386    #[inline]
387    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
388        token(&self.syntax, SyntaxKind::L_PAREN)
389    }
390    #[inline]
391    pub fn keyword(&self) -> Option<SyntaxToken> {
392        token(&self.syntax, SyntaxKind::KEYWORD)
393    }
394    #[inline]
395    pub fn ident_token(&self) -> Option<SyntaxToken> {
396        token(&self.syntax, SyntaxKind::IDENT)
397    }
398    #[inline]
399    pub fn table_type(&self) -> Option<TableType> {
400        child(&self.syntax)
401    }
402    #[inline]
403    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
404        token(&self.syntax, SyntaxKind::R_PAREN)
405    }
406}
407impl AstNode for ExternTypeTable {
408    #[inline]
409    fn can_cast(kind: SyntaxKind) -> bool
410    where
411        Self: Sized,
412    {
413        kind == SyntaxKind::EXTERN_TYPE_TABLE
414    }
415    #[inline]
416    fn cast(syntax: SyntaxNode) -> Option<Self>
417    where
418        Self: Sized,
419    {
420        if Self::can_cast(syntax.kind()) {
421            Some(ExternTypeTable { syntax })
422        } else {
423            None
424        }
425    }
426    #[inline]
427    fn syntax(&self) -> &SyntaxNode {
428        &self.syntax
429    }
430}
431
432#[derive(Debug, Clone, PartialEq, Eq, Hash)]
433pub struct ExternTypeTag {
434    syntax: SyntaxNode,
435}
436impl ExternTypeTag {
437    #[inline]
438    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
439        token(&self.syntax, SyntaxKind::L_PAREN)
440    }
441    #[inline]
442    pub fn keyword(&self) -> Option<SyntaxToken> {
443        token(&self.syntax, SyntaxKind::KEYWORD)
444    }
445    #[inline]
446    pub fn ident_token(&self) -> Option<SyntaxToken> {
447        token(&self.syntax, SyntaxKind::IDENT)
448    }
449    #[inline]
450    pub fn type_use(&self) -> Option<TypeUse> {
451        child(&self.syntax)
452    }
453    #[inline]
454    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
455        token(&self.syntax, SyntaxKind::R_PAREN)
456    }
457}
458impl AstNode for ExternTypeTag {
459    #[inline]
460    fn can_cast(kind: SyntaxKind) -> bool
461    where
462        Self: Sized,
463    {
464        kind == SyntaxKind::EXTERN_TYPE_TAG
465    }
466    #[inline]
467    fn cast(syntax: SyntaxNode) -> Option<Self>
468    where
469        Self: Sized,
470    {
471        if Self::can_cast(syntax.kind()) {
472            Some(ExternTypeTag { syntax })
473        } else {
474            None
475        }
476    }
477    #[inline]
478    fn syntax(&self) -> &SyntaxNode {
479        &self.syntax
480    }
481}
482
483#[derive(Debug, Clone, PartialEq, Eq, Hash)]
484pub struct Field {
485    syntax: SyntaxNode,
486}
487impl Field {
488    #[inline]
489    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
490        token(&self.syntax, SyntaxKind::L_PAREN)
491    }
492    #[inline]
493    pub fn keyword(&self) -> Option<SyntaxToken> {
494        token(&self.syntax, SyntaxKind::KEYWORD)
495    }
496    #[inline]
497    pub fn ident_token(&self) -> Option<SyntaxToken> {
498        token(&self.syntax, SyntaxKind::IDENT)
499    }
500    #[inline]
501    pub fn field_types(&self) -> AstChildren<FieldType> {
502        children(&self.syntax)
503    }
504    #[inline]
505    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
506        token(&self.syntax, SyntaxKind::R_PAREN)
507    }
508}
509impl AstNode for Field {
510    #[inline]
511    fn can_cast(kind: SyntaxKind) -> bool
512    where
513        Self: Sized,
514    {
515        kind == SyntaxKind::FIELD
516    }
517    #[inline]
518    fn cast(syntax: SyntaxNode) -> Option<Self>
519    where
520        Self: Sized,
521    {
522        if Self::can_cast(syntax.kind()) {
523            Some(Field { syntax })
524        } else {
525            None
526        }
527    }
528    #[inline]
529    fn syntax(&self) -> &SyntaxNode {
530        &self.syntax
531    }
532}
533
534#[derive(Debug, Clone, PartialEq, Eq, Hash)]
535pub struct FieldType {
536    syntax: SyntaxNode,
537}
538impl FieldType {
539    #[inline]
540    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
541        token(&self.syntax, SyntaxKind::L_PAREN)
542    }
543    #[inline]
544    pub fn mut_keyword(&self) -> Option<SyntaxToken> {
545        token(&self.syntax, SyntaxKind::KEYWORD)
546    }
547    #[inline]
548    pub fn storage_type(&self) -> Option<StorageType> {
549        child(&self.syntax)
550    }
551    #[inline]
552    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
553        token(&self.syntax, SyntaxKind::R_PAREN)
554    }
555}
556impl AstNode for FieldType {
557    #[inline]
558    fn can_cast(kind: SyntaxKind) -> bool
559    where
560        Self: Sized,
561    {
562        kind == SyntaxKind::FIELD_TYPE
563    }
564    #[inline]
565    fn cast(syntax: SyntaxNode) -> Option<Self>
566    where
567        Self: Sized,
568    {
569        if Self::can_cast(syntax.kind()) {
570            Some(FieldType { syntax })
571        } else {
572            None
573        }
574    }
575    #[inline]
576    fn syntax(&self) -> &SyntaxNode {
577        &self.syntax
578    }
579}
580
581#[derive(Debug, Clone, PartialEq, Eq, Hash)]
582pub struct FuncType {
583    syntax: SyntaxNode,
584}
585impl FuncType {
586    #[inline]
587    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
588        token(&self.syntax, SyntaxKind::L_PAREN)
589    }
590    #[inline]
591    pub fn keyword(&self) -> Option<SyntaxToken> {
592        token(&self.syntax, SyntaxKind::KEYWORD)
593    }
594    #[inline]
595    pub fn params(&self) -> AstChildren<Param> {
596        children(&self.syntax)
597    }
598    #[inline]
599    pub fn results(&self) -> AstChildren<Result> {
600        children(&self.syntax)
601    }
602    #[inline]
603    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
604        token(&self.syntax, SyntaxKind::R_PAREN)
605    }
606}
607impl AstNode for FuncType {
608    #[inline]
609    fn can_cast(kind: SyntaxKind) -> bool
610    where
611        Self: Sized,
612    {
613        kind == SyntaxKind::FUNC_TYPE
614    }
615    #[inline]
616    fn cast(syntax: SyntaxNode) -> Option<Self>
617    where
618        Self: Sized,
619    {
620        if Self::can_cast(syntax.kind()) {
621            Some(FuncType { syntax })
622        } else {
623            None
624        }
625    }
626    #[inline]
627    fn syntax(&self) -> &SyntaxNode {
628        &self.syntax
629    }
630}
631
632#[derive(Debug, Clone, PartialEq, Eq, Hash)]
633pub struct GlobalType {
634    syntax: SyntaxNode,
635}
636impl GlobalType {
637    #[inline]
638    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
639        token(&self.syntax, SyntaxKind::L_PAREN)
640    }
641    #[inline]
642    pub fn mut_keyword(&self) -> Option<SyntaxToken> {
643        token(&self.syntax, SyntaxKind::KEYWORD)
644    }
645    #[inline]
646    pub fn val_type(&self) -> Option<ValType> {
647        child(&self.syntax)
648    }
649    #[inline]
650    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
651        token(&self.syntax, SyntaxKind::R_PAREN)
652    }
653}
654impl AstNode for GlobalType {
655    #[inline]
656    fn can_cast(kind: SyntaxKind) -> bool
657    where
658        Self: Sized,
659    {
660        kind == SyntaxKind::GLOBAL_TYPE
661    }
662    #[inline]
663    fn cast(syntax: SyntaxNode) -> Option<Self>
664    where
665        Self: Sized,
666    {
667        if Self::can_cast(syntax.kind()) {
668            Some(GlobalType { syntax })
669        } else {
670            None
671        }
672    }
673    #[inline]
674    fn syntax(&self) -> &SyntaxNode {
675        &self.syntax
676    }
677}
678
679#[derive(Debug, Clone, PartialEq, Eq, Hash)]
680pub struct HeapType {
681    syntax: SyntaxNode,
682}
683impl HeapType {
684    #[inline]
685    pub fn type_keyword(&self) -> Option<SyntaxToken> {
686        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
687    }
688    #[inline]
689    pub fn index(&self) -> Option<Index> {
690        child(&self.syntax)
691    }
692}
693impl AstNode for HeapType {
694    #[inline]
695    fn can_cast(kind: SyntaxKind) -> bool
696    where
697        Self: Sized,
698    {
699        kind == SyntaxKind::HEAP_TYPE
700    }
701    #[inline]
702    fn cast(syntax: SyntaxNode) -> Option<Self>
703    where
704        Self: Sized,
705    {
706        if Self::can_cast(syntax.kind()) {
707            Some(HeapType { syntax })
708        } else {
709            None
710        }
711    }
712    #[inline]
713    fn syntax(&self) -> &SyntaxNode {
714        &self.syntax
715    }
716}
717
718#[derive(Debug, Clone, PartialEq, Eq, Hash)]
719pub struct Limits {
720    syntax: SyntaxNode,
721}
722impl Limits {
723    #[inline]
724    pub fn min(&self) -> Option<SyntaxToken> {
725        token(&self.syntax, SyntaxKind::UNSIGNED_INT)
726    }
727    #[inline]
728    pub fn max(&self) -> Option<SyntaxToken> {
729        self.syntax.tokens_by_kind(SyntaxKind::UNSIGNED_INT).nth(1)
730    }
731}
732impl AstNode for Limits {
733    #[inline]
734    fn can_cast(kind: SyntaxKind) -> bool
735    where
736        Self: Sized,
737    {
738        kind == SyntaxKind::LIMITS
739    }
740    #[inline]
741    fn cast(syntax: SyntaxNode) -> Option<Self>
742    where
743        Self: Sized,
744    {
745        if Self::can_cast(syntax.kind()) {
746            Some(Limits { syntax })
747        } else {
748            None
749        }
750    }
751    #[inline]
752    fn syntax(&self) -> &SyntaxNode {
753        &self.syntax
754    }
755}
756
757#[derive(Debug, Clone, PartialEq, Eq, Hash)]
758pub struct MemPageSize {
759    syntax: SyntaxNode,
760}
761impl MemPageSize {
762    #[inline]
763    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
764        token(&self.syntax, SyntaxKind::L_PAREN)
765    }
766    #[inline]
767    pub fn keyword(&self) -> Option<SyntaxToken> {
768        token(&self.syntax, SyntaxKind::KEYWORD)
769    }
770    #[inline]
771    pub fn unsigned_int_token(&self) -> Option<SyntaxToken> {
772        token(&self.syntax, SyntaxKind::UNSIGNED_INT)
773    }
774    #[inline]
775    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
776        token(&self.syntax, SyntaxKind::R_PAREN)
777    }
778}
779impl AstNode for MemPageSize {
780    #[inline]
781    fn can_cast(kind: SyntaxKind) -> bool
782    where
783        Self: Sized,
784    {
785        kind == SyntaxKind::MEM_PAGE_SIZE
786    }
787    #[inline]
788    fn cast(syntax: SyntaxNode) -> Option<Self>
789    where
790        Self: Sized,
791    {
792        if Self::can_cast(syntax.kind()) {
793            Some(MemPageSize { syntax })
794        } else {
795            None
796        }
797    }
798    #[inline]
799    fn syntax(&self) -> &SyntaxNode {
800        &self.syntax
801    }
802}
803
804#[derive(Debug, Clone, PartialEq, Eq, Hash)]
805pub struct MemType {
806    syntax: SyntaxNode,
807}
808impl MemType {
809    #[inline]
810    pub fn addr_type(&self) -> Option<AddrType> {
811        child(&self.syntax)
812    }
813    #[inline]
814    pub fn limits(&self) -> Option<Limits> {
815        child(&self.syntax)
816    }
817    #[inline]
818    pub fn share_keyword(&self) -> Option<SyntaxToken> {
819        token(&self.syntax, SyntaxKind::KEYWORD)
820    }
821    #[inline]
822    pub fn mem_page_size(&self) -> Option<MemPageSize> {
823        child(&self.syntax)
824    }
825}
826impl AstNode for MemType {
827    #[inline]
828    fn can_cast(kind: SyntaxKind) -> bool
829    where
830        Self: Sized,
831    {
832        kind == SyntaxKind::MEM_TYPE
833    }
834    #[inline]
835    fn cast(syntax: SyntaxNode) -> Option<Self>
836    where
837        Self: Sized,
838    {
839        if Self::can_cast(syntax.kind()) {
840            Some(MemType { syntax })
841        } else {
842            None
843        }
844    }
845    #[inline]
846    fn syntax(&self) -> &SyntaxNode {
847        &self.syntax
848    }
849}
850
851#[derive(Debug, Clone, PartialEq, Eq, Hash)]
852pub struct NumType {
853    syntax: SyntaxNode,
854}
855impl NumType {
856    #[inline]
857    pub fn type_keyword(&self) -> Option<SyntaxToken> {
858        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
859    }
860}
861impl AstNode for NumType {
862    #[inline]
863    fn can_cast(kind: SyntaxKind) -> bool
864    where
865        Self: Sized,
866    {
867        kind == SyntaxKind::NUM_TYPE
868    }
869    #[inline]
870    fn cast(syntax: SyntaxNode) -> Option<Self>
871    where
872        Self: Sized,
873    {
874        if Self::can_cast(syntax.kind()) {
875            Some(NumType { syntax })
876        } else {
877            None
878        }
879    }
880    #[inline]
881    fn syntax(&self) -> &SyntaxNode {
882        &self.syntax
883    }
884}
885
886#[derive(Debug, Clone, PartialEq, Eq, Hash)]
887pub struct PackedType {
888    syntax: SyntaxNode,
889}
890impl PackedType {
891    #[inline]
892    pub fn type_keyword(&self) -> Option<SyntaxToken> {
893        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
894    }
895}
896impl AstNode for PackedType {
897    #[inline]
898    fn can_cast(kind: SyntaxKind) -> bool
899    where
900        Self: Sized,
901    {
902        kind == SyntaxKind::PACKED_TYPE
903    }
904    #[inline]
905    fn cast(syntax: SyntaxNode) -> Option<Self>
906    where
907        Self: Sized,
908    {
909        if Self::can_cast(syntax.kind()) {
910            Some(PackedType { syntax })
911        } else {
912            None
913        }
914    }
915    #[inline]
916    fn syntax(&self) -> &SyntaxNode {
917        &self.syntax
918    }
919}
920
921#[derive(Debug, Clone, PartialEq, Eq, Hash)]
922pub struct Param {
923    syntax: SyntaxNode,
924}
925impl Param {
926    #[inline]
927    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
928        token(&self.syntax, SyntaxKind::L_PAREN)
929    }
930    #[inline]
931    pub fn keyword(&self) -> Option<SyntaxToken> {
932        token(&self.syntax, SyntaxKind::KEYWORD)
933    }
934    #[inline]
935    pub fn ident_token(&self) -> Option<SyntaxToken> {
936        token(&self.syntax, SyntaxKind::IDENT)
937    }
938    #[inline]
939    pub fn val_types(&self) -> AstChildren<ValType> {
940        children(&self.syntax)
941    }
942    #[inline]
943    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
944        token(&self.syntax, SyntaxKind::R_PAREN)
945    }
946}
947impl AstNode for Param {
948    #[inline]
949    fn can_cast(kind: SyntaxKind) -> bool
950    where
951        Self: Sized,
952    {
953        kind == SyntaxKind::PARAM
954    }
955    #[inline]
956    fn cast(syntax: SyntaxNode) -> Option<Self>
957    where
958        Self: Sized,
959    {
960        if Self::can_cast(syntax.kind()) {
961            Some(Param { syntax })
962        } else {
963            None
964        }
965    }
966    #[inline]
967    fn syntax(&self) -> &SyntaxNode {
968        &self.syntax
969    }
970}
971
972#[derive(Debug, Clone, PartialEq, Eq, Hash)]
973pub struct RefType {
974    syntax: SyntaxNode,
975}
976impl RefType {
977    #[inline]
978    pub fn type_keyword(&self) -> Option<SyntaxToken> {
979        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
980    }
981    #[inline]
982    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
983        token(&self.syntax, SyntaxKind::L_PAREN)
984    }
985    #[inline]
986    pub fn keyword(&self) -> Option<SyntaxToken> {
987        token(&self.syntax, SyntaxKind::KEYWORD)
988    }
989    #[inline]
990    pub fn null_keyword(&self) -> Option<SyntaxToken> {
991        token(&self.syntax, SyntaxKind::MODIFIER_KEYWORD)
992    }
993    #[inline]
994    pub fn heap_type(&self) -> Option<HeapType> {
995        child(&self.syntax)
996    }
997    #[inline]
998    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
999        token(&self.syntax, SyntaxKind::R_PAREN)
1000    }
1001}
1002impl AstNode for RefType {
1003    #[inline]
1004    fn can_cast(kind: SyntaxKind) -> bool
1005    where
1006        Self: Sized,
1007    {
1008        kind == SyntaxKind::REF_TYPE
1009    }
1010    #[inline]
1011    fn cast(syntax: SyntaxNode) -> Option<Self>
1012    where
1013        Self: Sized,
1014    {
1015        if Self::can_cast(syntax.kind()) {
1016            Some(RefType { syntax })
1017        } else {
1018            None
1019        }
1020    }
1021    #[inline]
1022    fn syntax(&self) -> &SyntaxNode {
1023        &self.syntax
1024    }
1025}
1026
1027#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1028pub struct Result {
1029    syntax: SyntaxNode,
1030}
1031impl Result {
1032    #[inline]
1033    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
1034        token(&self.syntax, SyntaxKind::L_PAREN)
1035    }
1036    #[inline]
1037    pub fn keyword(&self) -> Option<SyntaxToken> {
1038        token(&self.syntax, SyntaxKind::KEYWORD)
1039    }
1040    #[inline]
1041    pub fn val_types(&self) -> AstChildren<ValType> {
1042        children(&self.syntax)
1043    }
1044    #[inline]
1045    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
1046        token(&self.syntax, SyntaxKind::R_PAREN)
1047    }
1048}
1049impl AstNode for Result {
1050    #[inline]
1051    fn can_cast(kind: SyntaxKind) -> bool
1052    where
1053        Self: Sized,
1054    {
1055        kind == SyntaxKind::RESULT
1056    }
1057    #[inline]
1058    fn cast(syntax: SyntaxNode) -> Option<Self>
1059    where
1060        Self: Sized,
1061    {
1062        if Self::can_cast(syntax.kind()) {
1063            Some(Result { syntax })
1064        } else {
1065            None
1066        }
1067    }
1068    #[inline]
1069    fn syntax(&self) -> &SyntaxNode {
1070        &self.syntax
1071    }
1072}
1073
1074#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1075pub enum StorageType {
1076    Val(ValType),
1077    Packed(PackedType),
1078}
1079impl AstNode for StorageType {
1080    #[inline]
1081    fn can_cast(kind: SyntaxKind) -> bool
1082    where
1083        Self: Sized,
1084    {
1085        matches!(
1086            kind,
1087            SyntaxKind::NUM_TYPE | SyntaxKind::VEC_TYPE | SyntaxKind::REF_TYPE | SyntaxKind::PACKED_TYPE
1088        )
1089    }
1090    #[inline]
1091    fn cast(syntax: SyntaxNode) -> Option<Self>
1092    where
1093        Self: Sized,
1094    {
1095        match syntax.kind() {
1096            SyntaxKind::NUM_TYPE => Some(StorageType::Val(ValType::Num(NumType { syntax }))),
1097            SyntaxKind::VEC_TYPE => Some(StorageType::Val(ValType::Vec(VecType { syntax }))),
1098            SyntaxKind::REF_TYPE => Some(StorageType::Val(ValType::Ref(RefType { syntax }))),
1099            SyntaxKind::PACKED_TYPE => Some(StorageType::Packed(PackedType { syntax })),
1100            _ => None,
1101        }
1102    }
1103    #[inline]
1104    fn syntax(&self) -> &SyntaxNode {
1105        match self {
1106            StorageType::Val(it) => it.syntax(),
1107            StorageType::Packed(it) => it.syntax(),
1108        }
1109    }
1110}
1111
1112#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1113pub struct StructType {
1114    syntax: SyntaxNode,
1115}
1116impl StructType {
1117    #[inline]
1118    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
1119        token(&self.syntax, SyntaxKind::L_PAREN)
1120    }
1121    #[inline]
1122    pub fn keyword(&self) -> Option<SyntaxToken> {
1123        token(&self.syntax, SyntaxKind::KEYWORD)
1124    }
1125    #[inline]
1126    pub fn fields(&self) -> AstChildren<Field> {
1127        children(&self.syntax)
1128    }
1129    #[inline]
1130    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
1131        token(&self.syntax, SyntaxKind::R_PAREN)
1132    }
1133}
1134impl AstNode for StructType {
1135    #[inline]
1136    fn can_cast(kind: SyntaxKind) -> bool
1137    where
1138        Self: Sized,
1139    {
1140        kind == SyntaxKind::STRUCT_TYPE
1141    }
1142    #[inline]
1143    fn cast(syntax: SyntaxNode) -> Option<Self>
1144    where
1145        Self: Sized,
1146    {
1147        if Self::can_cast(syntax.kind()) {
1148            Some(StructType { syntax })
1149        } else {
1150            None
1151        }
1152    }
1153    #[inline]
1154    fn syntax(&self) -> &SyntaxNode {
1155        &self.syntax
1156    }
1157}
1158
1159#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1160pub struct SubType {
1161    syntax: SyntaxNode,
1162}
1163impl SubType {
1164    #[inline]
1165    pub fn l_paren_token(&self) -> Option<SyntaxToken> {
1166        token(&self.syntax, SyntaxKind::L_PAREN)
1167    }
1168    #[inline]
1169    pub fn keyword(&self) -> Option<SyntaxToken> {
1170        token(&self.syntax, SyntaxKind::KEYWORD)
1171    }
1172    #[inline]
1173    pub fn final_keyword(&self) -> Option<SyntaxToken> {
1174        self.syntax.tokens_by_kind(SyntaxKind::MODIFIER_KEYWORD).next()
1175    }
1176    #[inline]
1177    pub fn indexes(&self) -> AstChildren<Index> {
1178        children(&self.syntax)
1179    }
1180    #[inline]
1181    pub fn comp_type(&self) -> Option<CompType> {
1182        child(&self.syntax)
1183    }
1184    #[inline]
1185    pub fn r_paren_token(&self) -> Option<SyntaxToken> {
1186        token(&self.syntax, SyntaxKind::R_PAREN)
1187    }
1188}
1189impl AstNode for SubType {
1190    #[inline]
1191    fn can_cast(kind: SyntaxKind) -> bool
1192    where
1193        Self: Sized,
1194    {
1195        kind == SyntaxKind::SUB_TYPE
1196    }
1197    #[inline]
1198    fn cast(syntax: SyntaxNode) -> Option<Self>
1199    where
1200        Self: Sized,
1201    {
1202        if Self::can_cast(syntax.kind()) {
1203            Some(SubType { syntax })
1204        } else {
1205            None
1206        }
1207    }
1208    #[inline]
1209    fn syntax(&self) -> &SyntaxNode {
1210        &self.syntax
1211    }
1212}
1213
1214#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1215pub struct TableType {
1216    syntax: SyntaxNode,
1217}
1218impl TableType {
1219    #[inline]
1220    pub fn addr_type(&self) -> Option<AddrType> {
1221        child(&self.syntax)
1222    }
1223    #[inline]
1224    pub fn limits(&self) -> Option<Limits> {
1225        child(&self.syntax)
1226    }
1227    #[inline]
1228    pub fn ref_type(&self) -> Option<RefType> {
1229        child(&self.syntax)
1230    }
1231}
1232impl AstNode for TableType {
1233    #[inline]
1234    fn can_cast(kind: SyntaxKind) -> bool
1235    where
1236        Self: Sized,
1237    {
1238        kind == SyntaxKind::TABLE_TYPE
1239    }
1240    #[inline]
1241    fn cast(syntax: SyntaxNode) -> Option<Self>
1242    where
1243        Self: Sized,
1244    {
1245        if Self::can_cast(syntax.kind()) {
1246            Some(TableType { syntax })
1247        } else {
1248            None
1249        }
1250    }
1251    #[inline]
1252    fn syntax(&self) -> &SyntaxNode {
1253        &self.syntax
1254    }
1255}
1256
1257#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1258pub enum ValType {
1259    Num(NumType),
1260    Vec(VecType),
1261    Ref(RefType),
1262}
1263impl AstNode for ValType {
1264    #[inline]
1265    fn can_cast(kind: SyntaxKind) -> bool
1266    where
1267        Self: Sized,
1268    {
1269        matches!(kind, SyntaxKind::NUM_TYPE | SyntaxKind::VEC_TYPE | SyntaxKind::REF_TYPE)
1270    }
1271    #[inline]
1272    fn cast(syntax: SyntaxNode) -> Option<Self>
1273    where
1274        Self: Sized,
1275    {
1276        match syntax.kind() {
1277            SyntaxKind::NUM_TYPE => Some(ValType::Num(NumType { syntax })),
1278            SyntaxKind::VEC_TYPE => Some(ValType::Vec(VecType { syntax })),
1279            SyntaxKind::REF_TYPE => Some(ValType::Ref(RefType { syntax })),
1280            _ => None,
1281        }
1282    }
1283    #[inline]
1284    fn syntax(&self) -> &SyntaxNode {
1285        match self {
1286            ValType::Num(it) => it.syntax(),
1287            ValType::Vec(it) => it.syntax(),
1288            ValType::Ref(it) => it.syntax(),
1289        }
1290    }
1291}
1292
1293#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1294pub struct VecType {
1295    syntax: SyntaxNode,
1296}
1297impl VecType {
1298    #[inline]
1299    pub fn type_keyword(&self) -> Option<SyntaxToken> {
1300        token(&self.syntax, SyntaxKind::TYPE_KEYWORD)
1301    }
1302}
1303impl AstNode for VecType {
1304    #[inline]
1305    fn can_cast(kind: SyntaxKind) -> bool
1306    where
1307        Self: Sized,
1308    {
1309        kind == SyntaxKind::VEC_TYPE
1310    }
1311    #[inline]
1312    fn cast(syntax: SyntaxNode) -> Option<Self>
1313    where
1314        Self: Sized,
1315    {
1316        if Self::can_cast(syntax.kind()) {
1317            Some(VecType { syntax })
1318        } else {
1319            None
1320        }
1321    }
1322    #[inline]
1323    fn syntax(&self) -> &SyntaxNode {
1324        &self.syntax
1325    }
1326}