@@ -41,7 +41,7 @@ use std::default::Default as StdDefault;
41
41
use std:: mem;
42
42
use syntax:: ast_util:: { self , IdVisitingOperation } ;
43
43
use syntax:: attr:: { self , AttrMetaMethods } ;
44
- use syntax:: codemap:: Span ;
44
+ use syntax:: codemap:: { Span , MultiSpan } ;
45
45
use syntax:: errors:: DiagnosticBuilder ;
46
46
use syntax:: parse:: token:: InternedString ;
47
47
use syntax:: ast;
@@ -398,20 +398,20 @@ pub fn gather_attr(attr: &ast::Attribute)
398
398
/// in trans that run after the main lint pass is finished. Most
399
399
/// lints elsewhere in the compiler should call
400
400
/// `Session::add_lint()` instead.
401
- pub fn raw_emit_lint ( sess : & Session ,
401
+ pub fn raw_emit_lint < S : Into < MultiSpan > > ( sess : & Session ,
402
402
lints : & LintStore ,
403
403
lint : & ' static Lint ,
404
404
lvlsrc : LevelSource ,
405
- span : Option < Span > ,
405
+ span : Option < S > ,
406
406
msg : & str ) {
407
407
raw_struct_lint ( sess, lints, lint, lvlsrc, span, msg) . emit ( ) ;
408
408
}
409
409
410
- pub fn raw_struct_lint < ' a > ( sess : & ' a Session ,
410
+ pub fn raw_struct_lint < ' a , S : Into < MultiSpan > > ( sess : & ' a Session ,
411
411
lints : & LintStore ,
412
412
lint : & ' static Lint ,
413
413
lvlsrc : LevelSource ,
414
- span : Option < Span > ,
414
+ span : Option < S > ,
415
415
msg : & str )
416
416
-> DiagnosticBuilder < ' a > {
417
417
let ( mut level, source) = lvlsrc;
@@ -442,10 +442,15 @@ pub fn raw_struct_lint<'a>(sess: &'a Session,
442
442
// For purposes of printing, we can treat forbid as deny.
443
443
if level == Forbid { level = Deny ; }
444
444
445
- let mut err = match ( level, span) {
446
- ( Warn , Some ( sp) ) => sess. struct_span_warn ( sp, & msg[ ..] ) ,
445
+ let span = span. map ( |s| s. into ( ) ) ;
446
+ let mut err = match ( level, span. clone ( ) ) {
447
+ ( Warn , Some ( sp) ) => {
448
+ sess. struct_span_warn ( sp, & msg[ ..] )
449
+ } ,
447
450
( Warn , None ) => sess. struct_warn ( & msg[ ..] ) ,
448
- ( Deny , Some ( sp) ) => sess. struct_span_err ( sp, & msg[ ..] ) ,
451
+ ( Deny , Some ( sp) ) => {
452
+ sess. struct_span_err ( sp, & msg[ ..] )
453
+ } ,
449
454
( Deny , None ) => sess. struct_err ( & msg[ ..] ) ,
450
455
_ => sess. bug ( "impossible level in raw_emit_lint" ) ,
451
456
} ;
@@ -458,7 +463,7 @@ pub fn raw_struct_lint<'a>(sess: &'a Session,
458
463
let citation = format ! ( "for more information, see {}" ,
459
464
future_incompatible. reference) ;
460
465
if let Some ( sp) = span {
461
- err. fileline_warn ( sp, & explanation) ;
466
+ err. fileline_warn ( sp. clone ( ) , & explanation) ;
462
467
err. fileline_note ( sp, & citation) ;
463
468
} else {
464
469
err. warn ( & explanation) ;
@@ -497,7 +502,7 @@ pub trait LintContext: Sized {
497
502
} )
498
503
}
499
504
500
- fn lookup_and_emit ( & self , lint : & ' static Lint , span : Option < Span > , msg : & str ) {
505
+ fn lookup_and_emit ( & self , lint : & ' static Lint , span : Option < MultiSpan > , msg : & str ) {
501
506
let ( level, src) = match self . level_src ( lint) {
502
507
None => return ,
503
508
Some ( pair) => pair,
@@ -520,8 +525,8 @@ pub trait LintContext: Sized {
520
525
}
521
526
522
527
/// Emit a lint at the appropriate level, for a particular span.
523
- fn span_lint ( & self , lint : & ' static Lint , span : Span , msg : & str ) {
524
- self . lookup_and_emit ( lint, Some ( span) , msg) ;
528
+ fn span_lint < S : Into < MultiSpan > > ( & self , lint : & ' static Lint , span : S , msg : & str ) {
529
+ self . lookup_and_emit ( lint, Some ( span. into ( ) ) , msg) ;
525
530
}
526
531
527
532
fn struct_span_lint ( & self ,
@@ -1258,8 +1263,8 @@ pub fn check_crate(tcx: &ty::ctxt, access_levels: &AccessLevels) {
1258
1263
// If we missed any lints added to the session, then there's a bug somewhere
1259
1264
// in the iteration code.
1260
1265
for ( id, v) in tcx. sess . lints . borrow ( ) . iter ( ) {
1261
- for & ( lint, span, ref msg) in v {
1262
- tcx. sess . span_bug ( span,
1266
+ for & ( lint, ref span, ref msg) in v {
1267
+ tcx. sess . span_bug ( span. clone ( ) ,
1263
1268
& format ! ( "unprocessed lint {} at {}: {}" ,
1264
1269
lint. as_str( ) , tcx. map. node_to_string( * id) , * msg) )
1265
1270
}
@@ -1292,8 +1297,8 @@ pub fn check_ast_crate(sess: &Session, krate: &ast::Crate) {
1292
1297
// If we missed any lints added to the session, then there's a bug somewhere
1293
1298
// in the iteration code.
1294
1299
for ( _, v) in sess. lints . borrow ( ) . iter ( ) {
1295
- for & ( lint, span, ref msg) in v {
1296
- sess. span_bug ( span,
1300
+ for & ( lint, ref span, ref msg) in v {
1301
+ sess. span_bug ( span. clone ( ) ,
1297
1302
& format ! ( "unprocessed lint {}: {}" ,
1298
1303
lint. as_str( ) , * msg) )
1299
1304
}
0 commit comments