Add a test for Parser::debug_lookahead
.
That method is currently badly broken, and the test output reflects this. The obtained tokens list is always empty, except in the case where we go two `bump`s past the final token, whereupon it will produce as many `Eof` tokens as asked for.
This commit is contained in:
parent
69f6145ad8
commit
cf2dfb2ced
1 changed files with 149 additions and 0 deletions
|
@ -1498,6 +1498,155 @@ fn look_ahead_non_outermost_stream() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME(nnethercote) All the output is currently wrong.
|
||||||
|
#[test]
|
||||||
|
fn debug_lookahead() {
|
||||||
|
create_default_session_globals_then(|| {
|
||||||
|
let psess = psess();
|
||||||
|
let mut p = string_to_parser(&psess, "fn f(x: u32) { x } struct S;".to_string());
|
||||||
|
|
||||||
|
// Current position is the `fn`.
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(0)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: Question,
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [],
|
||||||
|
approx_token_stream_pos: 1,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(7)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: Question,
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [],
|
||||||
|
approx_token_stream_pos: 1,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(15)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: Question,
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [],
|
||||||
|
approx_token_stream_pos: 1,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Move forward to the second `x`.
|
||||||
|
for _ in 0..8 {
|
||||||
|
p.bump();
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(1)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: OpenDelim(
|
||||||
|
Brace,
|
||||||
|
),
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
13,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
14,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [],
|
||||||
|
approx_token_stream_pos: 9,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(4)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: OpenDelim(
|
||||||
|
Brace,
|
||||||
|
),
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
13,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
14,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [],
|
||||||
|
approx_token_stream_pos: 9,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Move two past the final token (the `;`).
|
||||||
|
for _ in 0..6 {
|
||||||
|
p.bump();
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
&format!("{:#?}", p.debug_lookahead(3)),
|
||||||
|
"Parser {
|
||||||
|
prev_token: Token {
|
||||||
|
kind: Eof,
|
||||||
|
span: Span {
|
||||||
|
lo: BytePos(
|
||||||
|
27,
|
||||||
|
),
|
||||||
|
hi: BytePos(
|
||||||
|
28,
|
||||||
|
),
|
||||||
|
ctxt: #0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tokens: [
|
||||||
|
Eof,
|
||||||
|
Eof,
|
||||||
|
Eof,
|
||||||
|
],
|
||||||
|
approx_token_stream_pos: 15,
|
||||||
|
..
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// This tests that when parsing a string (rather than a file) we don't try
|
// This tests that when parsing a string (rather than a file) we don't try
|
||||||
// and read in a file for a module declaration and just parse a stub.
|
// and read in a file for a module declaration and just parse a stub.
|
||||||
// See `recurse_into_file_modules` in the parser.
|
// See `recurse_into_file_modules` in the parser.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue