install_sh(builder, "docs", "rust-docs", stage, Some(host));
}
-pub fn install_std(builder: &Builder, stage: u32) {
- for target in &builder.build.targets {
- install_sh(builder, "std", "rust-std", stage, Some(*target));
- }
+pub fn install_std(builder: &Builder, stage: u32, target: Interned<String>) {
+ install_sh(builder, "std", "rust-std", stage, Some(target));
}
pub fn install_cargo(builder: &Builder, stage: u32, host: Interned<String>) {
install_docs(builder, self.stage, self.target);
};
Std, "src/libstd", true, only_hosts: true, {
- builder.ensure(dist::Std {
- compiler: builder.compiler(self.stage, self.host),
- target: self.target
- });
- install_std(builder, self.stage);
+ for target in &builder.build.targets {
+ builder.ensure(dist::Std {
+ compiler: builder.compiler(self.stage, self.host),
+ target: *target
+ });
+ install_std(builder, self.stage, *target);
+ }
};
Cargo, "cargo", _config.extended, only_hosts: true, {
builder.ensure(dist::Cargo { stage: self.stage, target: self.target });
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ErrorOutputType {
HumanReadable(ColorConfig),
- Json,
+ Json(bool),
Short(ColorConfig),
}
let error_format = if matches.opts_present(&["error-format".to_owned()]) {
match matches.opt_str("error-format").as_ref().map(|s| &s[..]) {
Some("human") => ErrorOutputType::HumanReadable(color),
- Some("json") => ErrorOutputType::Json,
+ Some("json") => ErrorOutputType::Json(false),
+ Some("pretty-json") => ErrorOutputType::Json(true),
Some("short") => ErrorOutputType::Short(color),
None => ErrorOutputType::HumanReadable(color),
let debugging_opts = build_debugging_options(matches, error_format);
+ if !debugging_opts.unstable_options && error_format == ErrorOutputType::Json(true) {
+ early_error(ErrorOutputType::Json(false),
+ "--error-format=pretty-json is unstable");
+ }
+
let mut output_types = BTreeMap::new();
if !debugging_opts.parse_only {
for list in matches.opt_strs("emit") {
let mut v5 = super::basic_options();
// Reference
- v1.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v1.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v1.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v1.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v1.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
+ v1.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
// Native changed
- v2.search_paths.add_path("native=XXX", super::ErrorOutputType::Json);
- v2.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
+ v2.search_paths.add_path("native=XXX", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
// Crate changed
- v2.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v2.search_paths.add_path("crate=XXX", super::ErrorOutputType::Json);
- v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
+ v2.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("crate=XXX", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
// Dependency changed
- v3.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v3.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v3.search_paths.add_path("dependency=XXX", super::ErrorOutputType::Json);
- v3.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v3.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
+ v3.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("dependency=XXX", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
// Framework changed
- v4.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v4.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v4.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v4.search_paths.add_path("framework=XXX", super::ErrorOutputType::Json);
- v4.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
+ v4.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("framework=XXX", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
// All changed
- v5.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v5.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v5.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v5.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v5.search_paths.add_path("all=XXX", super::ErrorOutputType::Json);
+ v5.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v5.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v5.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v5.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v5.search_paths.add_path("all=XXX", super::ErrorOutputType::Json(false));
assert!(v1.dep_tracking_hash() != v2.dep_tracking_hash());
assert!(v1.dep_tracking_hash() != v3.dep_tracking_hash());
let mut v4 = super::basic_options();
// Reference
- v1.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v1.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v1.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v1.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v1.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
-
- v2.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v2.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
-
- v3.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v3.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
- v3.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v3.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v3.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
-
- v4.search_paths.add_path("all=mno", super::ErrorOutputType::Json);
- v4.search_paths.add_path("native=abc", super::ErrorOutputType::Json);
- v4.search_paths.add_path("crate=def", super::ErrorOutputType::Json);
- v4.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json);
- v4.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json);
+ v1.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v1.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
+
+ v2.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v2.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
+
+ v3.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v3.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
+
+ v4.search_paths.add_path("all=mno", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("native=abc", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("crate=def", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ v4.search_paths.add_path("framework=jkl", super::ErrorOutputType::Json(false));
assert!(v1.dep_tracking_hash() == v2.dep_tracking_hash());
assert!(v1.dep_tracking_hash() == v3.dep_tracking_hash());
match self.opts.error_format {
// when outputting JSON for tool consumption, the tool might want
// the duplicates
- config::ErrorOutputType::Json => {
+ config::ErrorOutputType::Json(_) => {
do_method()
},
_ => {
(config::ErrorOutputType::HumanReadable(_), Some(dst)) => {
Box::new(EmitterWriter::new(dst, Some(codemap.clone()), false))
}
- (config::ErrorOutputType::Json, None) => {
- Box::new(JsonEmitter::stderr(Some(registry), codemap.clone()))
+ (config::ErrorOutputType::Json(pretty), None) => {
+ Box::new(JsonEmitter::stderr(Some(registry), codemap.clone(), pretty))
}
- (config::ErrorOutputType::Json, Some(dst)) => {
- Box::new(JsonEmitter::new(dst, Some(registry), codemap.clone()))
+ (config::ErrorOutputType::Json(pretty), Some(dst)) => {
+ Box::new(JsonEmitter::new(dst, Some(registry), codemap.clone(), pretty))
}
(config::ErrorOutputType::Short(color_config), None) => {
Box::new(EmitterWriter::stderr(color_config, Some(codemap.clone()), true))
config::ErrorOutputType::HumanReadable(color_config) => {
Box::new(EmitterWriter::stderr(color_config, None, false))
}
- config::ErrorOutputType::Json => Box::new(JsonEmitter::basic()),
+ config::ErrorOutputType::Json(pretty) => Box::new(JsonEmitter::basic(pretty)),
config::ErrorOutputType::Short(color_config) => {
Box::new(EmitterWriter::stderr(color_config, None, true))
}
config::ErrorOutputType::HumanReadable(color_config) => {
Box::new(EmitterWriter::stderr(color_config, None, false))
}
- config::ErrorOutputType::Json => Box::new(JsonEmitter::basic()),
+ config::ErrorOutputType::Json(pretty) => Box::new(JsonEmitter::basic(pretty)),
config::ErrorOutputType::Short(color_config) => {
Box::new(EmitterWriter::stderr(color_config, None, true))
}
#[stable(feature = "rust1", since = "1.0.0")]
pub fn get_mut(&mut self) -> &mut R { &mut self.inner }
+ /// Returns `true` if there are no bytes in the internal buffer.
+ ///
+ /// # Examples
+ /// ```
+ /// # #![feature(bufreader_is_empty)]
+ /// use std::io::BufReader;
+ /// use std::io::BufRead;
+ /// use std::fs::File;
+ ///
+ /// # fn foo() -> std::io::Result<()> {
+ /// let f1 = File::open("log.txt")?;
+ /// let mut reader = BufReader::new(f1);
+ /// assert!(reader.is_empty());
+ ///
+ /// if reader.fill_buf()?.len() > 0 {
+ /// assert!(!reader.is_empty());
+ /// }
+ /// # Ok(())
+ /// # }
+ /// ```
+ #[unstable(feature = "bufreader_is_empty", issue = "45323", reason = "recently added")]
+ pub fn is_empty(&self) -> bool {
+ self.pos == self.cap
+ }
+
/// Unwraps this `BufReader`, returning the underlying reader.
///
/// Note that any leftover data in the internal buffer is lost.
use std::io::{self, Write};
use std::vec;
-use rustc_serialize::json::as_json;
+use rustc_serialize::json::{as_json, as_pretty_json};
pub struct JsonEmitter {
dst: Box<Write + Send>,
registry: Option<Registry>,
cm: Rc<CodeMapper + 'static>,
+ pretty: bool,
}
impl JsonEmitter {
pub fn stderr(registry: Option<Registry>,
- code_map: Rc<CodeMap>) -> JsonEmitter {
+ code_map: Rc<CodeMap>,
+ pretty: bool) -> JsonEmitter {
JsonEmitter {
dst: Box::new(io::stderr()),
registry,
cm: code_map,
+ pretty,
}
}
- pub fn basic() -> JsonEmitter {
+ pub fn basic(pretty: bool) -> JsonEmitter {
let file_path_mapping = FilePathMapping::empty();
- JsonEmitter::stderr(None, Rc::new(CodeMap::new(file_path_mapping)))
+ JsonEmitter::stderr(None, Rc::new(CodeMap::new(file_path_mapping)), pretty)
}
pub fn new(dst: Box<Write + Send>,
registry: Option<Registry>,
- code_map: Rc<CodeMap>) -> JsonEmitter {
+ code_map: Rc<CodeMap>,
+ pretty: bool) -> JsonEmitter {
JsonEmitter {
dst,
registry,
cm: code_map,
+ pretty,
}
}
}
impl Emitter for JsonEmitter {
fn emit(&mut self, db: &DiagnosticBuilder) {
let data = Diagnostic::from_diagnostic_builder(db, self);
- if let Err(e) = writeln!(&mut self.dst, "{}", as_json(&data)) {
+ let result = if self.pretty {
+ writeln!(&mut self.dst, "{}", as_pretty_json(&data))
+ } else {
+ writeln!(&mut self.dst, "{}", as_json(&data))
+ };
+ if let Err(e) = result {
panic!("failed to print diagnostics: {:?}", e);
}
}
spans: Vec<DiagnosticSpan>,
/// Associated diagnostic messages.
children: Vec<Diagnostic>,
- /// The message as rustc would render it. Currently this is only
- /// `Some` for "suggestions", but eventually it will include all
- /// snippets.
+ /// The message as rustc would render it. Currently this is always `None`
rendered: Option<String>,
}
/// Label that should be placed at this location (if any)
label: Option<String>,
/// If we are suggesting a replacement, this will contain text
- /// that should be sliced in atop this span. You may prefer to
- /// load the fully rendered version from the parent `Diagnostic`,
- /// however.
+ /// that should be sliced in atop this span.
suggested_replacement: Option<String>,
/// Macro invocations that created the code at this span, if any.
expansion: Option<Box<DiagnosticSpanMacroExpansion>>,
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags: --error-format json
+// compile-flags: --error-format pretty-json -Zunstable-options
// The output for humans should just highlight the whole span without showing
// the suggested replacement, but we also want to test that suggested
-{"message":"unnecessary parentheses around assigned value","code":{"code":"unused_parens","explanation":null},"level":"warning","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":1001,"byte_end":1014,"line_start":24,"line_end":24,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":null,"expansion":null}],"children":[{"message":"lint level defined here","code":null,"level":"note","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":847,"byte_end":860,"line_start":19,"line_end":19,"column_start":9,"column_end":22,"is_primary":true,"text":[{"text":"#![warn(unused_parens)]","highlight_start":9,"highlight_end":22}],"label":null,"suggested_replacement":null,"expansion":null}],"children":[],"rendered":null},{"message":"remove these parentheses","code":null,"level":"help","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":1001,"byte_end":1014,"line_start":24,"line_end":24,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":"1 / (2 + 3)","expansion":null}],"children":[],"rendered":null}],"rendered":null}
+{
+ "message": "unnecessary parentheses around assigned value",
+ "code": {
+ "code": "unused_parens",
+ "explanation": null
+ },
+ "level": "warning",
+ "spans": [
+ {
+ "file_name": "$DIR/unused_parens_json_suggestion.rs",
+ "byte_start": 1027,
+ "byte_end": 1040,
+ "line_start": 24,
+ "line_end": 24,
+ "column_start": 14,
+ "column_end": 27,
+ "is_primary": true,
+ "text": [
+ {
+ "text": " let _a = (1 / (2 + 3));",
+ "highlight_start": 14,
+ "highlight_end": 27
+ }
+ ],
+ "label": null,
+ "suggested_replacement": null,
+ "expansion": null
+ }
+ ],
+ "children": [
+ {
+ "message": "lint level defined here",
+ "code": null,
+ "level": "note",
+ "spans": [
+ {
+ "file_name": "$DIR/unused_parens_json_suggestion.rs",
+ "byte_start": 873,
+ "byte_end": 886,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 9,
+ "column_end": 22,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "#![warn(unused_parens)]",
+ "highlight_start": 9,
+ "highlight_end": 22
+ }
+ ],
+ "label": null,
+ "suggested_replacement": null,
+ "expansion": null
+ }
+ ],
+ "children": [],
+ "rendered": null
+ },
+ {
+ "message": "remove these parentheses",
+ "code": null,
+ "level": "help",
+ "spans": [
+ {
+ "file_name": "$DIR/unused_parens_json_suggestion.rs",
+ "byte_start": 1027,
+ "byte_end": 1040,
+ "line_start": 24,
+ "line_end": 24,
+ "column_start": 14,
+ "column_end": 27,
+ "is_primary": true,
+ "text": [
+ {
+ "text": " let _a = (1 / (2 + 3));",
+ "highlight_start": 14,
+ "highlight_end": 27
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "1 / (2 + 3)",
+ "expansion": null
+ }
+ ],
+ "children": [],
+ "rendered": null
+ }
+ ],
+ "rendered": null
+}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// compile-flags: --error-format json
+// compile-flags: --error-format pretty-json -Zunstable-options
// The output for humans should just highlight the whole span without showing
// the suggested replacement, but we also want to test that suggested
-{"message":"cannot find type `Iter` in this scope","code":{"code":"E0412","explanation":"/nThe type name used is not in scope./n/nErroneous code examples:/n/n```compile_fail,E0412/nimpl Something {} // error: type name `Something` is not in scope/n/n// or:/n/ntrait Foo {/n fn bar(N); // error: type name `N` is not in scope/n}/n/n// or:/n/nfn foo(x: T) {} // type name `T` is not in scope/n```/n/nTo fix this error, please verify you didn't misspell the type name, you did/ndeclare it or imported it into the scope. Examples:/n/n```/nstruct Something;/n/nimpl Something {} // ok!/n/n// or:/n/ntrait Foo {/n type N;/n/n fn bar(_: Self::N); // ok!/n}/n/n// or:/n/nfn foo<T>(x: T) {} // ok!/n```/n/nAnother case that causes this error is when a type is imported into a parent/nmodule. To fix this, you can follow the suggestion and use File directly or/n`use super::File;` which will import the types from the parent namespace. An/nexample that causes this error is below:/n/n```compile_fail,E0412/nuse std::fs::File;/n/nmod foo {/n fn some_function(f: File) {}/n}/n```/n/n```/nuse std::fs::File;/n/nmod foo {/n // either/n use super::File;/n // or/n // use std::fs::File;/n fn foo(f: File) {}/n}/n# fn main() {} // don't insert it for us; that'll break imports/n```/n"},"level":"error","spans":[{"file_name":"$DIR/use_suggestion_json.rs","byte_start":862,"byte_end":866,"line_start":20,"line_end":20,"column_start":12,"column_end":16,"is_primary":true,"text":[{"text":" let x: Iter;","highlight_start":12,"highlight_end":16}],"label":"not found in this scope","suggested_replacement":null,"expansion":null}],"children":[{"message":"possible candidates are found in other modules, you can import them into scope","code":null,"level":"help","spans":[{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::binary_heap::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::btree_map::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::btree_set::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::hash_map::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::hash_set::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::linked_list::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::collections::vec_deque::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::option::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::path::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::result::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::slice::Iter;/n/n","expansion":null},{"file_name":"$DIR/use_suggestion_json.rs","byte_start":839,"byte_end":839,"line_start":19,"line_end":19,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"fn main() {","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"use std::sync::mpsc::Iter;/n/n","expansion":null}],"children":[],"rendered":null}],"rendered":null}
-{"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":null}
+{
+ "message": "cannot find type `Iter` in this scope",
+ "code": {
+ "code": "E0412",
+ "explanation": "/nThe type name used is not in scope./n/nErroneous code examples:/n/n```compile_fail,E0412/nimpl Something {} // error: type name `Something` is not in scope/n/n// or:/n/ntrait Foo {/n fn bar(N); // error: type name `N` is not in scope/n}/n/n// or:/n/nfn foo(x: T) {} // type name `T` is not in scope/n```/n/nTo fix this error, please verify you didn't misspell the type name, you did/ndeclare it or imported it into the scope. Examples:/n/n```/nstruct Something;/n/nimpl Something {} // ok!/n/n// or:/n/ntrait Foo {/n type N;/n/n fn bar(_: Self::N); // ok!/n}/n/n// or:/n/nfn foo<T>(x: T) {} // ok!/n```/n/nAnother case that causes this error is when a type is imported into a parent/nmodule. To fix this, you can follow the suggestion and use File directly or/n`use super::File;` which will import the types from the parent namespace. An/nexample that causes this error is below:/n/n```compile_fail,E0412/nuse std::fs::File;/n/nmod foo {/n fn some_function(f: File) {}/n}/n```/n/n```/nuse std::fs::File;/n/nmod foo {/n // either/n use super::File;/n // or/n // use std::fs::File;/n fn foo(f: File) {}/n}/n# fn main() {} // don't insert it for us; that'll break imports/n```/n"
+ },
+ "level": "error",
+ "spans": [
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 888,
+ "byte_end": 892,
+ "line_start": 20,
+ "line_end": 20,
+ "column_start": 12,
+ "column_end": 16,
+ "is_primary": true,
+ "text": [
+ {
+ "text": " let x: Iter;",
+ "highlight_start": 12,
+ "highlight_end": 16
+ }
+ ],
+ "label": "not found in this scope",
+ "suggested_replacement": null,
+ "expansion": null
+ }
+ ],
+ "children": [
+ {
+ "message": "possible candidates are found in other modules, you can import them into scope",
+ "code": null,
+ "level": "help",
+ "spans": [
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::binary_heap::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::btree_map::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::btree_set::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::hash_map::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::hash_set::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::linked_list::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::collections::vec_deque::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::option::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::path::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::result::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::slice::Iter;/n/n",
+ "expansion": null
+ },
+ {
+ "file_name": "$DIR/use_suggestion_json.rs",
+ "byte_start": 865,
+ "byte_end": 865,
+ "line_start": 19,
+ "line_end": 19,
+ "column_start": 1,
+ "column_end": 1,
+ "is_primary": true,
+ "text": [
+ {
+ "text": "fn main() {",
+ "highlight_start": 1,
+ "highlight_end": 1
+ }
+ ],
+ "label": null,
+ "suggested_replacement": "use std::sync::mpsc::Iter;/n/n",
+ "expansion": null
+ }
+ ],
+ "children": [],
+ "rendered": null
+ }
+ ],
+ "rendered": null
+}
+{
+ "message": "aborting due to previous error",
+ "code": null,
+ "level": "error",
+ "spans": [],
+ "children": [],
+ "rendered": null
+}
fn normalize_output(&self, output: &str, custom_rules: &[(String, String)]) -> String {
let parent_dir = self.testpaths.file.parent().unwrap();
let cflags = self.props.compile_flags.join(" ");
- let parent_dir_str = if cflags.contains("--error-format json") {
+ let parent_dir_str = if cflags.contains("--error-format json")
+ || cflags.contains("--error-format pretty-json") {
parent_dir.display().to_string().replace("\\", "\\\\")
} else {
parent_dir.display().to_string()