Skip to content

Commit 2c8c0de

Browse files
author
Jonathan Turner
authored
Rollup merge of rust-lang#36974 - MathieuBordere:mb/36812_ICHFunctionInterfaces, r=michaelwoerister
Mb/36812 ich function interfaces r? @michaelwoerister This PR contains fixes for rust-lang#36812 and rust-lang#36914
2 parents 9ceef4e + 0e40dbb commit 2c8c0de

File tree

2 files changed

+546
-16
lines changed

2 files changed

+546
-16
lines changed

src/librustc_incremental/calculate_svh/svh_visitor.rs

+146-16
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515

1616
use self::SawExprComponent::*;
1717
use self::SawAbiComponent::*;
18+
use self::SawItemComponent::*;
19+
use self::SawPatComponent::*;
20+
use self::SawTyComponent::*;
21+
use self::SawTraitOrImplItemComponent::*;
22+
use syntax::abi::Abi;
1823
use syntax::ast::{self, Name, NodeId};
1924
use syntax::parse::token;
2025
use syntax_pos::{Span, NO_EXPANSION, COMMAND_LINE_EXPN, BytePos};
@@ -155,19 +160,19 @@ enum SawAbiComponent<'a> {
155160

156161
SawMod,
157162
SawForeignItem,
158-
SawItem,
159-
SawTy,
163+
SawItem(SawItemComponent),
164+
SawTy(SawTyComponent),
160165
SawGenerics,
161-
SawTraitItem,
162-
SawImplItem,
166+
SawTraitItem(SawTraitOrImplItemComponent),
167+
SawImplItem(SawTraitOrImplItemComponent),
163168
SawStructField,
164169
SawVariant,
165170
SawPath(bool),
166171
SawPathSegment,
167172
SawPathParameters,
168173
SawPathListItem,
169174
SawBlock,
170-
SawPat,
175+
SawPat(SawPatComponent),
171176
SawLocal,
172177
SawArm,
173178
SawExpr(SawExprComponent<'a>),
@@ -198,6 +203,9 @@ enum SawAbiComponent<'a> {
198203
/// because the SVH is just a developer convenience; there is no
199204
/// guarantee of collision-freedom, hash collisions are just
200205
/// (hopefully) unlikely.)
206+
///
207+
/// The xxxComponent enums and saw_xxx functions for Item, Pat,
208+
/// Ty, TraitItem and ImplItem follow the same methodology.
201209
#[derive(Hash)]
202210
enum SawExprComponent<'a> {
203211

@@ -267,6 +275,134 @@ fn saw_expr<'a>(node: &'a Expr_) -> SawExprComponent<'a> {
267275
}
268276
}
269277

278+
#[derive(Hash)]
279+
enum SawItemComponent {
280+
SawItemExternCrate,
281+
SawItemUse,
282+
SawItemStatic(Mutability),
283+
SawItemConst,
284+
SawItemFn(Unsafety, Constness, Abi),
285+
SawItemMod,
286+
SawItemForeignMod,
287+
SawItemTy,
288+
SawItemEnum,
289+
SawItemStruct,
290+
SawItemUnion,
291+
SawItemTrait(Unsafety),
292+
SawItemDefaultImpl(Unsafety),
293+
SawItemImpl(Unsafety, ImplPolarity)
294+
}
295+
296+
fn saw_item(node: &Item_) -> SawItemComponent {
297+
match *node {
298+
ItemExternCrate(..) => SawItemExternCrate,
299+
ItemUse(..) => SawItemUse,
300+
ItemStatic(_, mutability, _) => SawItemStatic(mutability),
301+
ItemConst(..) =>SawItemConst,
302+
ItemFn(_, unsafety, constness, abi, _, _) => SawItemFn(unsafety, constness, abi),
303+
ItemMod(..) => SawItemMod,
304+
ItemForeignMod(..) => SawItemForeignMod,
305+
ItemTy(..) => SawItemTy,
306+
ItemEnum(..) => SawItemEnum,
307+
ItemStruct(..) => SawItemStruct,
308+
ItemUnion(..) => SawItemUnion,
309+
ItemTrait(unsafety, ..) => SawItemTrait(unsafety),
310+
ItemDefaultImpl(unsafety, _) => SawItemDefaultImpl(unsafety),
311+
ItemImpl(unsafety, implpolarity, ..) => SawItemImpl(unsafety, implpolarity)
312+
}
313+
}
314+
315+
#[derive(Hash)]
316+
enum SawPatComponent {
317+
SawPatWild,
318+
SawPatBinding(BindingMode),
319+
SawPatStruct,
320+
SawPatTupleStruct,
321+
SawPatPath,
322+
SawPatTuple,
323+
SawPatBox,
324+
SawPatRef(Mutability),
325+
SawPatLit,
326+
SawPatRange,
327+
SawPatSlice
328+
}
329+
330+
fn saw_pat(node: &PatKind) -> SawPatComponent {
331+
match *node {
332+
PatKind::Wild => SawPatWild,
333+
PatKind::Binding(bindingmode, ..) => SawPatBinding(bindingmode),
334+
PatKind::Struct(..) => SawPatStruct,
335+
PatKind::TupleStruct(..) => SawPatTupleStruct,
336+
PatKind::Path(..) => SawPatPath,
337+
PatKind::Tuple(..) => SawPatTuple,
338+
PatKind::Box(..) => SawPatBox,
339+
PatKind::Ref(_, mutability) => SawPatRef(mutability),
340+
PatKind::Lit(..) => SawPatLit,
341+
PatKind::Range(..) => SawPatRange,
342+
PatKind::Slice(..) => SawPatSlice
343+
}
344+
}
345+
346+
#[derive(Hash)]
347+
enum SawTyComponent {
348+
SawTySlice,
349+
SawTyArray,
350+
SawTyPtr(Mutability),
351+
SawTyRptr(Mutability),
352+
SawTyBareFn(Unsafety, Abi),
353+
SawTyNever,
354+
SawTyTup,
355+
SawTyPath,
356+
SawTyObjectSum,
357+
SawTyPolyTraitRef,
358+
SawTyImplTrait,
359+
SawTyTypeof,
360+
SawTyInfer
361+
}
362+
363+
fn saw_ty(node: &Ty_) -> SawTyComponent {
364+
match *node {
365+
TySlice(..) => SawTySlice,
366+
TyArray(..) => SawTyArray,
367+
TyPtr(ref mty) => SawTyPtr(mty.mutbl),
368+
TyRptr(_, ref mty) => SawTyRptr(mty.mutbl),
369+
TyBareFn(ref barefnty) => SawTyBareFn(barefnty.unsafety, barefnty.abi),
370+
TyNever => SawTyNever,
371+
TyTup(..) => SawTyTup,
372+
TyPath(..) => SawTyPath,
373+
TyObjectSum(..) => SawTyObjectSum,
374+
TyPolyTraitRef(..) => SawTyPolyTraitRef,
375+
TyImplTrait(..) => SawTyImplTrait,
376+
TyTypeof(..) => SawTyTypeof,
377+
TyInfer => SawTyInfer
378+
}
379+
}
380+
381+
#[derive(Hash)]
382+
enum SawTraitOrImplItemComponent {
383+
SawTraitOrImplItemConst,
384+
SawTraitOrImplItemMethod(Unsafety, Constness, Abi),
385+
SawTraitOrImplItemType
386+
}
387+
388+
fn saw_trait_item(ti: &TraitItem_) -> SawTraitOrImplItemComponent {
389+
match *ti {
390+
ConstTraitItem(..) => SawTraitOrImplItemConst,
391+
MethodTraitItem(ref sig, _) =>
392+
SawTraitOrImplItemMethod(sig.unsafety, sig.constness, sig.abi),
393+
TypeTraitItem(..) => SawTraitOrImplItemType
394+
}
395+
}
396+
397+
fn saw_impl_item(ii: &ImplItemKind) -> SawTraitOrImplItemComponent {
398+
match *ii {
399+
ImplItemKind::Const(..) => SawTraitOrImplItemConst,
400+
ImplItemKind::Method(ref sig, _) =>
401+
SawTraitOrImplItemMethod(sig.unsafety, sig.constness, sig.abi),
402+
ImplItemKind::Type(..) => SawTraitOrImplItemType
403+
}
404+
}
405+
270406
#[derive(Clone, Copy, Hash, Eq, PartialEq)]
271407
enum SawSpanExpnKind {
272408
NoExpansion,
@@ -383,10 +519,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
383519

384520
fn visit_item(&mut self, i: &'tcx Item) {
385521
debug!("visit_item: {:?} st={:?}", i, self.st);
386-
387-
SawItem.hash(self.st);
388-
// Hash the value of the discriminant of the Item variant.
389-
self.hash_discriminant(&i.node);
522+
SawItem(saw_item(&i.node)).hash(self.st);
390523
hash_span!(self, i.span);
391524
hash_attrs!(self, &i.attrs);
392525
visit::walk_item(self, i)
@@ -399,7 +532,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
399532

400533
fn visit_ty(&mut self, t: &'tcx Ty) {
401534
debug!("visit_ty: st={:?}", self.st);
402-
SawTy.hash(self.st);
535+
SawTy(saw_ty(&t.node)).hash(self.st);
403536
hash_span!(self, t.span);
404537
visit::walk_ty(self, t)
405538
}
@@ -412,17 +545,15 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
412545

413546
fn visit_trait_item(&mut self, ti: &'tcx TraitItem) {
414547
debug!("visit_trait_item: st={:?}", self.st);
415-
SawTraitItem.hash(self.st);
416-
self.hash_discriminant(&ti.node);
548+
SawTraitItem(saw_trait_item(&ti.node)).hash(self.st);
417549
hash_span!(self, ti.span);
418550
hash_attrs!(self, &ti.attrs);
419551
visit::walk_trait_item(self, ti)
420552
}
421553

422554
fn visit_impl_item(&mut self, ii: &'tcx ImplItem) {
423555
debug!("visit_impl_item: st={:?}", self.st);
424-
SawImplItem.hash(self.st);
425-
self.hash_discriminant(&ii.node);
556+
SawImplItem(saw_impl_item(&ii.node)).hash(self.st);
426557
hash_span!(self, ii.span);
427558
hash_attrs!(self, &ii.attrs);
428559
visit::walk_impl_item(self, ii)
@@ -452,8 +583,7 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has
452583

453584
fn visit_pat(&mut self, p: &'tcx Pat) {
454585
debug!("visit_pat: st={:?}", self.st);
455-
SawPat.hash(self.st);
456-
self.hash_discriminant(&p.node);
586+
SawPat(saw_pat(&p.node)).hash(self.st);
457587
hash_span!(self, p.span);
458588
visit::walk_pat(self, p)
459589
}

0 commit comments

Comments
 (0)