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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
use ra_ap_hir;
use ra_ap_ide_db::RootDatabase;
use ra_ap_syntax::{
    ast::{self, AstNode},
    SyntaxKind, SyntaxNode,
};

pub(crate) const INTERNAL_ERR: &'static str =
    "Internal error message. Please create an issue on https://github.com/pksunkara/cargo-up";

pub use ra_ap_syntax;

pub type Semantics<'db> = ra_ap_hir::Semantics<'db, RootDatabase>;

macro_rules! visitor {
    () => {};
    ($($kind:ident => $method:ident as $node:ident,)*) => {
        pub trait Visitor {
            fn visit(&mut self, node: &SyntaxNode, semantics: &Semantics) {
                match node.kind() {
                    $(SyntaxKind::$kind => self.$method(
                        &ast::$node::cast(node.clone()).expect(INTERNAL_ERR),
                        &semantics,
                    ),)*
                    _ => {},
                }

                for child in node.children() {
                    self.visit(&child, &semantics);
                }
            }
            $(fn $method(&mut self, _: &ast::$node, _semantics: &Semantics) {})*
        }
    };
}

visitor!(
    SOURCE_FILE => visit_source_file as SourceFile,
    STRUCT => visit_struct as Struct,
    UNION => visit_union as Union,
    ENUM => visit_enum as Enum,
    FN => visit_fn as Fn,
    RET_TYPE => visit_ret_type as RetType,
    EXTERN_CRATE => visit_extern_crate as ExternCrate,
    MODULE => visit_module as Module,
    USE => visit_use as Use,
    STATIC => visit_static as Static,
    CONST => visit_const as Const,
    TRAIT => visit_trait as Trait,
    IMPL => visit_impl as Impl,
    TYPE_ALIAS => visit_type_alias as TypeAlias,
    MACRO_CALL => visit_macro_call as MacroCall,
    TOKEN_TREE => visit_token_tree as TokenTree,
    PAREN_TYPE => visit_paren_type as ParenType,
    TUPLE_TYPE => visit_tuple_type as TupleType,
    NEVER_TYPE => visit_never_type as NeverType,
    PATH_TYPE => visit_path_type as PathType,
    PTR_TYPE => visit_ptr_type as PtrType,
    ARRAY_TYPE => visit_array_type as ArrayType,
    SLICE_TYPE => visit_slice_type as SliceType,
    REF_TYPE => visit_ref_type as RefType,
    INFER_TYPE => visit_infer_type as InferType,
    FN_PTR_TYPE => visit_fn_ptr_type as FnPtrType,
    FOR_TYPE => visit_for_type as ForType,
    IMPL_TRAIT_TYPE => visit_impl_trait_type as ImplTraitType,
    DYN_TRAIT_TYPE => visit_dyn_trait_type as DynTraitType,
    OR_PAT => visit_or_pat as OrPat,
    PAREN_PAT => visit_paren_pat as ParenPat,
    REF_PAT => visit_ref_pat as RefPat,
    BOX_PAT => visit_box_pat as BoxPat,
    IDENT_PAT => visit_ident_pat as IdentPat,
    WILDCARD_PAT => visit_wildcard_pat as WildcardPat,
    REST_PAT => visit_rest_pat as RestPat,
    PATH_PAT => visit_path_pat as PathPat,
    RECORD_PAT => visit_record_pat as RecordPat,
    RECORD_PAT_FIELD_LIST => visit_record_pat_field_list as RecordPatFieldList,
    RECORD_PAT_FIELD => visit_record_pat_field as RecordPatField,
    TUPLE_STRUCT_PAT => visit_tuple_struct_pat as TupleStructPat,
    TUPLE_PAT => visit_tuple_pat as TuplePat,
    SLICE_PAT => visit_slice_pat as SlicePat,
    RANGE_PAT => visit_range_pat as RangePat,
    LITERAL_PAT => visit_literal_pat as LiteralPat,
    MACRO_PAT => visit_macro_pat as MacroPat,
    TUPLE_EXPR => visit_tuple_expr as TupleExpr,
    ARRAY_EXPR => visit_array_expr as ArrayExpr,
    PAREN_EXPR => visit_paren_expr as ParenExpr,
    PATH_EXPR => visit_path_expr as PathExpr,
    CLOSURE_EXPR => visit_closure_expr as ClosureExpr,
    IF_EXPR => visit_if_expr as IfExpr,
    WHILE_EXPR => visit_while_expr as WhileExpr,
    CONDITION => visit_condition as Condition,
    LOOP_EXPR => visit_loop_expr as LoopExpr,
    FOR_EXPR => visit_for_expr as ForExpr,
    CONTINUE_EXPR => visit_continue_expr as ContinueExpr,
    BREAK_EXPR => visit_break_expr as BreakExpr,
    LABEL => visit_label as Label,
    BLOCK_EXPR => visit_block_expr as BlockExpr,
    RETURN_EXPR => visit_return_expr as ReturnExpr,
    MATCH_EXPR => visit_match_expr as MatchExpr,
    MATCH_ARM_LIST => visit_match_arm_list as MatchArmList,
    MATCH_ARM => visit_match_arm as MatchArm,
    MATCH_GUARD => visit_match_guard as MatchGuard,
    RECORD_EXPR => visit_record_expr as RecordExpr,
    RECORD_EXPR_FIELD_LIST => visit_record_expr_field_list as RecordExprFieldList,
    RECORD_EXPR_FIELD => visit_record_expr_field as RecordExprField,
    EFFECT_EXPR => visit_effect_expr as EffectExpr,
    BOX_EXPR => visit_box_expr as BoxExpr,
    CALL_EXPR => visit_call_expr as CallExpr,
    INDEX_EXPR => visit_index_expr as IndexExpr,
    METHOD_CALL_EXPR => visit_method_call_expr as MethodCallExpr,
    FIELD_EXPR => visit_field_expr as FieldExpr,
    AWAIT_EXPR => visit_await_expr as AwaitExpr,
    TRY_EXPR => visit_try_expr as TryExpr,
    CAST_EXPR => visit_cast_expr as CastExpr,
    REF_EXPR => visit_ref_expr as RefExpr,
    PREFIX_EXPR => visit_prefix_expr as PrefixExpr,
    RANGE_EXPR => visit_range_expr as RangeExpr,
    BIN_EXPR => visit_bin_expr as BinExpr,
    EXTERN_BLOCK => visit_extern_block as ExternBlock,
    EXTERN_ITEM_LIST => visit_extern_item_list as ExternItemList,
    VARIANT => visit_variant as Variant,
    RECORD_FIELD_LIST => visit_record_field_list as RecordFieldList,
    RECORD_FIELD => visit_record_field as RecordField,
    TUPLE_FIELD_LIST => visit_tuple_field_list as TupleFieldList,
    TUPLE_FIELD => visit_tuple_field as TupleField,
    VARIANT_LIST => visit_variant_list as VariantList,
    ITEM_LIST => visit_item_list as ItemList,
    ASSOC_ITEM_LIST => visit_assoc_item_list as AssocItemList,
    ATTR => visit_attr as Attr,
    USE_TREE => visit_use_tree as UseTree,
    USE_TREE_LIST => visit_use_tree_list as UseTreeList,
    PATH => visit_path as Path,
    PATH_SEGMENT => visit_path_segment as PathSegment,
    LITERAL => visit_literal as Literal,
    RENAME => visit_rename as Rename,
    VISIBILITY => visit_visibility as Visibility,
    WHERE_CLAUSE => visit_where_clause as WhereClause,
    WHERE_PRED => visit_where_pred as WherePred,
    ABI => visit_abi as Abi,
    NAME => visit_name as Name,
    NAME_REF => visit_name_ref as NameRef,
    LET_STMT => visit_let_stmt as LetStmt,
    EXPR_STMT => visit_expr_stmt as ExprStmt,
    GENERIC_PARAM_LIST => visit_generic_param_list as GenericParamList,
    GENERIC_PARAM => visit_generic_param as GenericParam,
    LIFETIME_PARAM => visit_lifetime_param as LifetimeParam,
    TYPE_PARAM => visit_type_param as TypeParam,
    CONST_PARAM => visit_const_param as ConstParam,
    GENERIC_ARG_LIST => visit_generic_arg_list as GenericArgList,
    LIFETIME_ARG => visit_lifetime_arg as LifetimeArg,
    TYPE_ARG => visit_type_arg as TypeArg,
    ASSOC_TYPE_ARG => visit_assoc_type_arg as AssocTypeArg,
    CONST_ARG => visit_const_arg as ConstArg,
    PARAM_LIST => visit_param_list as ParamList,
    PARAM => visit_param as Param,
    SELF_PARAM => visit_self_param as SelfParam,
    ARG_LIST => visit_arg_list as ArgList,
    TYPE_BOUND => visit_type_bound as TypeBound,
    TYPE_BOUND_LIST => visit_type_bound_list as TypeBoundList,
    MACRO_ITEMS => visit_macro_items as MacroItems,
    MACRO_STMTS => visit_macro_stmts as MacroStmts,
);