jsdoc/
ast.rs

1#![allow(unexpected_cfgs)]
2
3use swc_atoms::Atom;
4use swc_common::{ast_node, Span};
5
6/// Spanned text
7#[ast_node]
8#[derive(Eq)]
9pub struct Text {
10    pub span: Span,
11    pub value: Atom,
12}
13
14#[ast_node]
15pub struct JsDoc {
16    pub span: Span,
17
18    pub description: Text,
19    pub tags: Vec<TagItem>,
20}
21
22///  tag with comments.
23#[ast_node]
24pub struct TagItem {
25    pub span: Span,
26    #[cfg_attr(feature = "serde-impl", serde(rename = "tagName"))]
27    pub tag_name: Text,
28    #[cfg_attr(feature = "serde-impl", serde(flatten))]
29    pub tag: Tag,
30}
31
32#[ast_node]
33#[non_exhaustive]
34pub enum Tag {
35    #[tag("Yield")]
36    Yield(YieldTag),
37    #[tag("TypeDef")]
38    TypeDef(TypeDefTag),
39    #[tag("Throw")]
40    Throw(ThrowTag),
41    #[tag("Todo")]
42    Todo(TodoTag),
43    #[tag("Tutorial")]
44    Tutorial(TutorialTag),
45    #[tag("Static")]
46    Static(StaticTag),
47    #[tag("Summary")]
48    Summary(SummaryTag),
49    #[tag("See")]
50    See(SeeTag),
51    #[tag("Since")]
52    Since(SinceTag),
53    #[tag("Requires")]
54    Requires(RequiresTag),
55    #[tag("Override")]
56    Override(OverrideTag),
57    #[tag("Package")]
58    Package(PackageTag),
59    #[tag("Module")]
60    Module(ModuleTag),
61    #[tag("Name")]
62    Name(NameTag),
63    #[tag("Namespace")]
64    Namespace(NamespaceTag),
65    #[tag("Variation")]
66    Variation(VariationTag),
67    #[tag("Version")]
68    Version(VersionTag),
69    #[tag("MemberOf")]
70    MemberOf(MemberOfTag),
71    #[tag("Mixes")]
72    Mixes(MixesTag),
73    #[tag("Mixin")]
74    Mixin(MixinTag),
75    #[tag("Member")]
76    Member(MemberTag),
77    #[tag("Listens")]
78    Listens(ListensTag),
79    #[tag("License")]
80    License(LicenseTag),
81    #[tag("Kind")]
82    Kind(KindTag),
83    #[tag("Lends")]
84    Lends(LendsTag),
85    #[tag("Instance")]
86    Instance(InstanceTag),
87    #[tag("Interface")]
88    Interface(InterfaceTag),
89    #[tag("Inner")]
90    Inner(InnerTag),
91    #[tag("InheritDoc")]
92    InheritDoc(InheritDocTag),
93    #[tag("IgnoreTag")]
94    Ignore(IgnoreTag),
95    #[tag("HideConstructorTag")]
96    HideConstructor(HideConstructorTag),
97    #[tag("GeneratorTag")]
98    Generator(GeneratorTag),
99    #[tag("FunctionTag")]
100    Function(FunctionTag),
101    #[tag("FileTag")]
102    File(FileTag),
103    #[tag("ConstructsTag")]
104    Constructs(ConstructsTag),
105    #[tag("CopyrightTag")]
106    Copyright(CopyrightTag),
107    #[tag("AbstractTag")]
108    Abstract(AbstractTag),
109    #[tag("AccessTag")]
110    Access(AccessTag),
111    #[tag("AliasTag")]
112    Alias(AliasTag),
113    #[tag("AsyncTag")]
114    Async(AsyncTag),
115    #[tag("UnknownTag")]
116    Unknown(UnknownTag),
117    #[tag("AugmentsTag")]
118    Augments(AugmentsTag),
119    #[tag("ImplementsTag")]
120    Implements(ImplementsTag),
121    #[tag("AuthorTag")]
122    Author(AuthorTag),
123    #[tag("BorrowsTag")]
124    Borrows(BorrowsTag),
125    #[tag("ClassTag")]
126    Class(ClassTag),
127    #[tag("JSDocClassDescTag")]
128    ClassDesc(JSDocClassDescTag),
129    #[tag("ConstTag")]
130    Const(ConstTag),
131    #[tag("PublicTag")]
132    Public(PublicTag),
133    #[tag("PrivateTag")]
134    Private(PrivateTag),
135    #[tag("ProtectedTag")]
136    Protected(ProtectedTag),
137    #[tag("ReadonlyTag")]
138    Readonly(ReadonlyTag),
139    #[tag("CallbackTag")]
140    Callback(CallbackTag),
141    #[tag("EnumTag")]
142    Enum(EnumTag),
143    #[tag("ParameterTag")]
144    Parameter(ParameterTag),
145    #[tag("ReturnTag")]
146    Return(ReturnTag),
147    #[tag("ThisTag")]
148    This(ThisTag),
149    #[tag("TypeTag")]
150    Type(TypeTag),
151    #[tag("TemplateTag")]
152    Template(TemplateTag),
153    #[tag("TypedefTag")]
154    Typedef(TypedefTag),
155    #[tag("PropertyTag")]
156    Property(PropertyTag),
157    #[tag("DescriptionTag")]
158    Description(DescriptionTag),
159    #[tag("ExampleTag")]
160    Example(ExampleTag),
161    #[tag("ExportsTag")]
162    Exports(ExportsTag),
163    #[tag("ExternalTag")]
164    External(ExternalTag),
165    #[tag("DefaultTag")]
166    Default(DefaultTag),
167    #[tag("DeprecatedTag")]
168    Deprecated(DeprecatedTag),
169}
170
171#[ast_node]
172pub struct AbstractTag {
173    pub span: Span,
174}
175
176#[ast_node]
177pub struct AccessTag {
178    pub span: Span,
179    pub access: Text,
180}
181
182#[ast_node]
183pub struct AliasTag {
184    pub span: Span,
185    pub name_path: NamePath,
186}
187
188#[ast_node]
189pub struct AsyncTag {
190    pub span: Span,
191}
192
193#[ast_node]
194pub struct BorrowsTag {
195    pub span: Span,
196    pub from: NamePath,
197    pub to: NamePath,
198}
199
200#[ast_node]
201pub struct JSDocClassDescTag {
202    pub span: Span,
203    pub desc: Text,
204}
205
206#[ast_node]
207pub struct ConstTag {
208    pub span: Span,
209    pub ty: Option<Text>,
210    pub name: Option<Text>,
211}
212
213#[ast_node]
214pub struct UnknownTag {
215    pub span: Span,
216    pub extras: Text,
217}
218
219/// `@extends`, `@augments`
220#[ast_node]
221pub struct AugmentsTag {
222    pub span: Span,
223    pub class: NamePath,
224}
225
226#[ast_node]
227pub struct ImplementsTag {
228    pub span: Span,
229    pub class: Text,
230}
231
232#[ast_node]
233pub struct ExprWithTypeArgs {
234    pub span: Span,
235
236    // TODO parent: HeritageClause | JSDocAugmentsTag | JSDocImplementsTag;
237    pub expr: Box<Expr>,
238}
239
240#[ast_node]
241pub enum Expr {
242    #[tag("Identifier")]
243    Text(Text),
244    #[tag("NamePath")]
245    Property(NamePath),
246}
247
248#[ast_node]
249pub struct AuthorTag {
250    pub span: Span,
251    /// `<name> [<emailAddress>]`
252    pub author: Text,
253}
254
255#[ast_node]
256#[derive(Eq)]
257pub struct ClassTag {
258    pub span: Span,
259    pub ty: Option<Text>,
260    pub name: Option<Text>,
261}
262
263#[ast_node]
264#[derive(Eq)]
265pub struct PublicTag {
266    pub span: Span,
267}
268
269#[ast_node]
270#[derive(Eq)]
271pub struct PrivateTag {
272    pub span: Span,
273    pub ty: Option<Text>,
274}
275
276#[ast_node]
277#[derive(Eq)]
278pub struct ProtectedTag {
279    pub span: Span,
280    pub ty: Option<Text>,
281}
282
283#[ast_node]
284#[derive(Eq)]
285pub struct ReadonlyTag {
286    pub span: Span,
287}
288
289#[ast_node]
290pub struct CallbackTag {
291    pub span: Span,
292    pub name_path: NamePath,
293}
294
295#[ast_node]
296pub struct PropertyTag {
297    pub span: Span,
298
299    pub name_path: NamePath,
300    pub ty: Option<Text>,
301    pub desc: Text,
302}
303
304#[ast_node]
305pub struct ParameterTag {
306    pub span: Span,
307
308    pub name: Option<Text>,
309    #[cfg_attr(feature = "serde-impl", serde(rename = "typeExpression"))]
310    pub ty: Option<Text>,
311
312    pub desc: Text,
313}
314
315#[ast_node]
316#[derive(Eq)]
317pub struct EnumTag {
318    pub span: Span,
319    pub ty: Text,
320}
321
322#[ast_node]
323pub struct ReturnTag {
324    pub span: Span,
325    pub ty: Option<Text>,
326    pub description: Text,
327}
328
329#[ast_node]
330pub struct ThisTag {
331    pub span: Span,
332    pub name_path: NamePath,
333}
334
335#[ast_node]
336pub struct TypeTag {
337    pub span: Span,
338    pub name: Text,
339}
340
341#[ast_node]
342pub struct TemplateTag {
343    pub span: Span,
344    pub constraint: Option<TypeExpr>,
345}
346
347#[ast_node]
348pub struct TypedefTag {
349    pub span: Span,
350    #[cfg_attr(feature = "serde-impl", serde(rename = "full_name"))]
351    pub full_name: Option<NamespaceBody>,
352
353    pub name: Option<Text>,
354    #[cfg_attr(feature = "serde-impl", serde(rename = "typeExpression"))]
355    pub type_expr: Option<TypeExprOrTypeLit>,
356}
357
358#[ast_node]
359pub enum Type {
360    /// `*`
361    #[tag("AllType")]
362    All(AllType),
363    /// `?`
364    #[tag("UnknownType")]
365    Unknown(UnknownType),
366    #[tag("NullableType")]
367    Nullable(NullableType),
368    #[tag("NonNullableType")]
369    NonNullable(NonNullableType),
370    #[tag("OptionalType")]
371    Optional(OptionalType),
372    #[tag("FunctionType")]
373    Function(FunctionType),
374    #[tag("VariadicType")]
375    Variadic(VariadicType),
376    // https://jsdoc.app/about-namepaths.html
377    #[tag("NamePathType")]
378    NamePath(NamePathType),
379    #[tag("UnionType")]
380    Union(UnionType),
381    #[tag("ParenType")]
382    Paren(ParenType),
383}
384
385#[ast_node]
386pub struct UnionType {
387    pub span: Span,
388    pub types: Vec<Type>,
389}
390
391#[ast_node]
392pub struct ParenType {
393    pub span: Span,
394    pub ty: Box<Type>,
395}
396
397#[ast_node]
398#[derive(Eq)]
399pub struct AllType {
400    pub span: Span,
401}
402
403#[ast_node]
404#[derive(Eq)]
405pub struct UnknownType {
406    pub span: Span,
407}
408
409#[ast_node]
410pub struct NullableType {
411    pub span: Span,
412    pub ty: Box<Type>,
413}
414
415#[ast_node]
416pub struct NonNullableType {
417    pub span: Span,
418    pub ty: Box<Type>,
419}
420
421#[ast_node]
422pub struct OptionalType {
423    pub span: Span,
424    pub ty: Box<Type>,
425}
426
427/// TODO: Add fields
428#[ast_node]
429pub struct FunctionType {
430    pub span: Span,
431    pub ty: Box<Type>,
432}
433
434#[ast_node]
435pub struct VariadicType {
436    pub span: Span,
437    pub ty: Box<Type>,
438}
439
440#[ast_node]
441pub struct NamePathType {
442    pub span: Span,
443    pub ty: Box<Type>,
444}
445
446/// represents a top level: { type } expression in a JSDoc comment.
447#[ast_node]
448pub struct TypeExpr {
449    pub span: Span,
450    pub ty: Type,
451}
452
453#[ast_node]
454pub struct NamespaceDecl {
455    pub span: Span,
456    pub name: Text,
457    pub body: Vec<NamespaceBody>,
458}
459
460#[ast_node]
461pub enum NamespaceBody {
462    #[tag("Identifier")]
463    Text(Box<Text>),
464    #[tag("NamespaceDecl")]
465    Decl(Box<NamespaceDecl>),
466}
467
468#[ast_node]
469pub enum TypeExprOrTypeLit {
470    #[tag("TypeExpr")]
471    Expr(Box<TypeExpr>),
472    #[tag("TypeLit")]
473    TypeLit(Box<TypeLit>),
474}
475
476#[ast_node]
477pub struct TypeLit {
478    pub span: Span,
479    pub tags: Vec<PropOrParam>,
480    /// If true, then this type literal represents an *array* of its type.
481    pub is_array_type: bool,
482}
483
484#[ast_node]
485pub enum PropOrParam {
486    #[tag("PropertyTag")]
487    Prop(PropertyTag),
488    #[tag("ParameterTag")]
489    Param(ParameterTag),
490}
491
492#[ast_node]
493pub struct NamePath {
494    pub span: Span,
495    pub components: Vec<Text>,
496}
497
498#[ast_node]
499pub struct CopyrightTag {
500    pub span: Span,
501    pub text: Text,
502}
503
504#[ast_node]
505pub struct DescriptionTag {
506    pub span: Span,
507    pub text: Text,
508}
509
510#[ast_node]
511pub struct ExampleTag {
512    pub span: Span,
513    pub text: Text,
514}
515
516#[ast_node]
517pub struct ExportsTag {
518    pub span: Span,
519    pub module_name: Text,
520}
521
522#[ast_node]
523pub struct ExternalTag {
524    pub span: Span,
525    pub name: Text,
526}
527
528#[ast_node]
529pub struct ConstructsTag {
530    pub span: Span,
531    pub name: Text,
532}
533
534#[ast_node]
535pub struct DefaultTag {
536    pub span: Span,
537    pub value: Text,
538}
539
540#[ast_node]
541pub struct DeprecatedTag {
542    pub span: Span,
543    pub text: Text,
544}
545
546#[ast_node]
547pub struct FileTag {
548    pub span: Span,
549    pub text: Text,
550}
551
552#[ast_node]
553pub struct FunctionTag {
554    pub span: Span,
555    pub name: Option<Text>,
556}
557
558#[ast_node]
559pub struct GeneratorTag {
560    pub span: Span,
561}
562#[ast_node]
563pub struct HideConstructorTag {
564    pub span: Span,
565}
566
567#[ast_node]
568pub struct IgnoreTag {
569    pub span: Span,
570}
571
572#[ast_node]
573pub struct InheritDocTag {
574    pub span: Span,
575}
576
577#[ast_node]
578pub struct InnerTag {
579    pub span: Span,
580}
581
582#[ast_node]
583pub struct InstanceTag {
584    pub span: Span,
585}
586
587#[ast_node]
588pub struct InterfaceTag {
589    pub span: Span,
590    pub name: Option<Text>,
591}
592#[ast_node]
593pub struct KindTag {
594    pub span: Span,
595    pub name: Text,
596}
597
598#[ast_node]
599pub struct LendsTag {
600    pub span: Span,
601    pub name: NamePath,
602}
603
604#[ast_node]
605pub struct LicenseTag {
606    pub span: Span,
607    pub identifier: Text,
608}
609
610#[ast_node]
611pub struct ListensTag {
612    pub span: Span,
613    pub event_name: Text,
614}
615
616#[ast_node]
617pub struct MemberTag {
618    pub span: Span,
619    pub ty: Text,
620    pub name: Text,
621}
622
623#[ast_node]
624pub struct MemberOfTag {
625    pub span: Span,
626    pub parent_name_path: NamePath,
627}
628
629#[ast_node]
630pub struct TypeDefTag {
631    pub span: Span,
632    pub ty: Option<Text>,
633    pub name_path: NamePath,
634}
635
636#[ast_node]
637pub struct MixesTag {
638    pub span: Span,
639    pub name_path: NamePath,
640}
641
642#[ast_node]
643pub struct MixinTag {
644    pub span: Span,
645    pub name: Text,
646}
647
648#[ast_node]
649pub struct ModuleTag {
650    pub span: Span,
651    pub name: Text,
652    pub ty: Text,
653}
654
655#[ast_node]
656pub struct NameTag {
657    pub span: Span,
658    pub name_path: NamePath,
659}
660
661#[ast_node]
662pub struct NamespaceTag {
663    pub span: Span,
664    pub ty: Option<Text>,
665    pub name: Option<Text>,
666}
667
668#[ast_node]
669pub struct OverrideTag {
670    pub span: Span,
671}
672
673#[ast_node]
674pub struct PackageTag {
675    pub span: Span,
676    pub ty: Option<Text>,
677}
678
679#[ast_node]
680pub struct RequiresTag {
681    pub span: Span,
682    pub name_path: NamePath,
683}
684
685#[ast_node]
686pub struct SeeTag {
687    pub span: Span,
688    pub text: Text,
689}
690
691#[ast_node]
692pub struct SinceTag {
693    pub span: Span,
694    pub version: Text,
695}
696
697#[ast_node]
698pub struct SummaryTag {
699    pub span: Span,
700    pub text: Text,
701}
702
703#[ast_node]
704pub struct StaticTag {
705    pub span: Span,
706}
707
708#[ast_node]
709pub struct ThrowTag {
710    pub span: Span,
711    pub text: Text,
712}
713
714#[ast_node]
715pub struct TodoTag {
716    pub span: Span,
717    pub text: Text,
718}
719
720#[ast_node]
721pub struct TutorialTag {
722    pub span: Span,
723    pub text: Text,
724}
725
726#[ast_node]
727pub struct VariationTag {
728    pub span: Span,
729    pub number: Text,
730}
731
732#[ast_node]
733pub struct VersionTag {
734    pub span: Span,
735    pub value: Text,
736}
737
738#[ast_node]
739pub struct YieldTag {
740    pub span: Span,
741    pub value: Option<Text>,
742    pub description: Text,
743}