|
11 | 11 |
|
12 | 12 | use rustc_arena::DroplessArena;
|
13 | 13 | use rustc_hir as hir;
|
14 |
| -use rustc_hir::itemlikevisit::ItemLikeVisitor; |
| 14 | +use rustc_hir::def::DefKind; |
15 | 15 | use rustc_hir::HirIdMap;
|
16 | 16 | use rustc_middle::ty::{self, TyCtxt};
|
17 | 17 | use std::fmt;
|
@@ -79,7 +79,29 @@ pub fn determine_parameters_to_be_inferred<'a, 'tcx>(
|
79 | 79 | //
|
80 | 80 | // - https://rustc-dev-guide.rust-lang.org/query.html
|
81 | 81 | // - https://rustc-dev-guide.rust-lang.org/variance.html
|
82 |
| - tcx.hir().visit_all_item_likes(&mut terms_cx); |
| 82 | + let crate_items = tcx.hir_crate_items(()); |
| 83 | + |
| 84 | + for id in crate_items.items() { |
| 85 | + terms_cx.check_item(id); |
| 86 | + } |
| 87 | + |
| 88 | + for id in crate_items.trait_items() { |
| 89 | + if let DefKind::AssocFn = tcx.hir().def_kind(id.def_id) { |
| 90 | + terms_cx.add_inferreds_for_item(id.hir_id()); |
| 91 | + } |
| 92 | + } |
| 93 | + |
| 94 | + for id in crate_items.impl_items() { |
| 95 | + if let DefKind::AssocFn = tcx.hir().def_kind(id.def_id) { |
| 96 | + terms_cx.add_inferreds_for_item(id.hir_id()); |
| 97 | + } |
| 98 | + } |
| 99 | + |
| 100 | + for id in crate_items.foreign_items() { |
| 101 | + if let DefKind::Fn = tcx.hir().def_kind(id.def_id) { |
| 102 | + terms_cx.add_inferreds_for_item(id.hir_id()); |
| 103 | + } |
| 104 | + } |
83 | 105 |
|
84 | 106 | terms_cx
|
85 | 107 | }
|
@@ -124,54 +146,43 @@ impl<'a, 'tcx> TermsContext<'a, 'tcx> {
|
124 | 146 | (start..(start + count)).map(|i| &*arena.alloc(InferredTerm(InferredIndex(i)))),
|
125 | 147 | );
|
126 | 148 | }
|
127 |
| -} |
128 | 149 |
|
129 |
| -impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> { |
130 |
| - fn visit_item(&mut self, item: &hir::Item<'_>) { |
131 |
| - debug!("add_inferreds for item {}", self.tcx.hir().node_to_string(item.hir_id())); |
| 150 | + fn check_item(&mut self, id: hir::ItemId) { |
| 151 | + debug!("add_inferreds for item {}", self.tcx.hir().node_to_string(id.hir_id())); |
| 152 | + |
| 153 | + let def_kind = self.tcx.hir().def_kind(id.def_id); |
| 154 | + match def_kind { |
| 155 | + DefKind::Struct | DefKind::Union => { |
| 156 | + let item = self.tcx.hir().item(id); |
132 | 157 |
|
133 |
| - match item.kind { |
134 |
| - hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { |
135 |
| - self.add_inferreds_for_item(item.hir_id()); |
| 158 | + if let hir::ItemKind::Struct(ref struct_def, _) |
| 159 | + | hir::ItemKind::Union(ref struct_def, _) = item.kind |
| 160 | + { |
| 161 | + self.add_inferreds_for_item(item.hir_id()); |
136 | 162 |
|
137 |
| - if let hir::VariantData::Tuple(..) = *struct_def { |
138 |
| - self.add_inferreds_for_item(struct_def.ctor_hir_id().unwrap()); |
| 163 | + if let hir::VariantData::Tuple(..) = *struct_def { |
| 164 | + self.add_inferreds_for_item(struct_def.ctor_hir_id().unwrap()); |
| 165 | + } |
139 | 166 | }
|
140 | 167 | }
|
| 168 | + DefKind::Enum => { |
| 169 | + let item = self.tcx.hir().item(id); |
141 | 170 |
|
142 |
| - hir::ItemKind::Enum(ref enum_def, _) => { |
143 |
| - self.add_inferreds_for_item(item.hir_id()); |
| 171 | + if let hir::ItemKind::Enum(ref enum_def, _) = item.kind { |
| 172 | + self.add_inferreds_for_item(item.hir_id()); |
144 | 173 |
|
145 |
| - for variant in enum_def.variants { |
146 |
| - if let hir::VariantData::Tuple(..) = variant.data { |
147 |
| - self.add_inferreds_for_item(variant.data.ctor_hir_id().unwrap()); |
| 174 | + for variant in enum_def.variants { |
| 175 | + if let hir::VariantData::Tuple(..) = variant.data { |
| 176 | + self.add_inferreds_for_item(variant.data.ctor_hir_id().unwrap()); |
| 177 | + } |
148 | 178 | }
|
149 | 179 | }
|
150 | 180 | }
|
151 |
| - |
152 |
| - hir::ItemKind::Fn(..) => { |
153 |
| - self.add_inferreds_for_item(item.hir_id()); |
| 181 | + DefKind::Fn => { |
| 182 | + self.add_inferreds_for_item(id.hir_id()); |
154 | 183 | }
|
155 |
| - |
156 | 184 | _ => {}
|
157 | 185 | }
|
158 | 186 | }
|
159 |
| - |
160 |
| - fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { |
161 |
| - if let hir::TraitItemKind::Fn(..) = trait_item.kind { |
162 |
| - self.add_inferreds_for_item(trait_item.hir_id()); |
163 |
| - } |
164 |
| - } |
165 |
| - |
166 |
| - fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { |
167 |
| - if let hir::ImplItemKind::Fn(..) = impl_item.kind { |
168 |
| - self.add_inferreds_for_item(impl_item.hir_id()); |
169 |
| - } |
170 |
| - } |
171 |
| - |
172 |
| - fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) { |
173 |
| - if let hir::ForeignItemKind::Fn(..) = foreign_item.kind { |
174 |
| - self.add_inferreds_for_item(foreign_item.hir_id()); |
175 |
| - } |
176 |
| - } |
177 | 187 | }
|
| 188 | + |
0 commit comments