7211: Fixed expr meta var after path colons in mbe r=matklad a=edwin0cheng

Fixes #7207

Added `L_DOLLAR` in `ITEM_RECOVERY_SET` , but I don't know whether it is a good idea.

r? @matklad 

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
This commit is contained in:
bors[bot] 2021-01-14 10:52:12 +00:00 committed by GitHub
commit d76143da19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 4 deletions

View File

@ -1,7 +1,11 @@
use std::fmt::Write;
use ::parser::FragmentKind;
use syntax::{ast, AstNode, NodeOrToken, SyntaxKind::IDENT, SyntaxNode, WalkEvent, T};
use syntax::{
ast, AstNode, NodeOrToken,
SyntaxKind::{ERROR, IDENT},
SyntaxNode, WalkEvent, T,
};
use test_utils::assert_eq_text;
use super::*;
@ -1194,6 +1198,23 @@ fn $b() -> u8 {$c}
);
}
#[test]
fn test_expr_after_path_colons() {
assert!(parse_macro(
r#"
macro_rules! m {
($k:expr) => {
f(K::$k);
}
}
"#,
)
.expand_statements(r#"m!(C("0"))"#)
.descendants()
.find(|token| token.kind() == ERROR)
.is_some());
}
// The following tests are based on real world situations
#[test]
fn test_vec() {

View File

@ -7,7 +7,7 @@
use crate::{
event::Event,
ParseError,
SyntaxKind::{self, EOF, ERROR, TOMBSTONE},
SyntaxKind::{self, EOF, ERROR, L_DOLLAR, R_DOLLAR, TOMBSTONE},
TokenSet, TokenSource, T,
};
@ -215,13 +215,23 @@ pub(crate) fn expect(&mut self, kind: SyntaxKind) -> bool {
/// Create an error node and consume the next token.
pub(crate) fn err_and_bump(&mut self, message: &str) {
self.err_recover(message, TokenSet::EMPTY);
match self.current() {
L_DOLLAR | R_DOLLAR => {
let m = self.start();
self.error(message);
self.bump_any();
m.complete(self, ERROR);
}
_ => {
self.err_recover(message, TokenSet::EMPTY);
}
}
}
/// Create an error node and consume the next token.
pub(crate) fn err_recover(&mut self, message: &str, recovery: TokenSet) {
match self.current() {
T!['{'] | T!['}'] => {
T!['{'] | T!['}'] | L_DOLLAR | R_DOLLAR => {
self.error(message);
return;
}