forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#65074 - Rantanen:json-byte-pos, r=matklad
Fix the start/end byte positions in the compiler JSON output Track the changes made during normalization in the `SourceFile` and use this information to correct the `start_byte` and `end_byte` fields in the JSON output. This should ensure the start/end byte fields can be used to index the original file, even if Rust normalized the source code for parsing purposes. Both CRLF to LF and BOM removal are handled with this one. The rough plan was discussed with @matklad in rust-lang/rustfix#176 - although I ended up going with `u32` offset tracking so I wouldn't need to deal with `u32 + i32` arithmetics when applying the offset to the span byte positions. Fixes rust-lang#65029
- Loading branch information
Showing
11 changed files
with
403 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
use super::*; | ||
|
||
use crate::json::JsonEmitter; | ||
use crate::source_map::{FilePathMapping, SourceMap}; | ||
use crate::tests::Shared; | ||
use crate::with_default_globals; | ||
|
||
use errors::emitter::{ColorConfig, HumanReadableErrorType}; | ||
use errors::Handler; | ||
use rustc_serialize::json::decode; | ||
use syntax_pos::{BytePos, Span}; | ||
|
||
use std::str; | ||
|
||
#[derive(RustcDecodable, Debug, PartialEq, Eq)] | ||
struct TestData { | ||
spans: Vec<SpanTestData>, | ||
} | ||
|
||
#[derive(RustcDecodable, Debug, PartialEq, Eq)] | ||
struct SpanTestData { | ||
pub byte_start: u32, | ||
pub byte_end: u32, | ||
pub line_start: u32, | ||
pub column_start: u32, | ||
pub line_end: u32, | ||
pub column_end: u32, | ||
} | ||
|
||
/// Test the span yields correct positions in JSON. | ||
fn test_positions(code: &str, span: (u32, u32), expected_output: SpanTestData) { | ||
let expected_output = TestData { spans: vec![expected_output] }; | ||
|
||
with_default_globals(|| { | ||
let sm = Lrc::new(SourceMap::new(FilePathMapping::empty())); | ||
sm.new_source_file(Path::new("test.rs").to_owned().into(), code.to_owned()); | ||
|
||
let output = Arc::new(Mutex::new(Vec::new())); | ||
let je = JsonEmitter::new( | ||
Box::new(Shared { data: output.clone() }), | ||
None, | ||
sm, | ||
true, | ||
HumanReadableErrorType::Short(ColorConfig::Never), | ||
false, | ||
); | ||
|
||
let span = Span::with_root_ctxt(BytePos(span.0), BytePos(span.1)); | ||
let handler = Handler::with_emitter(true, None, Box::new(je)); | ||
handler.span_err(span, "foo"); | ||
|
||
let bytes = output.lock().unwrap(); | ||
let actual_output = str::from_utf8(&bytes).unwrap(); | ||
let actual_output: TestData = decode(actual_output).unwrap(); | ||
|
||
assert_eq!(expected_output, actual_output) | ||
}) | ||
} | ||
|
||
#[test] | ||
fn empty() { | ||
test_positions( | ||
" ", | ||
(0, 1), | ||
SpanTestData { | ||
byte_start: 0, | ||
byte_end: 1, | ||
line_start: 1, | ||
column_start: 1, | ||
line_end: 1, | ||
column_end: 2, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn bom() { | ||
test_positions( | ||
"\u{feff} ", | ||
(0, 1), | ||
SpanTestData { | ||
byte_start: 3, | ||
byte_end: 4, | ||
line_start: 1, | ||
column_start: 1, | ||
line_end: 1, | ||
column_end: 2, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn lf_newlines() { | ||
test_positions( | ||
"\nmod foo;\nmod bar;\n", | ||
(5, 12), | ||
SpanTestData { | ||
byte_start: 5, | ||
byte_end: 12, | ||
line_start: 2, | ||
column_start: 5, | ||
line_end: 3, | ||
column_end: 3, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn crlf_newlines() { | ||
test_positions( | ||
"\r\nmod foo;\r\nmod bar;\r\n", | ||
(5, 12), | ||
SpanTestData { | ||
byte_start: 6, | ||
byte_end: 14, | ||
line_start: 2, | ||
column_start: 5, | ||
line_end: 3, | ||
column_end: 3, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn crlf_newlines_with_bom() { | ||
test_positions( | ||
"\u{feff}\r\nmod foo;\r\nmod bar;\r\n", | ||
(5, 12), | ||
SpanTestData { | ||
byte_start: 9, | ||
byte_end: 17, | ||
line_start: 2, | ||
column_start: 5, | ||
line_end: 3, | ||
column_end: 3, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn span_before_crlf() { | ||
test_positions( | ||
"foo\r\nbar", | ||
(2, 3), | ||
SpanTestData { | ||
byte_start: 2, | ||
byte_end: 3, | ||
line_start: 1, | ||
column_start: 3, | ||
line_end: 1, | ||
column_end: 4, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn span_on_crlf() { | ||
test_positions( | ||
"foo\r\nbar", | ||
(3, 4), | ||
SpanTestData { | ||
byte_start: 3, | ||
byte_end: 5, | ||
line_start: 1, | ||
column_start: 4, | ||
line_end: 2, | ||
column_end: 1, | ||
}, | ||
) | ||
} | ||
|
||
#[test] | ||
fn span_after_crlf() { | ||
test_positions( | ||
"foo\r\nbar", | ||
(4, 5), | ||
SpanTestData { | ||
byte_start: 5, | ||
byte_end: 6, | ||
line_start: 2, | ||
column_start: 1, | ||
line_end: 2, | ||
column_end: 2, | ||
}, | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.