Plugins 如何找出rustc::middle::ty::ty所代表的类型?

Plugins 如何找出rustc::middle::ty::ty所代表的类型?,plugins,rust,lint,internals,Plugins,Rust,Lint,Internals,为了在Rust中写入另一个lint,我需要确保Expr的类型实际上是一个选项(或任何指向该选项的指针)。我已经对任何ptrs和rptrs进行了总结,留下了一个rustc::middle::ty,在我的测试用例中调试到(手动格式化以提高可读性): 然而,现在我有点不知所措了——如何确定TyS是否是一种选项类型?您需要在DefId上使用。将为您提供一个必须使用的迭代器 下面是一个粗略的草图,但是如果稍微调整一下,应该会给出一个Names数组 if let ty_enum(did, ..) = ty.

为了在Rust中写入另一个lint,我需要确保Expr的类型实际上是一个
选项
(或任何指向该选项的指针)。我已经对任何
ptr
s和
rptr
s进行了总结,留下了一个
rustc::middle::ty
,在我的测试用例中调试到(手动格式化以提高可读性):

然而,现在我有点不知所措了——如何确定TyS是否是一种选项类型?

您需要在DefId上使用。将为您提供一个必须使用的迭代器

下面是一个粗略的草图,但是如果稍微调整一下,应该会给出一个
Name
s数组

if let ty_enum(did, ..) = ty.sty {
  tcx.with_path(did, |iter| iter.map(|elem| elem.name())).collect::<Vec<Name>>;
}
如果让ty_enum(did,…)=ty.sty{
tcx.with_path(did,| iter | iter.map(| elem | elem.name()).collect:;
}

很酷。我甚至能够用一片
&str
s对
Name
s的
iter
进行
.zip
比较,而无需先构建Vec。
if let ty_enum(did, ..) = ty.sty {
  tcx.with_path(did, |iter| iter.map(|elem| elem.name())).collect::<Vec<Name>>;
}