Skip to content

Commit e208a39

Browse files
authored
Fix newlines in JSON output (#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 #4259 * Update tests
1 parent e47881b commit e208a39

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
@@ -67,20 +67,22 @@ impl JsonEmitter {
6767
let mut expected_end_line = expected_begin_line;
6868
let mut original_line_counter = 0;
6969
let mut expected_line_counter = 0;
70-
let mut original_lines = vec![];
71-
let mut expected_lines = vec![];
70+
let mut original = String::new();
71+
let mut expected = String::new();
7272

7373
for line in mismatch.lines {
7474
match line {
7575
DiffLine::Expected(msg) => {
7676
expected_end_line = expected_begin_line + expected_line_counter;
7777
expected_line_counter += 1;
78-
expected_lines.push(msg)
78+
expected.push_str(&msg);
79+
expected.push('\n');
7980
}
8081
DiffLine::Resulting(msg) => {
8182
original_end_line = original_begin_line + original_line_counter;
8283
original_line_counter += 1;
83-
original_lines.push(msg)
84+
original.push_str(&msg);
85+
original.push('\n');
8486
}
8587
DiffLine::Context(_) => continue,
8688
}
@@ -91,8 +93,8 @@ impl JsonEmitter {
9193
original_end_line,
9294
expected_begin_line,
9395
expected_end_line,
94-
original: original_lines.join("\n"),
95-
expected: expected_lines.join("\n"),
96+
original,
97+
expected,
9698
});
9799
}
98100
self.mismatched_files.push(MismatchedFile {
@@ -122,8 +124,8 @@ mod tests {
122124
original_end_line: 79,
123125
expected_begin_line: 79,
124126
expected_end_line: 82,
125-
original: String::from("fn Foo<T>() where T: Bar {"),
126-
expected: String::from("fn Foo<T>()\nwhere\n T: Bar,\n{"),
127+
original: String::from("fn Foo<T>() where T: Bar {\n"),
128+
expected: String::from("fn Foo<T>()\nwhere\n T: Bar,\n{\n"),
127129
}],
128130
};
129131
let mismatch = Mismatch {
@@ -160,10 +162,10 @@ mod tests {
160162
expected_begin_line: 5,
161163
expected_end_line: 5,
162164
original: String::from(
163-
"fn foo(_x: &u64) -> Option<&(dyn::std::error::Error + 'static)> {",
165+
"fn foo(_x: &u64) -> Option<&(dyn::std::error::Error + 'static)> {\n",
164166
),
165167
expected: String::from(
166-
"fn foo(_x: &u64) -> Option<&(dyn ::std::error::Error + 'static)> {",
168+
"fn foo(_x: &u64) -> Option<&(dyn ::std::error::Error + 'static)> {\n",
167169
),
168170
}],
169171
};
@@ -262,19 +264,19 @@ mod tests {
262264
original_end_line: 2,
263265
expected_begin_line: 2,
264266
expected_end_line: 2,
265-
original: String::from("println!(\"Hello, world!\");"),
266-
expected: String::from(" println!(\"Hello, world!\");"),
267+
original: String::from("println!(\"Hello, world!\");\n"),
268+
expected: String::from(" println!(\"Hello, world!\");\n"),
267269
},
268270
MismatchedBlock {
269271
original_begin_line: 7,
270272
original_end_line: 10,
271273
expected_begin_line: 7,
272274
expected_end_line: 10,
273275
original: String::from(
274-
"#[test]\nfn it_works() {\n assert_eq!(2 + 2, 4);\n}",
276+
"#[test]\nfn it_works() {\n assert_eq!(2 + 2, 4);\n}\n",
275277
),
276278
expected: String::from(
277-
" #[test]\n fn it_works() {\n assert_eq!(2 + 2, 4);\n }",
279+
" #[test]\n fn it_works() {\n assert_eq!(2 + 2, 4);\n }\n",
278280
),
279281
},
280282
],
@@ -323,8 +325,8 @@ mod tests {
323325
original_end_line: 2,
324326
expected_begin_line: 2,
325327
expected_end_line: 2,
326-
original: String::from("println!(\"Hello, world!\");"),
327-
expected: String::from(" println!(\"Hello, world!\");"),
328+
original: String::from("println!(\"Hello, world!\");\n"),
329+
expected: String::from(" println!(\"Hello, world!\");\n"),
328330
}],
329331
};
330332

@@ -335,8 +337,8 @@ mod tests {
335337
original_end_line: 2,
336338
expected_begin_line: 2,
337339
expected_end_line: 2,
338-
original: String::from("println!(\"Greetings!\");"),
339-
expected: String::from(" println!(\"Greetings!\");"),
340+
original: String::from("println!(\"Greetings!\");\n"),
341+
expected: String::from(" println!(\"Greetings!\");\n"),
340342
}],
341343
};
342344

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":33,"original_end_line":37,"expected_begin_line":24,"expected_end_line":24,"original":"fn fooblock() {\n {\n \"inner-block\"\n }\n}","expected":"fn fooblock() { { \"inner-block\" } }"},{"original_begin_line":64,"original_end_line":66,"expected_begin_line":51,"expected_end_line":51,"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":56,"expected_end_line":56,"original":" fn dummy(&self) {\n }","expected":" fn dummy(&self) {}"},{"original_begin_line":75,"original_end_line":75,"expected_begin_line":59,"expected_end_line":60,"original":"trait CoolerTypes { fn dummy(&self) { ","expected":"trait CoolerTypes {\n fn dummy(&self) {}"},{"original_begin_line":77,"original_end_line":77,"expected_begin_line":62,"expected_end_line":62,"original":"}","expected":""},{"original_begin_line":79,"original_end_line":79,"expected_begin_line":63,"expected_end_line":66,"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":33,"original_end_line":37,"expected_begin_line":24,"expected_end_line":24,"original":"fn fooblock() {\n {\n \"inner-block\"\n }\n}\n","expected":"fn fooblock() { { \"inner-block\" } }\n"},{"original_begin_line":64,"original_end_line":66,"expected_begin_line":51,"expected_end_line":51,"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":56,"expected_end_line":56,"original":" fn dummy(&self) {\n }\n","expected":" fn dummy(&self) {}\n"},{"original_begin_line":75,"original_end_line":75,"expected_begin_line":59,"expected_end_line":60,"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":62,"expected_end_line":62,"original":"}\n","expected":""},{"original_begin_line":79,"original_end_line":79,"expected_begin_line":63,"expected_end_line":66,"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)