我有一个在x.len() == 0
发出警告的lint,建议改为使用x.is_empty()
。但是,如果x
没有is_empty(self: &Self)
方法,我想摆脱误报。
因此开始寻求从rustc中查找方法。
第一步,获取x
:我将node
的{{1}}与Expr
相匹配(并确保ExprMethodCall(ref method, _, ref args)
和{{1} })并且刚刚使用了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
并尝试获取ID。但是,这种方法存在一些问题:
有关
DefId
我根本就没有DefId。这没关系,因为在这种情况下我们有一个rustc::middle::ty::ty::ty_to_def_id(ty)
,并且已知let x = [1, 2];
x.len() == 2 // <- lookee here
同时拥有ty_vec
和std::vec::Vec
。
好消息是len()
具有is_empty()
方法的特征的合适条目。唉,对于以下示例:
ctxt.trait_item_def_ids
我没有is_empty
任何impl项目,这有点不幸。有人可以帮我找到我的impl项吗?
答案 0 :(得分:4)
我明白了!问题是我试图为类型获取一个DefId,而不是impl
。通过cx.tcx.inherent_impls.get(id)
给了我一个DefId
s的内在impl的vec,然后我可以通过我已经实现的impl_items
查询来查询。
查看rust-clippy/src/len_zero.rs中的示例实现。编辑:请注意,实现是 O(N),其中 N 是该类型的方法数(直接impl
或特征) - 也许是rustc总有一天会有更快的查询...