Add -Zapproximate-suggestions

This commit is contained in:
Manish Goregaokar 2018-01-19 13:04:14 +05:30
parent 937bc2e04a
commit a53bdc6212
3 changed files with 24 additions and 6 deletions

View file

@ -1288,6 +1288,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
dep_info_omit_d_target: bool = (false, parse_bool, [TRACKED],
"in dep-info output, omit targets for tracking dependencies of the dep-info files \
themselves"),
approximate_suggestions: bool = (false, parse_bool, [UNTRACKED],
"include machine-applicability of suggestions in JSON output"),
unpretty: Option<String> = (None, parse_unpretty, [UNTRACKED],
"Present the input source, unstable (and less-pretty) variants;
valid types are any of the types for `--pretty`, as well as:

View file

@ -910,10 +910,12 @@ pub fn build_session_with_codemap(sopts: config::Options,
Box::new(EmitterWriter::new(dst, Some(codemap.clone()), false))
}
(config::ErrorOutputType::Json(pretty), None) => {
Box::new(JsonEmitter::stderr(Some(registry), codemap.clone(), pretty))
Box::new(JsonEmitter::stderr(Some(registry), codemap.clone(),
pretty, sopts.debugging_opts.approximate_suggestions))
}
(config::ErrorOutputType::Json(pretty), Some(dst)) => {
Box::new(JsonEmitter::new(dst, Some(registry), codemap.clone(), pretty))
Box::new(JsonEmitter::new(dst, Some(registry), codemap.clone(),
pretty, sopts.debugging_opts.approximate_suggestions))
}
(config::ErrorOutputType::Short(color_config), None) => {
Box::new(EmitterWriter::stderr(color_config, Some(codemap.clone()), true))

View file

@ -38,34 +38,41 @@ pub struct JsonEmitter {
registry: Option<Registry>,
cm: Rc<CodeMapper + 'static>,
pretty: bool,
/// Whether "approximate suggestions" are enabled in the config
approximate_suggestions: bool,
}
impl JsonEmitter {
pub fn stderr(registry: Option<Registry>,
code_map: Rc<CodeMap>,
pretty: bool) -> JsonEmitter {
pretty: bool,
approximate_suggestions: bool) -> JsonEmitter {
JsonEmitter {
dst: Box::new(io::stderr()),
registry,
cm: code_map,
pretty,
approximate_suggestions,
}
}
pub fn basic(pretty: bool) -> JsonEmitter {
let file_path_mapping = FilePathMapping::empty();
JsonEmitter::stderr(None, Rc::new(CodeMap::new(file_path_mapping)), pretty)
JsonEmitter::stderr(None, Rc::new(CodeMap::new(file_path_mapping)),
pretty, false)
}
pub fn new(dst: Box<Write + Send>,
registry: Option<Registry>,
code_map: Rc<CodeMap>,
pretty: bool) -> JsonEmitter {
pretty: bool,
approximate_suggestions: bool) -> JsonEmitter {
JsonEmitter {
dst,
registry,
cm: code_map,
pretty,
approximate_suggestions,
}
}
}
@ -283,6 +290,13 @@ impl DiagnosticSpan {
def_site_span,
})
});
let suggestion_approximate = if je.approximate_suggestions {
suggestion.map(|x| x.1)
} else {
None
};
DiagnosticSpan {
file_name: start.file.name.to_string(),
byte_start: span.lo().0 - start.file.start_pos.0,
@ -294,7 +308,7 @@ impl DiagnosticSpan {
is_primary,
text: DiagnosticSpanLine::from_span(span, je),
suggested_replacement: suggestion.map(|x| x.0.clone()),
suggestion_approximate: suggestion.map(|x| x.1),
suggestion_approximate,
expansion: backtrace_step,
label,
}