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

How to find out what type a rustc::middle::ty::Ty represents?

为了在 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 
}

但是,现在我有点迷茫了——如何确定 TyS 是否真的是一个 Option<_> 类型?

你需要使用 with_path on the DefId. You will be provided an iterator over PathElems,你必须消耗它。

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

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