@@ -36,7 +36,7 @@ use hir::def::Def;
3636use hir:: def_id:: DefId ;
3737use util:: nodemap:: { NodeMap , FnvHashSet } ;
3838
39- use syntax_pos:: { mk_sp, Span , ExpnId } ;
39+ use syntax_pos:: { BytePos , mk_sp, Span , ExpnId } ;
4040use syntax:: codemap:: { self , respan, Spanned } ;
4141use syntax:: abi:: Abi ;
4242use syntax:: ast:: { Name , NodeId , DUMMY_NODE_ID , AsmDialect } ;
@@ -326,6 +326,38 @@ impl Generics {
326326 pub fn is_parameterized ( & self ) -> bool {
327327 self . is_lt_parameterized ( ) || self . is_type_parameterized ( )
328328 }
329+
330+ // Does return a span which includes lifetimes and type parameters,
331+ // not where clause.
332+ pub fn span ( & self ) -> Option < Span > {
333+ if !self . is_parameterized ( ) {
334+ None
335+ } else {
336+ let mut span: Option < Span > = None ;
337+ for lifetime in self . lifetimes . iter ( ) {
338+ if let Some ( ref mut span) = span {
339+ let life_span = lifetime. lifetime . span ;
340+ span. hi = if span. hi > life_span. hi { span. hi } else { life_span. hi } ;
341+ span. lo = if span. lo < life_span. lo { span. lo } else { life_span. lo } ;
342+ } else {
343+ span = Some ( lifetime. lifetime . span . clone ( ) ) ;
344+ }
345+ }
346+ for ty_param in self . ty_params . iter ( ) {
347+ if let Some ( ref mut span) = span {
348+ span. lo = if span. lo < ty_param. span . lo { span. lo } else { ty_param. span . lo } ;
349+ span. hi = if span. hi > ty_param. span . hi { span. hi } else { ty_param. span . hi } ;
350+ } else {
351+ span = Some ( ty_param. span . clone ( ) ) ;
352+ }
353+ }
354+ if let Some ( ref mut span) = span {
355+ span. lo = span. lo - BytePos ( 1 ) ;
356+ span. hi = span. hi + BytePos ( 1 ) ;
357+ }
358+ span
359+ }
360+ }
329361}
330362
331363/// A `where` clause in a definition
0 commit comments