From a2d4e85d06bdefb5ab8396dcf6782dca58c06ec7 Mon Sep 17 00:00:00 2001 From: flip1995 Date: Sun, 7 Apr 2019 19:47:54 +0200 Subject: [PATCH] Uplift `get_def_path` from Clippy This uplifts `get_def_path` from Clippy. This is a follow up on the implementation of internal lints: #59316 The internal lint implementation also copied the implementation of the `AbsolutePathPrinter`. To get rid of this code duplication this also uplifts the `get_def_path` function from Clippy. This also renames `match_path` to `match_def_path`, as it was originally named in Clippy. --- src/librustc/lint/context.rs | 35 ++++++++++++++++++++++++++++++----- src/librustc/lint/internal.rs | 2 +- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index 15ea6403e38ba..2aca195aee058 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -755,8 +755,31 @@ impl<'a, 'tcx> LateContext<'a, 'tcx> { } /// Check if a `DefId`'s path matches the given absolute type path usage. + /// + /// # Examples + /// ```rust,ignore (no cx or def_id available) + /// if cx.match_def_path(def_id, &["core", "option", "Option"]) { + /// // The given `def_id` is that of an `Option` type + /// } + /// ``` // Uplifted from rust-lang/rust-clippy - pub fn match_path(&self, def_id: DefId, path: &[&str]) -> bool { + pub fn match_def_path(&self, def_id: DefId, path: &[&str]) -> bool { + let names = self.get_def_path(def_id); + + names.len() == path.len() && names.into_iter().zip(path.iter()).all(|(a, &b)| *a == *b) + } + + /// Gets the absolute path of `def_id` as a vector of `&str`. + /// + /// # Examples + /// ```rust,ignore (no cx or def_id available) + /// let def_path = cx.get_def_path(def_id); + /// if let &["core", "option", "Option"] = &def_path[..] { + /// // The given `def_id` is that of an `Option` type + /// } + /// ``` + // Uplifted from rust-lang/rust-clippy + pub fn get_def_path(&self, def_id: DefId) -> Vec<&'static str> { pub struct AbsolutePathPrinter<'a, 'tcx> { pub tcx: TyCtxt<'a, 'tcx, 'tcx>, } @@ -856,10 +879,12 @@ impl<'a, 'tcx> LateContext<'a, 'tcx> { } } - let names = AbsolutePathPrinter { tcx: self.tcx }.print_def_path(def_id, &[]).unwrap(); - - names.len() == path.len() - && names.into_iter().zip(path.iter()).all(|(a, &b)| *a == *b) + AbsolutePathPrinter { tcx: self.tcx } + .print_def_path(def_id, &[]) + .unwrap() + .iter() + .map(LocalInternedString::get) + .collect() } } diff --git a/src/librustc/lint/internal.rs b/src/librustc/lint/internal.rs index 0bafa93011ec4..91f1bee26de32 100644 --- a/src/librustc/lint/internal.rs +++ b/src/librustc/lint/internal.rs @@ -100,7 +100,7 @@ fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment) -> bool { if segment.ident.as_str() == "TyKind" { if let Some(def) = segment.def { if let Some(did) = def.opt_def_id() { - return cx.match_path(did, &["rustc", "ty", "sty", "TyKind"]); + return cx.match_def_path(did, &["rustc", "ty", "sty", "TyKind"]); } } }