Skip to content

Commit 8d9e542

Browse files
Timmmmkaryon
authored andcommitted
Fix newlines in JSON output (rust-lang#4262)
* Fix newlines in JSON output This changes the JSON output to be more consistent about where newlines are included. Previously it only included them between lines in a multiline diff. That meant single line changes were treated a bit weirdly. This changes it to append a newline to every line. When feeding the results into `arc lint` this behaves correctly. I have only done limited testing though, in particular there's a possibility it might not work with files with `\r\n` endings (though that would have been the case before too). Fixes rust-lang#4259 * Update tests # Conflicts: # tests/writemode/target/output.json
1 parent 187c291 commit 8d9e542

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

Diff for: src/emitter/json.rs

+20-18
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,22 @@ impl JsonEmitter {
6565
let mut expected_end_line = expected_begin_line;
6666
let mut original_line_counter = 0;
6767
let mut expected_line_counter = 0;
68-
let mut original_lines = vec![];
69-
let mut expected_lines = vec![];
68+
let mut original = String::new();
69+
let mut expected = String::new();
7070

7171
for line in mismatch.lines {
7272
match line {
7373
DiffLine::Expected(msg) => {
7474
expected_end_line = expected_begin_line + expected_line_counter;
7575
expected_line_counter += 1;
76-
expected_lines.push(msg)
76+
expected.push_str(&msg);
77+
expected.push('\n');
7778
}
7879
DiffLine::Resulting(msg) => {
7980
original_end_line = original_begin_line + original_line_counter;
8081
original_line_counter += 1;
81-
original_lines.push(msg)
82+
original.push_str(&msg);
83+
original.push('\n');
8284
}
8385
DiffLine::Context(_) => continue,
8486
}
@@ -89,8 +91,8 @@ impl JsonEmitter {
8991
original_end_line,
9092
expected_begin_line,
9193
expected_end_line,
92-
original: original_lines.join("\n"),
93-
expected: expected_lines.join("\n"),
94+
original,
95+
expected,
9496
});
9597
}
9698
self.mismatched_files.push(MismatchedFile {
@@ -120,8 +122,8 @@ mod tests {
120122
original_end_line: 79,
121123
expected_begin_line: 79,
122124
expected_end_line: 82,
123-
original: String::from("fn Foo<T>() where T: Bar {"),
124-
expected: String::from("fn Foo<T>()\nwhere\n T: Bar,\n{"),
125+
original: String::from("fn Foo<T>() where T: Bar {\n"),
126+
expected: String::from("fn Foo<T>()\nwhere\n T: Bar,\n{\n"),
125127
}],
126128
};
127129
let mismatch = Mismatch {
@@ -158,10 +160,10 @@ mod tests {
158160
expected_begin_line: 5,
159161
expected_end_line: 5,
160162
original: String::from(
161-
"fn foo(_x: &u64) -> Option<&(dyn::std::error::Error + 'static)> {",
163+
"fn foo(_x: &u64) -> Option<&(dyn::std::error::Error + 'static)> {\n",
162164
),
163165
expected: String::from(
164-
"fn foo(_x: &u64) -> Option<&(dyn ::std::error::Error + 'static)> {",
166+
"fn foo(_x: &u64) -> Option<&(dyn ::std::error::Error + 'static)> {\n",
165167
),
166168
}],
167169
};
@@ -260,19 +262,19 @@ mod tests {
260262
original_end_line: 2,
261263
expected_begin_line: 2,
262264
expected_end_line: 2,
263-
original: String::from("println!(\"Hello, world!\");"),
264-
expected: String::from(" println!(\"Hello, world!\");"),
265+
original: String::from("println!(\"Hello, world!\");\n"),
266+
expected: String::from(" println!(\"Hello, world!\");\n"),
265267
},
266268
MismatchedBlock {
267269
original_begin_line: 7,
268270
original_end_line: 10,
269271
expected_begin_line: 7,
270272
expected_end_line: 10,
271273
original: String::from(
272-
"#[test]\nfn it_works() {\n assert_eq!(2 + 2, 4);\n}",
274+
"#[test]\nfn it_works() {\n assert_eq!(2 + 2, 4);\n}\n",
273275
),
274276
expected: String::from(
275-
" #[test]\n fn it_works() {\n assert_eq!(2 + 2, 4);\n }",
277+
" #[test]\n fn it_works() {\n assert_eq!(2 + 2, 4);\n }\n",
276278
),
277279
},
278280
],
@@ -321,8 +323,8 @@ mod tests {
321323
original_end_line: 2,
322324
expected_begin_line: 2,
323325
expected_end_line: 2,
324-
original: String::from("println!(\"Hello, world!\");"),
325-
expected: String::from(" println!(\"Hello, world!\");"),
326+
original: String::from("println!(\"Hello, world!\");\n"),
327+
expected: String::from(" println!(\"Hello, world!\");\n"),
326328
}],
327329
};
328330

@@ -333,8 +335,8 @@ mod tests {
333335
original_end_line: 2,
334336
expected_begin_line: 2,
335337
expected_end_line: 2,
336-
original: String::from("println!(\"Greetings!\");"),
337-
expected: String::from(" println!(\"Greetings!\");"),
338+
original: String::from("println!(\"Greetings!\");\n"),
339+
expected: String::from(" println!(\"Greetings!\");\n"),
338340
}],
339341
};
340342

Diff for: tests/writemode/target/output.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"name":"tests/writemode/source/json.rs","mismatches":[{"original_begin_line":5,"original_end_line":7,"expected_begin_line":5,"expected_end_line":5,"original":"fn foo_expr() {\n 1\n}","expected":"fn foo_expr() { 1 }"},{"original_begin_line":9,"original_end_line":11,"expected_begin_line":7,"expected_end_line":7,"original":"fn foo_stmt() {\n foo();\n}","expected":"fn foo_stmt() { foo(); }"},{"original_begin_line":13,"original_end_line":15,"expected_begin_line":9,"expected_end_line":9,"original":"fn foo_decl_local() {\n let z = 5;\n }","expected":"fn foo_decl_local() { let z = 5; }"},{"original_begin_line":17,"original_end_line":19,"expected_begin_line":11,"expected_end_line":11,"original":"fn foo_decl_item(x: &mut i32) {\n x = 3;\n}","expected":"fn foo_decl_item(x: &mut i32) { x = 3; }"},{"original_begin_line":21,"original_end_line":21,"expected_begin_line":13,"expected_end_line":13,"original":" fn empty() {","expected":"fn empty() {}"},{"original_begin_line":23,"original_end_line":23,"expected_begin_line":15,"expected_end_line":15,"original":"}","expected":"fn foo_return() -> String { \"yay\" }"},{"original_begin_line":25,"original_end_line":29,"expected_begin_line":17,"expected_end_line":20,"original":"fn foo_return() -> String {\n \"yay\"\n}\n\nfn foo_where() -> T where T: Sync {","expected":"fn foo_where() -> T\nwhere\n T: Sync,\n{"},{"original_begin_line":64,"original_end_line":66,"expected_begin_line":55,"expected_end_line":55,"original":"fn lots_of_space () {\n 1 \n}","expected":"fn lots_of_space() { 1 }"},{"original_begin_line":71,"original_end_line":72,"expected_begin_line":60,"expected_end_line":60,"original":" fn dummy(&self) {\n }","expected":" fn dummy(&self) {}"},{"original_begin_line":75,"original_end_line":75,"expected_begin_line":63,"expected_end_line":64,"original":"trait CoolerTypes { fn dummy(&self) { ","expected":"trait CoolerTypes {\n fn dummy(&self) {}"},{"original_begin_line":77,"original_end_line":77,"expected_begin_line":66,"expected_end_line":66,"original":"}","expected":""},{"original_begin_line":79,"original_end_line":79,"expected_begin_line":67,"expected_end_line":70,"original":"fn Foo<T>() where T: Bar {","expected":"fn Foo<T>()\nwhere\n T: Bar,\n{"}]}]
1+
[{"name":"tests/writemode/source/json.rs","mismatches":[{"original_begin_line":5,"original_end_line":7,"expected_begin_line":5,"expected_end_line":5,"original":"fn foo_expr() {\n 1\n}\n","expected":"fn foo_expr() { 1 }\n"},{"original_begin_line":9,"original_end_line":11,"expected_begin_line":7,"expected_end_line":7,"original":"fn foo_stmt() {\n foo();\n}\n","expected":"fn foo_stmt() { foo(); }\n"},{"original_begin_line":13,"original_end_line":15,"expected_begin_line":9,"expected_end_line":9,"original":"fn foo_decl_local() {\n let z = 5;\n }\n","expected":"fn foo_decl_local() { let z = 5; }\n"},{"original_begin_line":17,"original_end_line":19,"expected_begin_line":11,"expected_end_line":11,"original":"fn foo_decl_item(x: &mut i32) {\n x = 3;\n}\n","expected":"fn foo_decl_item(x: &mut i32) { x = 3; }\n"},{"original_begin_line":21,"original_end_line":21,"expected_begin_line":13,"expected_end_line":13,"original":" fn empty() {\n","expected":"fn empty() {}\n"},{"original_begin_line":23,"original_end_line":23,"expected_begin_line":15,"expected_end_line":15,"original":"}\n","expected":"fn foo_return() -> String { \"yay\" }\n"},{"original_begin_line":25,"original_end_line":29,"expected_begin_line":17,"expected_end_line":20,"original":"fn foo_return() -> String {\n \"yay\"\n}\n\nfn foo_where() -> T where T: Sync {\n","expected":"fn foo_where() -> T\nwhere\n T: Sync,\n{\n"},{"original_begin_line":64,"original_end_line":66,"expected_begin_line":55,"expected_end_line":55,"original":"fn lots_of_space () {\n 1 \n}\n","expected":"fn lots_of_space() { 1 }\n"},{"original_begin_line":71,"original_end_line":72,"expected_begin_line":60,"expected_end_line":60,"original":" fn dummy(&self) {\n }\n","expected":" fn dummy(&self) {}\n"},{"original_begin_line":75,"original_end_line":75,"expected_begin_line":63,"expected_end_line":64,"original":"trait CoolerTypes { fn dummy(&self) { \n","expected":"trait CoolerTypes {\n fn dummy(&self) {}\n"},{"original_begin_line":77,"original_end_line":77,"expected_begin_line":66,"expected_end_line":66,"original":"}\n","expected":""},{"original_begin_line":79,"original_end_line":79,"expected_begin_line":67,"expected_end_line":70,"original":"fn Foo<T>() where T: Bar {\n","expected":"fn Foo<T>()\nwhere\n T: Bar,\n{\n"}]}]

Diff for: tests/writemode/target/stdin.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"name":"stdin","mismatches":[{"original_begin_line":1,"original_end_line":6,"expected_begin_line":1,"expected_end_line":2,"original":"\nfn\n some( )\n{\n}\nfn main () {}","expected":"fn some() {}\nfn main() {}"}]}]
1+
[{"name":"stdin","mismatches":[{"original_begin_line":1,"original_end_line":6,"expected_begin_line":1,"expected_end_line":2,"original":"\nfn\n some( )\n{\n}\nfn main () {}\n","expected":"fn some() {}\nfn main() {}\n"}]}]

0 commit comments

Comments
 (0)