Skip to content

Commit

Permalink
Fixed expr meta var after path colons in mbe
Browse files Browse the repository at this point in the history
  • Loading branch information
edwin0cheng authored and Matthias-Fauconneau committed Feb 7, 2021
1 parent 8ff3ee6 commit ed1809f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
23 changes: 22 additions & 1 deletion crates/mbe/src/tests.rs
Original file line number Diff line number Diff line change
@@ -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::*;
Expand Down Expand Up @@ -1194,6 +1198,23 @@ macro_rules! foo {
);
}

#[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() {
Expand Down
16 changes: 13 additions & 3 deletions crates/parser/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use drop_bomb::DropBomb;
use crate::{
event::Event,
ParseError,
SyntaxKind::{self, EOF, ERROR, TOMBSTONE},
SyntaxKind::{self, EOF, ERROR, L_DOLLAR, R_DOLLAR, TOMBSTONE},
TokenSet, TokenSource, T,
};

Expand Down Expand Up @@ -215,13 +215,23 @@ impl<'t> Parser<'t> {

/// 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;
}
Expand Down

0 comments on commit ed1809f

Please sign in to comment.