Parse macro-expanded statements like ordinary statements.
This commit is contained in:
parent
6189e6cdba
commit
57c56dd7e0
@ -118,12 +118,18 @@ impl<'a> MacResult for ParserAnyMacro<'a> {
|
|||||||
|
|
||||||
fn make_stmts(self: Box<ParserAnyMacro<'a>>)
|
fn make_stmts(self: Box<ParserAnyMacro<'a>>)
|
||||||
-> Option<SmallVector<ast::Stmt>> {
|
-> Option<SmallVector<ast::Stmt>> {
|
||||||
|
let parse_stmt = |parser: &mut Parser<'a>| -> ::parse::PResult<'a, _> {
|
||||||
|
Ok(match parser.parse_stmt()? {
|
||||||
|
Some(stmt) => Some(parser.finish_parsing_statement(stmt)?),
|
||||||
|
None => None,
|
||||||
|
})
|
||||||
|
};
|
||||||
let mut ret = SmallVector::zero();
|
let mut ret = SmallVector::zero();
|
||||||
loop {
|
loop {
|
||||||
let mut parser = self.parser.borrow_mut();
|
let mut parser = self.parser.borrow_mut();
|
||||||
match parser.token {
|
match parser.token {
|
||||||
token::Eof => break,
|
token::Eof => break,
|
||||||
_ => match parser.parse_stmt() {
|
_ => match parse_stmt(&mut parser) {
|
||||||
Ok(maybe_stmt) => match maybe_stmt {
|
Ok(maybe_stmt) => match maybe_stmt {
|
||||||
Some(stmt) => ret.push(stmt),
|
Some(stmt) => ret.push(stmt),
|
||||||
None => (),
|
None => (),
|
||||||
|
@ -4064,7 +4064,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
/// Finish parsing expressions that start with macros and handle trailing semicolons
|
/// Finish parsing expressions that start with macros and handle trailing semicolons
|
||||||
/// (or the lack thereof) -- c.f. `parse_stmt`.
|
/// (or the lack thereof) -- c.f. `parse_stmt`.
|
||||||
fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
|
pub fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
|
||||||
if let StmtKind::Mac(mac) = stmt.node {
|
if let StmtKind::Mac(mac) = stmt.node {
|
||||||
if mac.1 != MacStmtStyle::NoBraces || self.token == token::Semi {
|
if mac.1 != MacStmtStyle::NoBraces || self.token == token::Semi {
|
||||||
stmt.node = StmtKind::Mac(mac);
|
stmt.node = StmtKind::Mac(mac);
|
||||||
@ -4082,7 +4082,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
fn handle_trailing_semicolon(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
|
fn handle_trailing_semicolon(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
|
||||||
match stmt.node {
|
match stmt.node {
|
||||||
StmtKind::Expr(ref expr) => {
|
StmtKind::Expr(ref expr) if self.token != token::Eof => {
|
||||||
// expression without semicolon
|
// expression without semicolon
|
||||||
if classify::expr_requires_semi_to_be_stmt(expr) {
|
if classify::expr_requires_semi_to_be_stmt(expr) {
|
||||||
// Just check for errors and recover; do not eat semicolon yet.
|
// Just check for errors and recover; do not eat semicolon yet.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user