mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 21:23:56 +00:00
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:
parent
de80188c64
commit
86e92c0033
1 changed files with 16 additions and 10 deletions
|
@ -75,20 +75,21 @@ impl LateLintPass<'_> for MyStructLint {
|
|||
|
||||
# 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
|
||||
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 {
|
||||
fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
|
||||
// 1. Using expression and Clippy's convenient method
|
||||
// we use `match_trait_method` function from Clippy's toolbox
|
||||
if match_trait_method(cx, expr, &paths::INTO) {
|
||||
// `expr` implements `Into` trait
|
||||
// 1. Using diagnostic items with the expression
|
||||
// we use `is_trait_method` function from Clippy's utils
|
||||
if is_trait_method(cx, expr, sym::Iterator) {
|
||||
// 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);
|
||||
if cx.tcx.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, &[])) {
|
||||
// `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.
|
||||
|
||||
A list of defined paths for Clippy can be found in [paths.rs][paths]
|
||||
> Prefer using diagnostic and lang items, if the target trait has one.
|
||||
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in a new issue