@@ -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,23 +458,34 @@ 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
&& let Some ( ( suggestion, _) ) = suggestion
467
478
&& suggestion. is_empty ( )
468
- && let Ok ( after) = je . sm . span_to_next_source ( span)
479
+ && let Ok ( after) = sm. span_to_next_source ( span)
469
480
&& after. starts_with ( '\n' )
470
481
{
471
482
span = span. with_hi ( span. hi ( ) + rustc_span:: BytePos ( 1 ) ) ;
472
483
}
473
- let end = je . sm . lookup_char_pos ( span. hi ( ) ) ;
484
+ let end = sm. lookup_char_pos ( span. hi ( ) ) ;
474
485
let backtrace_step = backtrace. next ( ) . map ( |bt| {
475
486
let call_site = Self :: from_span_full ( bt. call_site , false , None , None , backtrace, je) ;
476
487
let def_site_span = Self :: from_span_full (
477
- je . sm . guess_head_span ( bt. def_site ) ,
488
+ sm. guess_head_span ( bt. def_site ) ,
478
489
false ,
479
490
None ,
480
491
None ,
@@ -489,7 +500,7 @@ impl DiagnosticSpan {
489
500
} ) ;
490
501
491
502
DiagnosticSpan {
492
- file_name : je . sm . filename_for_diagnostics ( & start. file . name ) . to_string ( ) ,
503
+ file_name : sm. filename_for_diagnostics ( & start. file . name ) . to_string ( ) ,
493
504
byte_start : start. file . original_relative_byte_pos ( span. lo ( ) ) . 0 ,
494
505
byte_end : start. file . original_relative_byte_pos ( span. hi ( ) ) . 0 ,
495
506
line_start : start. line ,
@@ -559,19 +570,20 @@ impl DiagnosticSpanLine {
559
570
/// `span` within the line.
560
571
fn from_span ( span : Span , je : & JsonEmitter ) -> Vec < DiagnosticSpanLine > {
561
572
je. sm
562
- . span_to_lines ( span)
563
- . map ( |lines| {
573
+ . as_ref ( )
574
+ . and_then ( |sm| {
575
+ let lines = sm. span_to_lines ( span) . ok ( ) ?;
564
576
// We can't get any lines if the source is unavailable.
565
577
if !should_show_source_code (
566
578
& je. ignored_directories_in_source_blocks ,
567
- & je . sm ,
579
+ & sm,
568
580
& lines. file ,
569
581
) {
570
- return vec ! [ ] ;
582
+ return None ;
571
583
}
572
584
573
585
let sf = & * lines. file ;
574
- lines
586
+ let span_lines = lines
575
587
. lines
576
588
. iter ( )
577
589
. map ( |line| {
@@ -582,8 +594,9 @@ impl DiagnosticSpanLine {
582
594
line. end_col . 0 + 1 ,
583
595
)
584
596
} )
585
- . collect ( )
597
+ . collect ( ) ;
598
+ Some ( span_lines)
586
599
} )
587
- . unwrap_or_else ( |_| vec ! [ ] )
600
+ . unwrap_or_default ( )
588
601
}
589
602
}
0 commit comments