Rollup merge of #3851 - phansch:refactor_trait_stuff, r=flip1995
Refactor: Extract `trait_ref_of_method` function This pattern was used in three places after #3844, so I think it's worth moving it into `utils/mod.rs` and documenting it.
This commit is contained in:
@@ -301,6 +301,33 @@ pub fn implements_trait<'a, 'tcx>(
|
||||
.enter(|infcx| infcx.predicate_must_hold_modulo_regions(&obligation))
|
||||
}
|
||||
|
||||
/// Get the `hir::TraitRef` of the trait the given method is implemented for
|
||||
///
|
||||
/// Use this if you want to find the `TraitRef` of the `Add` trait in this example:
|
||||
///
|
||||
/// ```rust
|
||||
/// struct Point(isize, isize);
|
||||
///
|
||||
/// impl std::ops::Add for Point {
|
||||
/// type Output = Self;
|
||||
///
|
||||
/// fn add(self, other: Self) -> Self {
|
||||
/// Point(0, 0)
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
pub fn trait_ref_of_method(cx: &LateContext<'_, '_>, hir_id: HirId) -> Option<TraitRef> {
|
||||
// Get the implemented trait for the current function
|
||||
let parent_impl = cx.tcx.hir().get_parent_item(hir_id);
|
||||
if_chain! {
|
||||
if parent_impl != hir::CRATE_HIR_ID;
|
||||
if let hir::Node::Item(item) = cx.tcx.hir().get_by_hir_id(parent_impl);
|
||||
if let hir::ItemKind::Impl(_, _, _, _, trait_ref, _, _) = &item.node;
|
||||
then { return trait_ref.clone(); }
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
/// Check whether this type implements Drop.
|
||||
pub fn has_drop<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: Ty<'tcx>) -> bool {
|
||||
match ty.ty_adt_def() {
|
||||
|
||||
Reference in New Issue
Block a user