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

时间:2015-06-04 15:46:52

标签: plugins rust lint internals

为了在Rust中编写另一个lint,我需要确保Expr的类型实际上是Option<_>(或指向一个的任何指针)。我已经完成了任何ptrrptr的结论,并留下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 
}

然而,现在我有点迷失了 - 我怎么知道TyS是否实际上是一个选项&lt; _&gt;类型?

1 个答案:

答案 0 :(得分:2)

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

以下是草图,但如果稍微调整一下,应该会给你一个Name的数组。

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