gpt4 book ai didi

rust - 如何在给定类型和名称的情况下在编译器中查找方法?

转载 作者:行者123 更新时间:2023-11-29 07:44:50 27 4
gpt4 key购买 nike

我有一个 lint 在 x.len() == 0 上发出警告,建议改用 x.is_empty()。但是,如果 x 没有 is_empty(self: &Self) 方法,我想消除误报。

因此开始了从 rustc 中查找方法的探索。

第一步,获取x:我将Exprnode匹配到ExprMethodCall(ref method, _, ref args)(并确保 args.len() == 1method.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_itemsctxt.trait_item_def_ids 看起来很有前途,所以我得到了我的类型的 DefId rustc::middle::ty::ty::ty_to_def_id(ty) 并尝试获取 ID。但是,这种方法存在一些问题:

为了

let x = [1, 2];
x.len() == 2 // <- lookee here

我根本没有 DefId。不过没关系,因为在那种情况下我们有一个 ty_vec,而 std::vec::Vec 已知有两个 len()is_empty()

好消息是 ctxt.trait_item_def_ids 有一个适合带有 is_empty 方法的特征条目。 las,对于以下示例:

struct One;
impl One { fn is_empty(self: &Self) -> bool { false } }

我没有得到任何 impl 项的 TraitOrItemId,这有点不幸。有人知道 rustc 可以帮我找到我的 impl 项目吗?

最佳答案

我明白了!问题是我试图为 type 获取 DefId,而不是为 impl .通过cx.tcx.inherent_impls.get(id)给了我 DefId 的 vec s 代表固有的暗示,然后我可以通过 impl_items 查询它查找我已经实现了。

rust-clippy/src/len_zero.rs中查找一个例子实现。编辑:请注意,实现是 O(N),其中 N 是该类型方法的数量(直接 impl 或通过特征)——也许有一天 rustc 会允许更快的查找...

关于rust - 如何在给定类型和名称的情况下在编译器中查找方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30569766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com