Update common tool docs on type implement trait check

Common tool documentation uses `match_trait_method` which is deprecated.
Additionally, adds information on why `is_trait_method` is not the
preferred way.
This commit is contained in:
dswij 2021-08-18 12:40:59 +08:00
parent de80188c64
commit 86e92c0033

View file

@ -75,20 +75,21 @@ impl LateLintPass<'_> for MyStructLint {
# Checking if a type implements a specific trait # Checking if a type implements a specific trait
There are two ways to do this, depending if the target trait is part of lang items. There are three ways to do this, depending on if the target trait has a diagnostic item, lang item or neither.
```rust ```rust
use clippy_utils::{implements_trait, match_trait_method, paths}; use clippy_utils::{implements_trait, is_trait_method, match_trait_method};
use rustc_span::symbol::sym;
impl LateLintPass<'_> for MyStructLint { impl LateLintPass<'_> for MyStructLint {
fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) { fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
// 1. Using expression and Clippy's convenient method // 1. Using diagnostic items with the expression
// we use `match_trait_method` function from Clippy's toolbox // we use `is_trait_method` function from Clippy's utils
if match_trait_method(cx, expr, &paths::INTO) { if is_trait_method(cx, expr, sym::Iterator) {
// `expr` implements `Into` trait // method call in `expr` belongs to `Iterator` trait
} }
// 2. Using type context `TyCtxt` // 2. Using lang items with the expression type
let ty = cx.typeck_results().expr_ty(expr); let ty = cx.typeck_results().expr_ty(expr);
if cx.tcx.lang_items() if cx.tcx.lang_items()
// we are looking for the `DefId` of `Drop` trait in lang items // we are looking for the `DefId` of `Drop` trait in lang items
@ -97,15 +98,20 @@ impl LateLintPass<'_> for MyStructLint {
.map_or(false, |id| implements_trait(cx, ty, id, &[])) { .map_or(false, |id| implements_trait(cx, ty, id, &[])) {
// `expr` implements `Drop` trait // `expr` implements `Drop` trait
} }
// 3. Using the type path with the expression
// we use `match_trait_method` function from Clippy's utils
if match_trait_method(cx, expr, &paths::INTO) {
// `expr` implements `Into` trait
}
} }
} }
``` ```
> Prefer using lang items, if the target trait is available there. > Prefer using diagnostic and lang items, if the target trait has one.
A list of defined paths for Clippy can be found in [paths.rs][paths]
We access lang items through the type context `tcx`. `tcx` is of type [`TyCtxt`][TyCtxt] and is defined in the `rustc_middle` crate. We access lang items through the type context `tcx`. `tcx` is of type [`TyCtxt`][TyCtxt] and is defined in the `rustc_middle` crate.
A list of defined paths for Clippy can be found in [paths.rs][paths]
# Checking if a type defines a specific method # Checking if a type defines a specific method