Simplifications to statement macro handling.
SmallVector::pop no longer worries about converting a Many repr downward to One or Zero. expand_stmt makes use of `if let` for style purposes.
This commit is contained in:
@@ -772,20 +772,17 @@ fn expand_stmt(stmt: P<Stmt>, fld: &mut MacroExpander) -> SmallVector<P<Stmt>> {
|
|||||||
// If this is a macro invocation with a semicolon, then apply that
|
// If this is a macro invocation with a semicolon, then apply that
|
||||||
// semicolon to the final statement produced by expansion.
|
// semicolon to the final statement produced by expansion.
|
||||||
if style == MacStmtWithSemicolon {
|
if style == MacStmtWithSemicolon {
|
||||||
match fully_expanded.pop() {
|
if let Some(stmt) = fully_expanded.pop() {
|
||||||
Some(stmt) => {
|
let new_stmt = stmt.map(|Spanned {node, span}| {
|
||||||
let new_stmt = stmt.map(|Spanned {node, span}| {
|
Spanned {
|
||||||
Spanned {
|
node: match node {
|
||||||
node: match node {
|
StmtExpr(e, stmt_id) => StmtSemi(e, stmt_id),
|
||||||
StmtExpr(e, stmt_id) => StmtSemi(e, stmt_id),
|
_ => node /* might already have a semi */
|
||||||
_ => node /* might already have a semi */
|
},
|
||||||
},
|
span: span
|
||||||
span: span
|
}
|
||||||
}
|
});
|
||||||
});
|
fully_expanded.push(new_stmt);
|
||||||
fully_expanded.push(new_stmt);
|
|
||||||
}
|
|
||||||
None => (),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,29 +79,7 @@ impl<T> SmallVector<T> {
|
|||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Many(..) => {
|
Many(ref mut vs) => vs.pop(),
|
||||||
let mut many = mem::replace(&mut self.repr, Zero);
|
|
||||||
let item =
|
|
||||||
match many {
|
|
||||||
Many(ref mut vs) if vs.len() == 1 => {
|
|
||||||
// self.repr is already Zero
|
|
||||||
vs.pop()
|
|
||||||
},
|
|
||||||
Many(ref mut vs) if vs.len() == 2 => {
|
|
||||||
let item = vs.pop();
|
|
||||||
mem::replace(&mut self.repr, One(vs.pop().unwrap()));
|
|
||||||
item
|
|
||||||
},
|
|
||||||
Many(ref mut vs) if vs.len() > 2 => {
|
|
||||||
let item = vs.pop();
|
|
||||||
let rest = mem::replace(vs, vec!());
|
|
||||||
mem::replace(&mut self.repr, Many(rest));
|
|
||||||
item
|
|
||||||
},
|
|
||||||
_ => unreachable!()
|
|
||||||
};
|
|
||||||
item
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user