1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#[macro_export]
macro_rules! unreachable_visit_mut_type {
    ($name:ident, $N:ident) => {
        fn $name(&mut self, _: &mut swc_ecma_ast::$N) {
            #[cfg(debug_assertions)]
            unreachable!(stringify!($name));
            #[cfg(not(debug_assertions))]
            unreachable!();
        }
    };
    () => {
        unreachable_visit_mut_type!(visit_mut_accessibility, Accessibility);
        unreachable_visit_mut_type!(visit_mut_true_plus_minus, TruePlusMinus);
        unreachable_visit_mut_type!(visit_mut_ts_array_type, TsArrayType);
        unreachable_visit_mut_type!(visit_mut_ts_call_signature_decl, TsCallSignatureDecl);
        unreachable_visit_mut_type!(visit_mut_ts_conditional_type, TsConditionalType);
        unreachable_visit_mut_type!(
            visit_mut_ts_construct_signature_decl,
            TsConstructSignatureDecl
        );
        unreachable_visit_mut_type!(visit_mut_ts_constructor_type, TsConstructorType);
        unreachable_visit_mut_type!(visit_mut_ts_entity_name, TsEntityName);
        unreachable_visit_mut_type!(visit_mut_ts_external_module_ref, TsExternalModuleRef);
        unreachable_visit_mut_type!(visit_mut_ts_fn_or_constructor_type, TsFnOrConstructorType);
        unreachable_visit_mut_type!(visit_mut_ts_fn_param, TsFnParam);
        unreachable_visit_mut_type!(visit_mut_ts_fn_type, TsFnType);
        unreachable_visit_mut_type!(visit_mut_ts_import_type, TsImportType);
        unreachable_visit_mut_type!(visit_mut_ts_index_signature, TsIndexSignature);
        unreachable_visit_mut_type!(visit_mut_ts_indexed_access_type, TsIndexedAccessType);
        unreachable_visit_mut_type!(visit_mut_ts_infer_type, TsInferType);
        unreachable_visit_mut_type!(visit_mut_ts_interface_body, TsInterfaceBody);
        unreachable_visit_mut_type!(visit_mut_ts_interface_decl, TsInterfaceDecl);
        unreachable_visit_mut_type!(visit_mut_ts_intersection_type, TsIntersectionType);
        unreachable_visit_mut_type!(visit_mut_ts_keyword_type, TsKeywordType);
        unreachable_visit_mut_type!(visit_mut_ts_keyword_type_kind, TsKeywordTypeKind);
        unreachable_visit_mut_type!(visit_mut_ts_mapped_type, TsMappedType);
        unreachable_visit_mut_type!(visit_mut_ts_method_signature, TsMethodSignature);
        unreachable_visit_mut_type!(visit_mut_ts_module_ref, TsModuleRef);
        unreachable_visit_mut_type!(visit_mut_ts_optional_type, TsOptionalType);
        unreachable_visit_mut_type!(visit_mut_ts_parenthesized_type, TsParenthesizedType);
        unreachable_visit_mut_type!(visit_mut_ts_property_signature, TsPropertySignature);
        unreachable_visit_mut_type!(visit_mut_ts_qualified_name, TsQualifiedName);
        unreachable_visit_mut_type!(visit_mut_ts_rest_type, TsRestType);
        unreachable_visit_mut_type!(visit_mut_ts_this_type, TsThisType);
        unreachable_visit_mut_type!(visit_mut_ts_this_type_or_ident, TsThisTypeOrIdent);
        unreachable_visit_mut_type!(visit_mut_ts_tuple_type, TsTupleType);
        unreachable_visit_mut_type!(visit_mut_ts_type, TsType);
        unreachable_visit_mut_type!(visit_mut_ts_type_alias_decl, TsTypeAliasDecl);
        unreachable_visit_mut_type!(visit_mut_ts_type_ann, TsTypeAnn);
        unreachable_visit_mut_type!(visit_mut_ts_type_element, TsTypeElement);
        unreachable_visit_mut_type!(visit_mut_ts_type_lit, TsTypeLit);
        unreachable_visit_mut_type!(visit_mut_ts_type_operator, TsTypeOperator);
        unreachable_visit_mut_type!(visit_mut_ts_type_operator_op, TsTypeOperatorOp);
        unreachable_visit_mut_type!(visit_mut_ts_type_param, TsTypeParam);
        unreachable_visit_mut_type!(visit_mut_ts_type_param_decl, TsTypeParamDecl);
        unreachable_visit_mut_type!(
            visit_mut_ts_type_param_instantiation,
            TsTypeParamInstantiation
        );
        unreachable_visit_mut_type!(visit_mut_ts_type_predicate, TsTypePredicate);
        unreachable_visit_mut_type!(visit_mut_ts_type_query, TsTypeQuery);
        unreachable_visit_mut_type!(visit_mut_ts_type_query_expr, TsTypeQueryExpr);
        unreachable_visit_mut_type!(visit_mut_ts_type_ref, TsTypeRef);
        unreachable_visit_mut_type!(
            visit_mut_ts_union_or_intersection_type,
            TsUnionOrIntersectionType
        );
        unreachable_visit_mut_type!(visit_mut_ts_union_type, TsUnionType);
    };
}

#[macro_export]
macro_rules! type_to_none {
    ($name:ident, $T:ty) => {
        fn $name(&mut self, node: &mut Option<$T>) {
            *node = None;
        }
    };
}