Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit cf2dfb2

Browse files
committed
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.
1 parent 69f6145 commit cf2dfb2

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

compiler/rustc_parse/src/parser/tests.rs

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,6 +1498,155 @@ fn look_ahead_non_outermost_stream() {
14981498
});
14991499
}
15001500

1501+
// FIXME(nnethercote) All the output is currently wrong.
1502+
#[test]
1503+
fn debug_lookahead() {
1504+
create_default_session_globals_then(|| {
1505+
let psess = psess();
1506+
let mut p = string_to_parser(&psess, "fn f(x: u32) { x } struct S;".to_string());
1507+
1508+
// Current position is the `fn`.
1509+
assert_eq!(
1510+
&format!("{:#?}", p.debug_lookahead(0)),
1511+
"Parser {
1512+
prev_token: Token {
1513+
kind: Question,
1514+
span: Span {
1515+
lo: BytePos(
1516+
0,
1517+
),
1518+
hi: BytePos(
1519+
0,
1520+
),
1521+
ctxt: #0,
1522+
},
1523+
},
1524+
tokens: [],
1525+
approx_token_stream_pos: 1,
1526+
..
1527+
}"
1528+
);
1529+
assert_eq!(
1530+
&format!("{:#?}", p.debug_lookahead(7)),
1531+
"Parser {
1532+
prev_token: Token {
1533+
kind: Question,
1534+
span: Span {
1535+
lo: BytePos(
1536+
0,
1537+
),
1538+
hi: BytePos(
1539+
0,
1540+
),
1541+
ctxt: #0,
1542+
},
1543+
},
1544+
tokens: [],
1545+
approx_token_stream_pos: 1,
1546+
..
1547+
}"
1548+
);
1549+
assert_eq!(
1550+
&format!("{:#?}", p.debug_lookahead(15)),
1551+
"Parser {
1552+
prev_token: Token {
1553+
kind: Question,
1554+
span: Span {
1555+
lo: BytePos(
1556+
0,
1557+
),
1558+
hi: BytePos(
1559+
0,
1560+
),
1561+
ctxt: #0,
1562+
},
1563+
},
1564+
tokens: [],
1565+
approx_token_stream_pos: 1,
1566+
..
1567+
}"
1568+
);
1569+
1570+
// Move forward to the second `x`.
1571+
for _ in 0..8 {
1572+
p.bump();
1573+
}
1574+
assert_eq!(
1575+
&format!("{:#?}", p.debug_lookahead(1)),
1576+
"Parser {
1577+
prev_token: Token {
1578+
kind: OpenDelim(
1579+
Brace,
1580+
),
1581+
span: Span {
1582+
lo: BytePos(
1583+
13,
1584+
),
1585+
hi: BytePos(
1586+
14,
1587+
),
1588+
ctxt: #0,
1589+
},
1590+
},
1591+
tokens: [],
1592+
approx_token_stream_pos: 9,
1593+
..
1594+
}"
1595+
);
1596+
assert_eq!(
1597+
&format!("{:#?}", p.debug_lookahead(4)),
1598+
"Parser {
1599+
prev_token: Token {
1600+
kind: OpenDelim(
1601+
Brace,
1602+
),
1603+
span: Span {
1604+
lo: BytePos(
1605+
13,
1606+
),
1607+
hi: BytePos(
1608+
14,
1609+
),
1610+
ctxt: #0,
1611+
},
1612+
},
1613+
tokens: [],
1614+
approx_token_stream_pos: 9,
1615+
..
1616+
}"
1617+
);
1618+
1619+
// Move two past the final token (the `;`).
1620+
for _ in 0..6 {
1621+
p.bump();
1622+
}
1623+
assert_eq!(
1624+
&format!("{:#?}", p.debug_lookahead(3)),
1625+
"Parser {
1626+
prev_token: Token {
1627+
kind: Eof,
1628+
span: Span {
1629+
lo: BytePos(
1630+
27,
1631+
),
1632+
hi: BytePos(
1633+
28,
1634+
),
1635+
ctxt: #0,
1636+
},
1637+
},
1638+
tokens: [
1639+
Eof,
1640+
Eof,
1641+
Eof,
1642+
],
1643+
approx_token_stream_pos: 15,
1644+
..
1645+
}"
1646+
);
1647+
});
1648+
}
1649+
15011650
// This tests that when parsing a string (rather than a file) we don't try
15021651
// and read in a file for a module declaration and just parse a stub.
15031652
// See `recurse_into_file_modules` in the parser.

0 commit comments

Comments
 (0)