2015-06-04 27 views
6

Per scrivere un altro lint in Rust, devo assicurarmi che il tipo di un Expr sia in realtà un Option<_> (o qualsiasi puntatore a uno). Ho già camminato eventuali ptr s e rptr s alla loro conclusione e sono rimasto con un rustc::middle::ty che nel mio caso di test esegue il debug di (formattato manualmente per una migliore leggibilità):Come scoprire che tipo rugc :: middle :: ty :: Ty rappresenta?

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 
} 

Tuttavia, ora sto un po 'perso - Come faccio a sapere se il TyS è in realtà un tipo _ < _>?

risposta

2

È necessario utilizzare with_path sul DefId. Ti verrà fornito un iteratore su PathElem s che devi consumare.

Quello che segue è uno schizzo approssimativo, ma dovrebbe fornirvi una serie di Name se lo regolate un po '.

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

Freddo. Ero persino in grado di '.zip' l'' iter' di 'Name's con una porzione di' & str's e confrontarli senza prima creare un Vec. – llogiq