llo*_*giq 6 plugins lint internals rust
为了在Rust中编写另一个lint,我需要确保Expr的类型实际上是一个Option<_>(或任何一个指针).我已经完成了任何ptrs和rptrs的结论,并rustc::middle::ty在我的测试用例调试中留下了一个(手动格式化以获得更好的可读性):
TyS {
sty: ty_enum(
DefId {
krate: 2,
node: 117199
},
Substs {
types: VecPerParamSpace {
TypeSpace: [
TyS {
sty: ty_int(i32),
flags: 0,
region_depth: 0
}
],
SelfSpace: [],
FnSpace: [],
},
regions: NonerasedRegions(
VecPerParamSpace {
TypeSpace: [],
SelfSpace: [],
FnSpace: [],
}
)
}
),
flags: 0,
region_depth: 0
}
Run Code Online (Sandbox Code Playgroud)
但是,现在我有点迷失了 - 我怎么知道TyS是否实际上是一个Option <_>类型?
您需要使用with_pathDefId。您将获得一个PathElem必须使用的 s 迭代器。
下面是一个粗略的草图,但Name如果你稍微调整一下,应该会给你一个 s 数组。
if let ty_enum(did, ..) = ty.sty {
tcx.with_path(did, |iter| iter.map(|elem| elem.name())).collect::<Vec<Name>>;
}
Run Code Online (Sandbox Code Playgroud)