如何根据类型和名称在编译器中查找方法?

时间:2015-06-01 09:17:12

标签: rust lint

我有一个在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::Tysyntax::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_vecstd::vec::Vec

好消息是len() 具有is_empty()方法的特征的合适条目。唉,对于以下示例:

ctxt.trait_item_def_ids

我没有is_empty任何impl项目,这有点不幸。有人可以帮我找到我的impl项吗?

1 个答案:

答案 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总有一天会有更快的查询...