Skip to content

Commit 80f1c78

Browse files
author
Jonathan Turner
committed
make old school mode a bit more configurable
1 parent d4e79de commit 80f1c78

File tree

6 files changed

+104
-43
lines changed

6 files changed

+104
-43
lines changed

src/librustc/session/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,10 @@ pub fn build_session_with_codemap(sopts: config::Options,
454454

455455
let emitter: Box<Emitter> = match sopts.error_format {
456456
config::ErrorOutputType::HumanReadable(color_config) => {
457-
Box::new(EmitterWriter::stderr(color_config, Some(registry), codemap.clone()))
457+
Box::new(EmitterWriter::stderr(color_config,
458+
Some(registry),
459+
codemap.clone(),
460+
errors::snippet::FormatMode::EnvironmentSelected))
458461
}
459462
config::ErrorOutputType::Json => {
460463
Box::new(JsonEmitter::stderr(Some(registry), codemap.clone()))

src/librustc_errors/emitter.rs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use check_old_skool;
1717
use {Level, RenderSpan, CodeSuggestion, DiagnosticBuilder, CodeMapper};
1818
use RenderSpan::*;
1919
use Level::*;
20-
use snippet::{RenderedLineKind, SnippetData, Style};
20+
use snippet::{RenderedLineKind, SnippetData, Style, FormatMode};
2121

2222
use std::{cmp, fmt};
2323
use std::io::prelude::*;
@@ -159,7 +159,7 @@ pub struct EmitterWriter {
159159
first: bool,
160160

161161
// For now, allow an old-school mode while we transition
162-
old_school: bool,
162+
format_mode: FormatMode
163163
}
164164

165165
impl CoreEmitter for EmitterWriter {
@@ -194,35 +194,35 @@ macro_rules! println_maybe_styled {
194194
impl EmitterWriter {
195195
pub fn stderr(color_config: ColorConfig,
196196
registry: Option<registry::Registry>,
197-
code_map: Rc<CodeMapper>)
197+
code_map: Rc<CodeMapper>,
198+
format_mode: FormatMode)
198199
-> EmitterWriter {
199-
let old_school = check_old_skool();
200200
if color_config.use_color() {
201201
let dst = Destination::from_stderr();
202202
EmitterWriter { dst: dst,
203203
registry: registry,
204204
cm: code_map,
205205
first: true,
206-
old_school: old_school }
206+
format_mode: format_mode.clone() }
207207
} else {
208208
EmitterWriter { dst: Raw(Box::new(io::stderr())),
209209
registry: registry,
210210
cm: code_map,
211211
first: true,
212-
old_school: old_school }
212+
format_mode: format_mode.clone() }
213213
}
214214
}
215215

216216
pub fn new(dst: Box<Write + Send>,
217217
registry: Option<registry::Registry>,
218-
code_map: Rc<CodeMapper>)
218+
code_map: Rc<CodeMapper>,
219+
format_mode: FormatMode)
219220
-> EmitterWriter {
220-
let old_school = check_old_skool();
221221
EmitterWriter { dst: Raw(dst),
222222
registry: registry,
223223
cm: code_map,
224224
first: true,
225-
old_school: old_school }
225+
format_mode: format_mode.clone() }
226226
}
227227

228228
fn emit_message_(&mut self,
@@ -233,11 +233,17 @@ impl EmitterWriter {
233233
is_header: bool,
234234
show_snippet: bool)
235235
-> io::Result<()> {
236+
let old_school = match self.format_mode {
237+
FormatMode::NewErrorFormat => false,
238+
FormatMode::OriginalErrorFormat => true,
239+
FormatMode::EnvironmentSelected => check_old_skool()
240+
};
241+
236242
if is_header {
237243
if self.first {
238244
self.first = false;
239245
} else {
240-
if !self.old_school {
246+
if !old_school {
241247
write!(self.dst, "\n")?;
242248
}
243249
}
@@ -248,7 +254,7 @@ impl EmitterWriter {
248254
.and_then(|registry| registry.find_description(code))
249255
.is_some() => {
250256
let code_with_explain = String::from("--explain ") + code;
251-
if self.old_school {
257+
if old_school {
252258
let loc = match rsp.span().primary_span() {
253259
Some(COMMAND_LINE_SP) | Some(DUMMY_SP) => "".to_string(),
254260
Some(ps) => self.cm.span_to_string(ps),
@@ -261,7 +267,7 @@ impl EmitterWriter {
261267
}
262268
}
263269
_ => {
264-
if self.old_school {
270+
if old_school {
265271
let loc = match rsp.span().primary_span() {
266272
Some(COMMAND_LINE_SP) | Some(DUMMY_SP) => "".to_string(),
267273
Some(ps) => self.cm.span_to_string(ps),
@@ -303,7 +309,7 @@ impl EmitterWriter {
303309
}
304310
}
305311
}
306-
if self.old_school {
312+
if old_school {
307313
match code {
308314
Some(code) if self.registry.as_ref()
309315
.and_then(|registry| registry.find_description(code))
@@ -363,14 +369,22 @@ impl EmitterWriter {
363369
lvl: Level)
364370
-> io::Result<()>
365371
{
372+
let old_school = match self.format_mode {
373+
FormatMode::NewErrorFormat => false,
374+
FormatMode::OriginalErrorFormat => true,
375+
FormatMode::EnvironmentSelected => check_old_skool()
376+
};
377+
366378
let mut snippet_data = SnippetData::new(self.cm.clone(),
367-
msp.primary_span());
368-
if self.old_school {
379+
msp.primary_span(),
380+
self.format_mode.clone());
381+
if old_school {
369382
let mut output_vec = vec![];
370383

371384
for span_label in msp.span_labels() {
372385
let mut snippet_data = SnippetData::new(self.cm.clone(),
373-
Some(span_label.span));
386+
Some(span_label.span),
387+
self.format_mode.clone());
374388

375389
snippet_data.push(span_label.span,
376390
span_label.is_primary,

src/librustc_errors/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,8 @@ impl Handler {
425425
treat_err_as_bug: bool,
426426
cm: Rc<CodeMapper>)
427427
-> Handler {
428-
let emitter = Box::new(EmitterWriter::stderr(color_config, registry, cm));
428+
let emitter = Box::new(EmitterWriter::stderr(color_config, registry, cm,
429+
snippet::FormatMode::EnvironmentSelected));
429430
Handler::with_emitter(can_emit_warnings, treat_err_as_bug, emitter)
430431
}
431432

src/librustc_errors/snippet.rs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,18 @@ use std::cmp;
1717
use std::rc::Rc;
1818
use std::mem;
1919

20+
#[derive(Clone)]
21+
pub enum FormatMode {
22+
NewErrorFormat,
23+
OriginalErrorFormat,
24+
EnvironmentSelected
25+
}
26+
2027
#[derive(Clone)]
2128
pub struct SnippetData {
2229
codemap: Rc<CodeMapper>,
2330
files: Vec<FileInfo>,
31+
format_mode: FormatMode,
2432
}
2533

2634
#[derive(Clone)]
@@ -35,6 +43,10 @@ pub struct FileInfo {
3543
primary_span: Option<Span>,
3644

3745
lines: Vec<Line>,
46+
47+
/// The type of error format to render. We keep it here so that
48+
/// it's easy to configure for both tests and regular usage
49+
format_mode: FormatMode,
3850
}
3951

4052
#[derive(Clone, Debug)]
@@ -111,7 +123,8 @@ pub enum RenderedLineKind {
111123

112124
impl SnippetData {
113125
pub fn new(codemap: Rc<CodeMapper>,
114-
primary_span: Option<Span>) // (*)
126+
primary_span: Option<Span>,
127+
format_mode: FormatMode) // (*)
115128
-> Self {
116129
// (*) The primary span indicates the file that must appear
117130
// first, and which will have a line number etc in its
@@ -125,7 +138,8 @@ impl SnippetData {
125138

126139
let mut data = SnippetData {
127140
codemap: codemap.clone(),
128-
files: vec![]
141+
files: vec![],
142+
format_mode: format_mode.clone()
129143
};
130144
if let Some(primary_span) = primary_span {
131145
let lo = codemap.lookup_char_pos(primary_span.lo);
@@ -134,6 +148,7 @@ impl SnippetData {
134148
file: lo.file,
135149
primary_span: Some(primary_span),
136150
lines: vec![],
151+
format_mode: format_mode.clone(),
137152
});
138153
}
139154
data
@@ -166,6 +181,7 @@ impl SnippetData {
166181
file: file_map.clone(),
167182
lines: vec![],
168183
primary_span: None,
184+
format_mode: self.format_mode.clone()
169185
});
170186
self.files.last_mut().unwrap()
171187
}
@@ -177,7 +193,7 @@ impl SnippetData {
177193
self.files.iter()
178194
.flat_map(|f| f.render_file_lines(&self.codemap))
179195
.collect();
180-
prepend_prefixes(&mut rendered_lines);
196+
prepend_prefixes(&mut rendered_lines, &self.format_mode);
181197
trim_lines(&mut rendered_lines);
182198
rendered_lines
183199
}
@@ -454,7 +470,11 @@ impl FileInfo {
454470
}
455471

456472
fn render_file_lines(&self, codemap: &Rc<CodeMapper>) -> Vec<RenderedLine> {
457-
let old_school = check_old_skool();
473+
let old_school = match self.format_mode {
474+
FormatMode::OriginalErrorFormat => true,
475+
FormatMode::NewErrorFormat => false,
476+
FormatMode::EnvironmentSelected => check_old_skool()
477+
};
458478

459479
// As a first step, we elide any instance of more than one
460480
// continuous unannotated line.
@@ -590,7 +610,12 @@ impl FileInfo {
590610
}
591611

592612
fn render_line(&self, line: &Line) -> Vec<RenderedLine> {
593-
let old_school = check_old_skool();
613+
let old_school = match self.format_mode {
614+
FormatMode::OriginalErrorFormat => true,
615+
FormatMode::NewErrorFormat => false,
616+
FormatMode::EnvironmentSelected => check_old_skool()
617+
};
618+
594619
let source_string = self.file.get_line(line.line_index)
595620
.unwrap_or("");
596621
let source_kind = RenderedLineKind::SourceText {
@@ -775,8 +800,12 @@ impl FileInfo {
775800
}
776801
}
777802

778-
fn prepend_prefixes(rendered_lines: &mut [RenderedLine]) {
779-
let old_school = check_old_skool();
803+
fn prepend_prefixes(rendered_lines: &mut [RenderedLine], format_mode: &FormatMode) {
804+
let old_school = match *format_mode {
805+
FormatMode::OriginalErrorFormat => true,
806+
FormatMode::NewErrorFormat => false,
807+
FormatMode::EnvironmentSelected => check_old_skool()
808+
};
780809
if old_school {
781810
return;
782811
}

0 commit comments

Comments
 (0)