@@ -21,7 +21,7 @@ use rustc_error_messages::FluentArgs;
21
21
use rustc_lint_defs:: Applicability ;
22
22
use rustc_span:: Span ;
23
23
use rustc_span:: hygiene:: ExpnData ;
24
- use rustc_span:: source_map:: SourceMap ;
24
+ use rustc_span:: source_map:: { FilePathMapping , SourceMap } ;
25
25
use serde:: Serialize ;
26
26
use termcolor:: { ColorSpec , WriteColor } ;
27
27
@@ -45,7 +45,7 @@ pub struct JsonEmitter {
45
45
#[ setters( skip) ]
46
46
dst : IntoDynSyncSend < Box < dyn Write + Send > > ,
47
47
#[ setters( skip) ]
48
- sm : Lrc < SourceMap > ,
48
+ sm : Option < Lrc < SourceMap > > ,
49
49
fluent_bundle : Option < Lrc < FluentBundle > > ,
50
50
#[ setters( skip) ]
51
51
fallback_bundle : LazyFallbackBundle ,
@@ -65,7 +65,7 @@ pub struct JsonEmitter {
65
65
impl JsonEmitter {
66
66
pub fn new (
67
67
dst : Box < dyn Write + Send > ,
68
- sm : Lrc < SourceMap > ,
68
+ sm : Option < Lrc < SourceMap > > ,
69
69
fallback_bundle : LazyFallbackBundle ,
70
70
pretty : bool ,
71
71
json_rendered : HumanReadableErrorType ,
@@ -171,7 +171,7 @@ impl Emitter for JsonEmitter {
171
171
}
172
172
173
173
fn source_map ( & self ) -> Option < & SourceMap > {
174
- Some ( & self . sm )
174
+ self . sm . as_deref ( )
175
175
}
176
176
177
177
fn should_show_explain ( & self ) -> bool {
@@ -371,7 +371,7 @@ impl Diagnostic {
371
371
}
372
372
HumanEmitter :: new ( dst, Lrc :: clone ( & je. fallback_bundle ) )
373
373
. short_message ( short)
374
- . sm ( Some ( Lrc :: clone ( & je. sm ) ) )
374
+ . sm ( je. sm . clone ( ) )
375
375
. fluent_bundle ( je. fluent_bundle . clone ( ) )
376
376
. diagnostic_width ( je. diagnostic_width )
377
377
. macro_backtrace ( je. macro_backtrace )
@@ -458,22 +458,33 @@ impl DiagnosticSpan {
458
458
mut backtrace : impl Iterator < Item = ExpnData > ,
459
459
je : & JsonEmitter ,
460
460
) -> DiagnosticSpan {
461
- let start = je. sm . lookup_char_pos ( span. lo ( ) ) ;
461
+ let empty_source_map;
462
+ let sm = match & je. sm {
463
+ Some ( s) => s,
464
+ None => {
465
+ span = rustc_span:: DUMMY_SP ;
466
+ empty_source_map = Arc :: new ( SourceMap :: new ( FilePathMapping :: empty ( ) ) ) ;
467
+ empty_source_map
468
+ . new_source_file ( std:: path:: PathBuf :: from ( "empty.rs" ) . into ( ) , String :: new ( ) ) ;
469
+ & empty_source_map
470
+ }
471
+ } ;
472
+ let start = sm. lookup_char_pos ( span. lo ( ) ) ;
462
473
// If this goes from the start of a line to the end and the replacement
463
474
// is an empty string, increase the length to include the newline so we don't
464
475
// leave an empty line
465
476
if start. col . 0 == 0
466
477
&& suggestion. map_or ( false , |( s, _) | s. is_empty ( ) )
467
- && let Ok ( after) = je . sm . span_to_next_source ( span)
478
+ && let Ok ( after) = sm. span_to_next_source ( span)
468
479
&& after. starts_with ( '\n' )
469
480
{
470
481
span = span. with_hi ( span. hi ( ) + rustc_span:: BytePos ( 1 ) ) ;
471
482
}
472
- let end = je . sm . lookup_char_pos ( span. hi ( ) ) ;
483
+ let end = sm. lookup_char_pos ( span. hi ( ) ) ;
473
484
let backtrace_step = backtrace. next ( ) . map ( |bt| {
474
485
let call_site = Self :: from_span_full ( bt. call_site , false , None , None , backtrace, je) ;
475
486
let def_site_span = Self :: from_span_full (
476
- je . sm . guess_head_span ( bt. def_site ) ,
487
+ sm. guess_head_span ( bt. def_site ) ,
477
488
false ,
478
489
None ,
479
490
None ,
@@ -488,7 +499,7 @@ impl DiagnosticSpan {
488
499
} ) ;
489
500
490
501
DiagnosticSpan {
491
- file_name : je . sm . filename_for_diagnostics ( & start. file . name ) . to_string ( ) ,
502
+ file_name : sm. filename_for_diagnostics ( & start. file . name ) . to_string ( ) ,
492
503
byte_start : start. file . original_relative_byte_pos ( span. lo ( ) ) . 0 ,
493
504
byte_end : start. file . original_relative_byte_pos ( span. hi ( ) ) . 0 ,
494
505
line_start : start. line ,
@@ -558,19 +569,20 @@ impl DiagnosticSpanLine {
558
569
/// `span` within the line.
559
570
fn from_span ( span : Span , je : & JsonEmitter ) -> Vec < DiagnosticSpanLine > {
560
571
je. sm
561
- . span_to_lines ( span)
562
- . map ( |lines| {
572
+ . as_ref ( )
573
+ . and_then ( |sm| {
574
+ let lines = sm. span_to_lines ( span) . ok ( ) ?;
563
575
// We can't get any lines if the source is unavailable.
564
576
if !should_show_source_code (
565
577
& je. ignored_directories_in_source_blocks ,
566
- & je . sm ,
578
+ & sm,
567
579
& lines. file ,
568
580
) {
569
- return vec ! [ ] ;
581
+ return None ;
570
582
}
571
583
572
584
let sf = & * lines. file ;
573
- lines
585
+ let span_lines = lines
574
586
. lines
575
587
. iter ( )
576
588
. map ( |line| {
@@ -581,8 +593,9 @@ impl DiagnosticSpanLine {
581
593
line. end_col . 0 + 1 ,
582
594
)
583
595
} )
584
- . collect ( )
596
+ . collect ( ) ;
597
+ Some ( span_lines)
585
598
} )
586
- . unwrap_or_else ( |_| vec ! [ ] )
599
+ . unwrap_or_default ( )
587
600
}
588
601
}
0 commit comments