Skip to content

Commit 5948182

Browse files
Add Span field for Generics structs
1 parent 7ac11ca commit 5948182

File tree

14 files changed

+37
-52
lines changed

14 files changed

+37
-52
lines changed

src/librustc/hir/fold.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -577,13 +577,14 @@ pub fn noop_fold_opt_lifetime<T: Folder>(o_lt: Option<Lifetime>, fld: &mut T) ->
577577
o_lt.map(|lt| fld.fold_lifetime(lt))
578578
}
579579

580-
pub fn noop_fold_generics<T: Folder>(Generics { ty_params, lifetimes, where_clause }: Generics,
580+
pub fn noop_fold_generics<T: Folder>(Generics {ty_params, lifetimes, where_clause, span}: Generics,
581581
fld: &mut T)
582582
-> Generics {
583583
Generics {
584584
ty_params: fld.fold_ty_params(ty_params),
585585
lifetimes: fld.fold_lifetime_defs(lifetimes),
586586
where_clause: fld.fold_where_clause(where_clause),
587+
span: fld.new_span(span),
587588
}
588589
}
589590

src/librustc/hir/lowering.rs

+1
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ impl<'a> LoweringContext<'a> {
466466
ty_params: self.lower_ty_params(&g.ty_params),
467467
lifetimes: self.lower_lifetime_defs(&g.lifetimes),
468468
where_clause: self.lower_where_clause(&g.where_clause),
469+
span: g.span,
469470
}
470471
}
471472

src/librustc/hir/mod.rs

+3-33
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use hir::def::Def;
3636
use hir::def_id::DefId;
3737
use util::nodemap::{NodeMap, FnvHashSet};
3838

39-
use syntax_pos::{BytePos, mk_sp, Span, ExpnId};
39+
use syntax_pos::{mk_sp, Span, ExpnId, DUMMY_SP};
4040
use syntax::codemap::{self, respan, Spanned};
4141
use syntax::abi::Abi;
4242
use syntax::ast::{Name, NodeId, DUMMY_NODE_ID, AsmDialect};
@@ -301,6 +301,7 @@ pub struct Generics {
301301
pub lifetimes: HirVec<LifetimeDef>,
302302
pub ty_params: HirVec<TyParam>,
303303
pub where_clause: WhereClause,
304+
pub span: Span,
304305
}
305306

306307
impl Generics {
@@ -312,6 +313,7 @@ impl Generics {
312313
id: DUMMY_NODE_ID,
313314
predicates: HirVec::new(),
314315
},
316+
span: DUMMY_SP,
315317
}
316318
}
317319

@@ -326,38 +328,6 @@ impl Generics {
326328
pub fn is_parameterized(&self) -> bool {
327329
self.is_lt_parameterized() || self.is_type_parameterized()
328330
}
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-
}
361331
}
362332

363333
/// A `where` clause in a definition

src/librustc/hir/print.rs

+2
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ impl<'a> State<'a> {
523523
id: ast::DUMMY_NODE_ID,
524524
predicates: hir::HirVec::new(),
525525
},
526+
span: syntax_pos::DUMMY_SP,
526527
};
527528
self.print_ty_fn(f.abi, f.unsafety, &f.decl, None, &generics)?;
528529
}
@@ -2224,6 +2225,7 @@ impl<'a> State<'a> {
22242225
id: ast::DUMMY_NODE_ID,
22252226
predicates: hir::HirVec::new(),
22262227
},
2228+
span: syntax_pos::DUMMY_SP,
22272229
};
22282230
self.print_fn(decl,
22292231
unsafety,

src/librustc/infer/error_reporting.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,7 @@ impl<'a, 'gcx, 'tcx> Rebuilder<'a, 'gcx, 'tcx> {
12931293
lifetimes: lifetimes.into(),
12941294
ty_params: ty_params,
12951295
where_clause: where_clause,
1296+
span: generics.span,
12961297
}
12971298
}
12981299

src/librustc_typeck/lib.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,10 @@ fn check_main_fn_ty(ccx: &CrateCtxt,
216216
Some(hir_map::NodeItem(it)) => {
217217
match it.node {
218218
hir::ItemFn(_, _, _, _, ref generics, _) => {
219-
if let Some(gen_span) = generics.span() {
220-
struct_span_err!(ccx.tcx.sess, gen_span, E0131,
219+
if generics.is_parameterized() {
220+
struct_span_err!(ccx.tcx.sess, generics.span, E0131,
221221
"main function is not allowed to have type parameters")
222-
.span_label(gen_span,
222+
.span_label(generics.span,
223223
&format!("main cannot have type parameters"))
224224
.emit();
225225
return;
@@ -269,10 +269,9 @@ fn check_start_fn_ty(ccx: &CrateCtxt,
269269
match it.node {
270270
hir::ItemFn(_,_,_,_,ref ps,_)
271271
if ps.is_parameterized() => {
272-
let sp = if let Some(sp) = ps.span() { sp } else { start_span };
273-
struct_span_err!(tcx.sess, sp, E0132,
272+
struct_span_err!(tcx.sess, ps.span, E0132,
274273
"start function is not allowed to have type parameters")
275-
.span_label(sp,
274+
.span_label(ps.span,
276275
&format!("start function cannot have type parameters"))
277276
.emit();
278277
return;

src/libsyntax/ast.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ pub struct TyParam {
336336
pub id: NodeId,
337337
pub bounds: TyParamBounds,
338338
pub default: Option<P<Ty>>,
339-
pub span: Span
339+
pub span: Span,
340340
}
341341

342342
/// Represents lifetimes and type parameters attached to a declaration
@@ -346,6 +346,7 @@ pub struct Generics {
346346
pub lifetimes: Vec<LifetimeDef>,
347347
pub ty_params: P<[TyParam]>,
348348
pub where_clause: WhereClause,
349+
pub span: Span,
349350
}
350351

351352
impl Generics {
@@ -368,7 +369,8 @@ impl Default for Generics {
368369
where_clause: WhereClause {
369370
id: DUMMY_NODE_ID,
370371
predicates: Vec::new(),
371-
}
372+
},
373+
span: DUMMY_SP,
372374
}
373375
}
374376
}

src/libsyntax/fold.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -698,12 +698,13 @@ pub fn noop_fold_opt_lifetime<T: Folder>(o_lt: Option<Lifetime>, fld: &mut T)
698698
o_lt.map(|lt| fld.fold_lifetime(lt))
699699
}
700700

701-
pub fn noop_fold_generics<T: Folder>(Generics {ty_params, lifetimes, where_clause}: Generics,
701+
pub fn noop_fold_generics<T: Folder>(Generics {ty_params, lifetimes, where_clause, span}: Generics,
702702
fld: &mut T) -> Generics {
703703
Generics {
704704
ty_params: fld.fold_ty_params(ty_params),
705705
lifetimes: fld.fold_lifetime_defs(lifetimes),
706706
where_clause: fld.fold_where_clause(where_clause),
707+
span: fld.new_span(span),
707708
}
708709
}
709710

src/libsyntax/parse/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ pub fn integer_lit(s: &str,
674674
mod tests {
675675
use super::*;
676676
use std::rc::Rc;
677-
use syntax_pos::{Span, BytePos, Pos, NO_EXPANSION};
677+
use syntax_pos::{self, Span, BytePos, Pos, NO_EXPANSION};
678678
use codemap::Spanned;
679679
use ast::{self, PatKind};
680680
use abi::Abi;
@@ -945,7 +945,8 @@ mod tests {
945945
where_clause: ast::WhereClause {
946946
id: ast::DUMMY_NODE_ID,
947947
predicates: Vec::new(),
948-
}
948+
},
949+
span: syntax_pos::DUMMY_SP,
949950
},
950951
P(ast::Block {
951952
stmts: vec!(ast::Stmt {

src/libsyntax/parse/parser.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -716,8 +716,8 @@ impl<'a> Parser<'a> {
716716
let gt_str = Parser::token_to_string(&token::Gt);
717717
let this_token_str = self.this_token_to_string();
718718
Err(self.fatal(&format!("expected `{}`, found `{}`",
719-
gt_str,
720-
this_token_str)))
719+
gt_str,
720+
this_token_str)))
721721
}
722722
}
723723
}
@@ -4251,6 +4251,7 @@ impl<'a> Parser<'a> {
42514251
/// where typaramseq = ( typaram ) | ( typaram , typaramseq )
42524252
pub fn parse_generics(&mut self) -> PResult<'a, ast::Generics> {
42534253
maybe_whole!(self, NtGenerics);
4254+
let span_lo = self.span.lo;
42544255

42554256
if self.eat(&token::Lt) {
42564257
let lifetime_defs = self.parse_lifetime_defs()?;
@@ -4273,7 +4274,8 @@ impl<'a> Parser<'a> {
42734274
where_clause: WhereClause {
42744275
id: ast::DUMMY_NODE_ID,
42754276
predicates: Vec::new(),
4276-
}
4277+
},
4278+
span: mk_sp(span_lo, self.last_span.hi),
42774279
})
42784280
} else {
42794281
Ok(ast::Generics::default())

src/libsyntax/print/pprust.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,7 @@ impl<'a> State<'a> {
10011001
id: ast::DUMMY_NODE_ID,
10021002
predicates: Vec::new(),
10031003
},
1004+
span: syntax_pos::DUMMY_SP,
10041005
};
10051006
try!(self.print_ty_fn(f.abi,
10061007
f.unsafety,
@@ -2982,6 +2983,7 @@ impl<'a> State<'a> {
29822983
id: ast::DUMMY_NODE_ID,
29832984
predicates: Vec::new(),
29842985
},
2986+
span: syntax_pos::DUMMY_SP,
29852987
};
29862988
try!(self.print_fn(decl,
29872989
unsafety,

src/libsyntax_ext/deriving/generic/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ impl<'a> TraitDef<'a> {
488488
}
489489
});
490490

491-
let Generics { mut lifetimes, ty_params, mut where_clause } = self.generics
491+
let Generics { mut lifetimes, ty_params, mut where_clause, span } = self.generics
492492
.to_generics(cx, self.span, type_ident, generics);
493493
let mut ty_params = ty_params.into_vec();
494494

@@ -590,6 +590,7 @@ impl<'a> TraitDef<'a> {
590590
lifetimes: lifetimes,
591591
ty_params: P::from_vec(ty_params),
592592
where_clause: where_clause,
593+
span: span,
593594
};
594595

595596
// Create the reference to the trait.

src/libsyntax_ext/deriving/generic/ty.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -207,14 +207,16 @@ fn mk_ty_param(cx: &ExtCtxt,
207207
cx.typaram(span, cx.ident_of(name), bounds, None)
208208
}
209209

210-
fn mk_generics(lifetimes: Vec<ast::LifetimeDef>, ty_params: Vec<ast::TyParam>) -> Generics {
210+
fn mk_generics(lifetimes: Vec<ast::LifetimeDef>, ty_params: Vec<ast::TyParam>, span: Span)
211+
-> Generics {
211212
Generics {
212213
lifetimes: lifetimes,
213214
ty_params: P::from_vec(ty_params),
214215
where_clause: ast::WhereClause {
215216
id: ast::DUMMY_NODE_ID,
216217
predicates: Vec::new(),
217218
},
219+
span: span,
218220
}
219221
}
220222

@@ -257,7 +259,7 @@ impl<'a> LifetimeBounds<'a> {
257259
}
258260
})
259261
.collect();
260-
mk_generics(lifetimes, ty_params)
262+
mk_generics(lifetimes, ty_params, span)
261263
}
262264
}
263265

src/test/compile-fail/E0132.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#![feature(start)]
1212

1313
#[start]
14-
fn f<T>() {} //~ ERROR E0132
14+
fn f< T >() {} //~ ERROR E0132
1515
//~| NOTE start function cannot have type parameters
1616

1717
fn main() {

0 commit comments

Comments
 (0)