Skip to content

Commit d695b95

Browse files
committed
implement -Z ignore-directory-in-diagnostics-source-blocks
1 parent 56e1aaa commit d695b95

File tree

5 files changed

+49
-7
lines changed

5 files changed

+49
-7
lines changed

compiler/rustc_errors/src/annotate_snippet_emitter_writer.rs

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ impl AnnotateSnippetEmitterWriter {
169169
.map(|line| {
170170
// Ensure the source file is present before we try
171171
// to load a string from it.
172+
// FIXME(#115869): support -Z ignore-directory-in-diagnostics-source-blocks
172173
source_map.ensure_source_file_source_present(&file);
173174
(
174175
format!("{}", source_map.filename_for_diagnostics(&file.name)),

compiler/rustc_errors/src/emitter.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//! The output types are defined in `rustc_session::config::ErrorOutputType`.
99
1010
use rustc_span::source_map::SourceMap;
11-
use rustc_span::{FileLines, SourceFile, Span};
11+
use rustc_span::{FileLines, FileName, SourceFile, Span};
1212

1313
use crate::snippet::{
1414
Annotation, AnnotationColumn, AnnotationType, Line, MultilineAnnotation, Style, StyledString,
@@ -635,6 +635,7 @@ pub struct EmitterWriter {
635635
short_message: bool,
636636
teach: bool,
637637
ui_testing: bool,
638+
ignored_directories_in_source_blocks: Vec<String>,
638639
diagnostic_width: Option<usize>,
639640

640641
macro_backtrace: bool,
@@ -664,6 +665,7 @@ impl EmitterWriter {
664665
short_message: false,
665666
teach: false,
666667
ui_testing: false,
668+
ignored_directories_in_source_blocks: Vec::new(),
667669
diagnostic_width: None,
668670
macro_backtrace: false,
669671
track_diagnostics: false,
@@ -1193,7 +1195,7 @@ impl EmitterWriter {
11931195
let will_be_emitted = |span: Span| {
11941196
!span.is_dummy() && {
11951197
let file = sm.lookup_source_file(span.hi());
1196-
sm.ensure_source_file_source_present(&file)
1198+
should_show_source_code(&self.ignored_directories_in_source_blocks, sm, &file)
11971199
}
11981200
};
11991201

@@ -1388,7 +1390,11 @@ impl EmitterWriter {
13881390
// Print out the annotate source lines that correspond with the error
13891391
for annotated_file in annotated_files {
13901392
// we can't annotate anything if the source is unavailable.
1391-
if !sm.ensure_source_file_source_present(&annotated_file.file) {
1393+
if !should_show_source_code(
1394+
&self.ignored_directories_in_source_blocks,
1395+
sm,
1396+
&annotated_file.file,
1397+
) {
13921398
if !self.short_message {
13931399
// We'll just print an unannotated message.
13941400
for (annotation_id, line) in annotated_file.lines.iter().enumerate() {
@@ -2737,3 +2743,18 @@ pub fn is_case_difference(sm: &SourceMap, suggested: &str, sp: Span) -> bool {
27372743
// bug, but be defensive against that here.
27382744
&& found != suggested
27392745
}
2746+
2747+
pub(crate) fn should_show_source_code(
2748+
ignored_directories: &[String],
2749+
sm: &SourceMap,
2750+
file: &SourceFile,
2751+
) -> bool {
2752+
if !sm.ensure_source_file_source_present(file) {
2753+
return false;
2754+
}
2755+
2756+
let FileName::Real(name) = &file.name else { return true };
2757+
name.local_path()
2758+
.map(|path| ignored_directories.iter().all(|dir| !path.starts_with(dir)))
2759+
.unwrap_or(true)
2760+
}

compiler/rustc_errors/src/json.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use rustc_span::source_map::{FilePathMapping, SourceMap};
1313
use termcolor::{ColorSpec, WriteColor};
1414

15-
use crate::emitter::{Emitter, HumanReadableErrorType};
15+
use crate::emitter::{should_show_source_code, Emitter, HumanReadableErrorType};
1616
use crate::registry::Registry;
1717
use crate::translation::{to_fluent_args, Translate};
1818
use crate::DiagnosticId;
@@ -45,6 +45,7 @@ pub struct JsonEmitter {
4545
fallback_bundle: LazyFallbackBundle,
4646
pretty: bool,
4747
ui_testing: bool,
48+
ignored_directories_in_source_blocks: Vec<String>,
4849
json_rendered: HumanReadableErrorType,
4950
diagnostic_width: Option<usize>,
5051
macro_backtrace: bool,
@@ -73,6 +74,7 @@ impl JsonEmitter {
7374
fallback_bundle,
7475
pretty,
7576
ui_testing: false,
77+
ignored_directories_in_source_blocks: Vec::new(),
7678
json_rendered,
7779
diagnostic_width,
7880
macro_backtrace,
@@ -127,6 +129,7 @@ impl JsonEmitter {
127129
fallback_bundle,
128130
pretty,
129131
ui_testing: false,
132+
ignored_directories_in_source_blocks: Vec::new(),
130133
json_rendered,
131134
diagnostic_width,
132135
macro_backtrace,
@@ -138,6 +141,10 @@ impl JsonEmitter {
138141
pub fn ui_testing(self, ui_testing: bool) -> Self {
139142
Self { ui_testing, ..self }
140143
}
144+
145+
pub fn ignored_directories_in_source_blocks(self, value: Vec<String>) -> Self {
146+
Self { ignored_directories_in_source_blocks: value, ..self }
147+
}
141148
}
142149

143150
impl Translate for JsonEmitter {
@@ -381,6 +388,7 @@ impl Diagnostic {
381388
.track_diagnostics(je.track_diagnostics)
382389
.terminal_url(je.terminal_url)
383390
.ui_testing(je.ui_testing)
391+
.ignored_directories_in_source_blocks(je.ignored_directories_in_source_blocks.clone())
384392
.emit_diagnostic(diag);
385393
let output = Arc::try_unwrap(output.0).unwrap().into_inner().unwrap();
386394
let output = String::from_utf8(output).unwrap();
@@ -558,7 +566,11 @@ impl DiagnosticSpanLine {
558566
.span_to_lines(span)
559567
.map(|lines| {
560568
// We can't get any lines if the source is unavailable.
561-
if !je.sm.ensure_source_file_source_present(&lines.file) {
569+
if !should_show_source_code(
570+
&je.ignored_directories_in_source_blocks,
571+
&je.sm,
572+
&lines.file,
573+
) {
562574
return vec![];
563575
}
564576

compiler/rustc_session/src/options.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1536,6 +1536,8 @@ options! {
15361536
"generate human-readable, predictable names for codegen units (default: no)"),
15371537
identify_regions: bool = (false, parse_bool, [UNTRACKED],
15381538
"display unnamed regions as `'<id>`, using a non-ident unique id (default: no)"),
1539+
ignore_directory_in_diagnostics_source_blocks: Vec<String> = (Vec::new(), parse_string_push, [UNTRACKED],
1540+
"do not display the source code block in diagnostics for files in the directory"),
15391541
incremental_ignore_spans: bool = (false, parse_bool, [TRACKED],
15401542
"ignore spans during ICH computation -- used for testing (default: no)"),
15411543
incremental_info: bool = (false, parse_bool, [UNTRACKED],

compiler/rustc_session/src/session.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,10 @@ fn default_emitter(
12951295
.diagnostic_width(sopts.diagnostic_width)
12961296
.macro_backtrace(macro_backtrace)
12971297
.track_diagnostics(track_diagnostics)
1298-
.terminal_url(terminal_url);
1298+
.terminal_url(terminal_url)
1299+
.ignored_directories_in_source_blocks(
1300+
sopts.unstable_opts.ignore_directory_in_diagnostics_source_blocks.clone(),
1301+
);
12991302
Box::new(emitter.ui_testing(sopts.unstable_opts.ui_testing))
13001303
}
13011304
}
@@ -1312,7 +1315,10 @@ fn default_emitter(
13121315
track_diagnostics,
13131316
terminal_url,
13141317
)
1315-
.ui_testing(sopts.unstable_opts.ui_testing),
1318+
.ui_testing(sopts.unstable_opts.ui_testing)
1319+
.ignored_directories_in_source_blocks(
1320+
sopts.unstable_opts.ignore_directory_in_diagnostics_source_blocks.clone(),
1321+
),
13161322
),
13171323
}
13181324
}

0 commit comments

Comments
 (0)