如何找出rustc :: middle :: ty :: Ty代表什么类型?

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 <_>类型?

Man*_*rth 2

您需要使用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)