@@ -36,7 +36,7 @@ use hir::def::Def;
36
36
use hir:: def_id:: DefId ;
37
37
use util:: nodemap:: { NodeMap , FnvHashSet } ;
38
38
39
- use syntax_pos:: { mk_sp, Span , ExpnId } ;
39
+ use syntax_pos:: { BytePos , mk_sp, Span , ExpnId } ;
40
40
use syntax:: codemap:: { self , respan, Spanned } ;
41
41
use syntax:: abi:: Abi ;
42
42
use syntax:: ast:: { Name , NodeId , DUMMY_NODE_ID , AsmDialect } ;
@@ -326,6 +326,38 @@ impl Generics {
326
326
pub fn is_parameterized ( & self ) -> bool {
327
327
self . is_lt_parameterized ( ) || self . is_type_parameterized ( )
328
328
}
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
+ }
329
361
}
330
362
331
363
/// A `where` clause in a definition
0 commit comments