Skip to content

Commit

Permalink
Rollup merge of rust-lang#59779 - flip1995:uplift_get_def_path, r=Man…
Browse files Browse the repository at this point in the history
…ishearth

Uplift `get_def_path` from Clippy

cc rust-lang/rust-clippy#3926
cc rust-lang#59738

This uplifts `get_def_path` from Clippy. This is a follow up on the
implementation of internal lints: rust-lang#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.

r? @Manishearth
  • Loading branch information
sanxiyn authored Apr 11, 2019
2 parents 4afd711 + a2d4e85 commit d7fe9cf
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
35 changes: 30 additions & 5 deletions src/librustc/lint/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
}
Expand Down Expand Up @@ -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()
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc/lint/internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"]);
}
}
}
Expand Down

0 comments on commit d7fe9cf

Please sign in to comment.