我有一个发出警告的棉绒x.len() == 0
,建议x.is_empty()
改用.但是,如果x
没有is_empty(self: &Self)
方法,我想摆脱误报.
因此开始寻求从rustc内部查找方法.
第一步,让x
我匹配node
的Expr
,以ExprMethodCall(ref method, _, ref args)
(和确信,args.len() == 1
和method.node.as_str() == "len"
),只是用&*args[0]
,我会请expr
从现在开始.
下一步,获取类型x
:这可以很容易地使用rustc::middle::ty::expr_ty(cx.tcx, expr)
.请注意,这是一个rustc::middle::ty::Ty
(而不是一个syntax::ast::Ty
,这导致一些混乱).
要查找的方法中,ctxt.impl_items
和ctxt.trait_item_def_ids
看起来前途无量,所以我得到DefId
了我喜欢的类型与rustc::middle::ty::ty::ty_to_def_id(ty)
和尝试得到的ID.但是,这种方法存在一些问题:
对于
let x = [1, 2];
x.len() == 2 // <- lookee here
Run Code Online (Sandbox Code Playgroud)
我根本就没有DefId.这是可以的,因为ty_vec
在这种情况下我们有一个,并且std::vec::Vec
已知有两个len()
和is_empty()
.
好消息是,对于ctxt.trait_item_def_ids
具有is_empty
方法的特征,它具有合适的条目.唉,对于以下示例:
struct One;
impl One { fn is_empty(self: &Self) -> bool { false } }
Run Code Online (Sandbox Code Playgroud)
我没有TraitOrItemId
任何impl项目,这有点不幸.有人可以帮我找到我的impl物品吗?
我得到了它!问题是我试图获取类型的 DefId ,而不是impl
. 通过查看,cx.tcx.inherent_impls.get(id)
我得到了一个DefId
s 的 vec 来表示固有的实现,然后我可以通过impl_items
我已经实现的查找来查询它。
查看rust-clippy/src/len_zero.rs 的示例实现。编辑:请注意,实现是O(N),其中N是该类型的方法数量(直接impl
或通过特征) \xe2\x80\x93 也许 rustc 有一天会允许更快的查找......
归档时间: |
|
查看次数: |
97 次 |
最近记录: |