From ef18ece564e69a77095bf7ac00f5b9f71f2149af Mon Sep 17 00:00:00 2001 From: flip1995 Date: Tue, 22 Oct 2019 11:17:16 +0200 Subject: [PATCH 1/2] Don't hash spans in SpanlessHasher --- clippy_lints/src/utils/hir_utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index 0e8fcf8fd0fc..d7bcc589a46e 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -411,7 +411,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { self.hash_expr(r); }, ExprKind::AssignOp(ref o, ref l, ref r) => { - o.hash(&mut self.s); + o.node.hash(&mut self.s); self.hash_expr(l); self.hash_expr(r); }, @@ -460,7 +460,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { }, ExprKind::InlineAsm(..) | ExprKind::Err => {}, ExprKind::Lit(ref l) => { - l.hash(&mut self.s); + l.node.hash(&mut self.s); }, ExprKind::Loop(ref b, ref i, _) => { self.hash_block(b); From e8d5a9e95c145a3a9be89c582d8a6f88d4ea7037 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Tue, 22 Oct 2019 11:18:18 +0200 Subject: [PATCH 2/2] Use StableHasher in SpanlessHasher --- clippy_lints/src/utils/hir_utils.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/clippy_lints/src/utils/hir_utils.rs b/clippy_lints/src/utils/hir_utils.rs index d7bcc589a46e..d8b20a5df615 100644 --- a/clippy_lints/src/utils/hir_utils.rs +++ b/clippy_lints/src/utils/hir_utils.rs @@ -2,10 +2,11 @@ use crate::consts::{constant_context, constant_simple}; use crate::utils::differing_macro_contexts; use rustc::hir::ptr::P; use rustc::hir::*; +use rustc::ich::StableHashingContextProvider; use rustc::lint::LateContext; use rustc::ty::TypeckTables; -use std::collections::hash_map::DefaultHasher; -use std::hash::{Hash, Hasher}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use std::hash::Hash; use syntax::ast::Name; /// Type used to check whether two ast are the same. This is different from the @@ -348,7 +349,7 @@ pub struct SpanlessHash<'a, 'tcx> { /// Context used to evaluate constant expressions. cx: &'a LateContext<'a, 'tcx>, tables: &'a TypeckTables<'tcx>, - s: DefaultHasher, + s: StableHasher, } impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { @@ -356,11 +357,11 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { Self { cx, tables, - s: DefaultHasher::new(), + s: StableHasher::new(), } } - pub fn finish(&self) -> u64 { + pub fn finish(self) -> u64 { self.s.finish() } @@ -411,7 +412,8 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { self.hash_expr(r); }, ExprKind::AssignOp(ref o, ref l, ref r) => { - o.node.hash(&mut self.s); + o.node + .hash_stable(&mut self.cx.tcx.get_stable_hashing_context(), &mut self.s); self.hash_expr(l); self.hash_expr(r); }, @@ -419,7 +421,8 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { self.hash_block(b); }, ExprKind::Binary(op, ref l, ref r) => { - op.node.hash(&mut self.s); + op.node + .hash_stable(&mut self.cx.tcx.get_stable_hashing_context(), &mut self.s); self.hash_expr(l); self.hash_expr(r); }, @@ -519,7 +522,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> { self.hash_exprs(v); }, ExprKind::Unary(lop, ref le) => { - lop.hash(&mut self.s); + lop.hash_stable(&mut self.cx.tcx.get_stable_hashing_context(), &mut self.s); self.hash_expr(le); }, }