Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Batch up libsyntax breaking changes #34424

Merged
merged 44 commits into from
Jun 28, 2016
Merged
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
dc3d878
Add support for macro expansion inside trait items
Jun 11, 2016
01a0877
Remove inherent method `attrs()` on AST nodes. `attrs()` is now a met…
jseyfried May 24, 2016
febe6a4
Refactor away field `ctxt` of `ast::Mac_`
jseyfried May 24, 2016
5bf7970
Change `fold_tt` and `fold_tts` to take token trees by value (instead…
jseyfried Jun 3, 2016
683e480
Refactor away `WithAttrs` trait
jseyfried Jun 10, 2016
0644aba
Remove the type parameter from `syntax::visit::Visitor`
jseyfried Jun 12, 2016
b5dbe01
Refactor away `ast::Decl` and refactor `ast::Stmt`
jseyfried Jun 17, 2016
962d5c1
Fix fallout
jseyfried Jun 17, 2016
f0b21c2
Rename `ast::ExprKind::Again` -> `ast::ExprKind::Continue`
jseyfried Jun 17, 2016
5033eca
Generalize and abstract `ThinAttributes`
jseyfried Jun 18, 2016
f903c97
Merge PatKind::QPath into PatKind::Path in AST
petrochenkov Jun 11, 2016
d59accf
Refactored tokentrees into their own files in preparation for tokenst…
Jun 20, 2016
f6fe5b6
Cleanup comments
jseyfried Jun 23, 2016
6ae3502
Move errors from libsyntax to its own crate
Jun 21, 2016
2829fbc
Address comments and fix travis warning
Jun 21, 2016
51deb4f
Address more travis errors
Jun 22, 2016
f2fe204
Consolidate codemap tests and fix more errors for travis
Jun 22, 2016
bad4869
Fix touchy test to work with old and new error format
Jun 22, 2016
b68e079
Actually consolidate the CodeMap tests
Jun 23, 2016
2b8bab0
Move test helper functions to consolidated codemap testing
Jun 23, 2016
d4e79de
Add missing refernce to RenderedLine
Jun 23, 2016
b7da35a
Remove field `expr` of `ast::Block`
jseyfried Jun 23, 2016
a48a4f5
Avoid wasting node ids
jseyfried Jun 23, 2016
94479ad
Add regression test
jseyfried Jun 23, 2016
80f1c78
make old school mode a bit more configurable
Jun 23, 2016
bdd3f8f
Updating test I missed for old school refactor
Jun 23, 2016
ea7ba12
Add missing 'extern crate' for test
Jun 23, 2016
060a84d
Refactor away duplicate method `ecx.block_all()`
jseyfried Jun 23, 2016
f960f9e
Fix up rpass tests missing imports
Jun 24, 2016
89da728
Fix rfail test missing import
Jun 24, 2016
8cad251
Add `ecx.stmt_semi()` and fix issues with the pretty-printer
jseyfried Jun 24, 2016
f5259ab
Reexport syntax_pos in codemap and fix some cfail tests
Jun 24, 2016
9f2a507
Fix codemap tests to not double import
Jun 24, 2016
bc14006
reexport errors from syntax. fix failing cfail test
Jun 24, 2016
f0310e0
Rollup merge of #34213 - josephDunne:trait_item_macros, r=jseyfried
jseyfried Jun 25, 2016
4e2e31c
Rollup merge of #34368 - petrochenkov:astqpath, r=Manishearth
jseyfried Jun 25, 2016
d3ae56d
Rollup merge of #34403 - jonathandturner:move_liberror, r=alexcrichton
jseyfried Jun 25, 2016
82a15a6
Rollup merge of #34385 - cgswords:tstream, r=nrc
jseyfried Jun 25, 2016
33ea1e3
Rollup merge of #33943 - jseyfried:libsyntax_cleanup, r=nrc
jseyfried Jun 26, 2016
8748cd9
Rollup merge of #34316 - jseyfried:refactor_ast_stmt, r=eddyb
jseyfried Jun 26, 2016
8eddf02
Rollup merge of #34339 - jseyfried:thin_vec, r=petrochenkov,Manishearth
jseyfried Jun 26, 2016
9bb3ea0
Rollup merge of #34436 - jseyfried:no_block_expr, r=eddyb
jseyfried Jun 26, 2016
542ba8c
Fix `Cargo.toml`s
jseyfried Jun 27, 2016
360dcae
Update `src/rustc/Cargo.lock`
jseyfried Jun 27, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions src/librustc/hir/lowering.rs
Original file line number Diff line number Diff line change
@@ -587,10 +587,23 @@ impl<'a> LoweringContext<'a> {
}

fn lower_block(&mut self, b: &Block) -> P<hir::Block> {
let mut stmts = Vec::new();
let mut expr = None;

if let Some((last, rest)) = b.stmts.split_last() {
stmts = rest.iter().map(|s| self.lower_stmt(s)).collect::<Vec<_>>();
let last = self.lower_stmt(last);
if let hir::StmtExpr(e, _) = last.node {
expr = Some(e);
} else {
stmts.push(last);
}
}

P(hir::Block {
id: b.id,
stmts: b.stmts.iter().map(|s| self.lower_stmt(s)).collect(),
expr: b.expr.as_ref().map(|ref x| self.lower_expr(x)),
stmts: stmts.into(),
expr: expr,
rules: self.lower_block_check_mode(&b.rules),
span: b.span,
})
6 changes: 4 additions & 2 deletions src/librustc_driver/pretty.rs
Original file line number Diff line number Diff line change
@@ -657,8 +657,10 @@ impl fold::Folder for ReplaceBodyWithLoop {
fn fold_block(&mut self, b: P<ast::Block>) -> P<ast::Block> {
fn expr_to_block(rules: ast::BlockCheckMode, e: Option<P<ast::Expr>>) -> P<ast::Block> {
P(ast::Block {
expr: e,
stmts: vec![],
stmts: e.map(|e| codemap::Spanned {
span: e.span,
node: ast::StmtKind::Expr(e, ast::DUMMY_NODE_ID),
}).into_iter().collect(),
rules: rules,
id: ast::DUMMY_NODE_ID,
span: codemap::DUMMY_SP,
5 changes: 1 addition & 4 deletions src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
@@ -528,9 +528,6 @@ impl PartialEq for MetaItemKind {
pub struct Block {
/// Statements in a block
pub stmts: Vec<Stmt>,
/// An expression at the end of the block
/// without a semicolon, if any
pub expr: Option<P<Expr>>,
pub id: NodeId,
/// Distinguishes between `unsafe { ... }` and `{ ... }`
pub rules: BlockCheckMode,
@@ -803,7 +800,7 @@ pub enum StmtKind {
/// Could be an item or a local (let) binding:
Decl(P<Decl>, NodeId),

/// Expr without trailing semi-colon (must have unit type):
/// Expr without trailing semi-colon
Expr(P<Expr>, NodeId),

/// Expr with trailing semi-colon (may have any type):
45 changes: 20 additions & 25 deletions src/libsyntax/ext/build.rs
Original file line number Diff line number Diff line change
@@ -98,12 +98,9 @@ pub trait AstBuilder {
fn stmt_item(&self, sp: Span, item: P<ast::Item>) -> ast::Stmt;

// blocks
fn block(&self, span: Span, stmts: Vec<ast::Stmt>,
expr: Option<P<ast::Expr>>) -> P<ast::Block>;
fn block(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Block>;
fn block_expr(&self, expr: P<ast::Expr>) -> P<ast::Block>;
fn block_all(&self, span: Span,
stmts: Vec<ast::Stmt>,
expr: Option<P<ast::Expr>>) -> P<ast::Block>;
fn block_all(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Block>;

// expressions
fn expr(&self, span: Span, node: ast::ExprKind) -> P<ast::Expr>;
@@ -508,7 +505,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
}

fn stmt_expr(&self, expr: P<ast::Expr>) -> ast::Stmt {
respan(expr.span, ast::StmtKind::Semi(expr, ast::DUMMY_NODE_ID))
respan(expr.span, ast::StmtKind::Expr(expr, ast::DUMMY_NODE_ID))
}

fn stmt_let(&self, sp: Span, mutbl: bool, ident: ast::Ident,
@@ -556,9 +553,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
P(respan(sp, ast::StmtKind::Decl(P(decl), ast::DUMMY_NODE_ID)))
}

fn block(&self, span: Span, stmts: Vec<ast::Stmt>,
expr: Option<P<Expr>>) -> P<ast::Block> {
self.block_all(span, stmts, expr)
fn block(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Block> {
self.block_all(span, stmts)
}

fn stmt_item(&self, sp: Span, item: P<ast::Item>) -> ast::Stmt {
@@ -567,19 +563,18 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
}

fn block_expr(&self, expr: P<ast::Expr>) -> P<ast::Block> {
self.block_all(expr.span, Vec::new(), Some(expr))
}
fn block_all(&self,
span: Span,
stmts: Vec<ast::Stmt>,
expr: Option<P<ast::Expr>>) -> P<ast::Block> {
P(ast::Block {
stmts: stmts,
expr: expr,
id: ast::DUMMY_NODE_ID,
rules: BlockCheckMode::Default,
span: span,
})
self.block_all(expr.span, vec![Spanned {
span: expr.span,
node: ast::StmtKind::Expr(expr, ast::DUMMY_NODE_ID),
}])
}
fn block_all(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Block> {
P(ast::Block {
stmts: stmts,
id: ast::DUMMY_NODE_ID,
rules: BlockCheckMode::Default,
span: span,
})
}

fn expr(&self, span: Span, node: ast::ExprKind) -> P<ast::Expr> {
@@ -948,14 +943,14 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
ids: Vec<ast::Ident>,
stmts: Vec<ast::Stmt>)
-> P<ast::Expr> {
self.lambda(span, ids, self.block(span, stmts, None))
self.lambda(span, ids, self.block(span, stmts))
}
fn lambda_stmts_0(&self, span: Span, stmts: Vec<ast::Stmt>) -> P<ast::Expr> {
self.lambda0(span, self.block(span, stmts, None))
self.lambda0(span, self.block(span, stmts))
}
fn lambda_stmts_1(&self, span: Span, stmts: Vec<ast::Stmt>,
ident: ast::Ident) -> P<ast::Expr> {
self.lambda1(span, self.block(span, stmts, None), ident)
self.lambda1(span, self.block(span, stmts), ident)
}

fn arg(&self, span: Span, ident: ast::Ident, ty: P<ast::Ty>) -> ast::Arg {
11 changes: 1 addition & 10 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
@@ -636,23 +636,14 @@ pub fn expand_block(blk: P<Block>, fld: &mut MacroExpander) -> P<Block> {

// expand the elements of a block.
pub fn expand_block_elts(b: P<Block>, fld: &mut MacroExpander) -> P<Block> {
b.map(|Block {id, stmts, expr, rules, span}| {
b.map(|Block {id, stmts, rules, span}| {
let new_stmts = stmts.into_iter().flat_map(|x| {
// perform pending renames and expand macros in the statement
fld.fold_stmt(x).into_iter()
}).collect();
let new_expr = expr.map(|x| {
let expr = {
let pending_renames = &mut fld.cx.syntax_env.info().pending_renames;
let mut rename_fld = IdentRenamer{renames:pending_renames};
rename_fld.fold_expr(x)
};
fld.fold_expr(expr)
});
Block {
id: fld.new_id(id),
stmts: new_stmts,
expr: new_expr,
rules: rules,
span: span
}
24 changes: 11 additions & 13 deletions src/libsyntax/ext/quote.rs
Original file line number Diff line number Diff line change
@@ -512,10 +512,8 @@ pub fn expand_quote_matcher(cx: &mut ExtCtxt,
let (cx_expr, tts) = parse_arguments_to_quote(cx, tts);
let mut vector = mk_stmts_let(cx, sp);
vector.extend(statements_mk_tts(cx, &tts[..], true));
let block = cx.expr_block(
cx.block_all(sp,
vector,
Some(cx.expr_ident(sp, id_ext("tt")))));
vector.push(cx.stmt_expr(cx.expr_ident(sp, id_ext("tt"))));
let block = cx.expr_block(cx.block_all(sp, vector));

let expanded = expand_wrapper(cx, sp, cx_expr, block, &[&["syntax", "ext", "quote", "rt"]]);
base::MacEager::expr(expanded)
@@ -765,8 +763,9 @@ fn statements_mk_tt(cx: &ExtCtxt, tt: &TokenTree, matcher: bool) -> Vec<ast::Stm
let stmt_let_tt = cx.stmt_let(sp, true, id_ext("tt"), cx.expr_vec_ng(sp));
let mut tts_stmts = vec![stmt_let_tt];
tts_stmts.extend(statements_mk_tts(cx, &seq.tts[..], matcher));
let e_tts = cx.expr_block(cx.block(sp, tts_stmts,
Some(cx.expr_ident(sp, id_ext("tt")))));
tts_stmts.push(cx.stmt_expr(cx.expr_ident(sp, id_ext("tt"))));
let e_tts = cx.expr_block(cx.block(sp, tts_stmts));

let e_separator = match seq.separator {
Some(ref sep) => cx.expr_some(sp, expr_mk_token(cx, sp, sep)),
None => cx.expr_none(sp),
@@ -884,10 +883,8 @@ fn expand_tts(cx: &ExtCtxt, sp: Span, tts: &[TokenTree])

let mut vector = mk_stmts_let(cx, sp);
vector.extend(statements_mk_tts(cx, &tts[..], false));
let block = cx.expr_block(
cx.block_all(sp,
vector,
Some(cx.expr_ident(sp, id_ext("tt")))));
vector.push(cx.stmt_expr(cx.expr_ident(sp, id_ext("tt"))));
let block = cx.expr_block(cx.block_all(sp, vector));

(cx_expr, block)
}
@@ -901,13 +898,14 @@ fn expand_wrapper(cx: &ExtCtxt,
let cx_expr_borrow = cx.expr_addr_of(sp, cx.expr_deref(sp, cx_expr));
let stmt_let_ext_cx = cx.stmt_let(sp, false, id_ext("ext_cx"), cx_expr_borrow);

let stmts = imports.iter().map(|path| {
let mut stmts = imports.iter().map(|path| {
// make item: `use ...;`
let path = path.iter().map(|s| s.to_string()).collect();
cx.stmt_item(sp, cx.item_use_glob(sp, ast::Visibility::Inherited, ids_ext(path)))
}).chain(Some(stmt_let_ext_cx)).collect();
}).chain(Some(stmt_let_ext_cx)).collect::<Vec<_>>();
stmts.push(cx.stmt_expr(expr));

cx.expr_block(cx.block_all(sp, stmts, Some(expr)))
cx.expr_block(cx.block_all(sp, stmts))
}

fn expand_parse_call(cx: &ExtCtxt,
3 changes: 1 addition & 2 deletions src/libsyntax/fold.rs
Original file line number Diff line number Diff line change
@@ -845,10 +845,9 @@ fn noop_fold_bounds<T: Folder>(bounds: TyParamBounds, folder: &mut T)
}

pub fn noop_fold_block<T: Folder>(b: P<Block>, folder: &mut T) -> P<Block> {
b.map(|Block {id, stmts, expr, rules, span}| Block {
b.map(|Block {id, stmts, rules, span}| Block {
id: folder.new_id(id),
stmts: stmts.move_flat_map(|s| folder.fold_stmt(s).into_iter()),
expr: expr.and_then(|x| folder.fold_opt_expr(x)),
rules: rules,
span: folder.new_span(span),
})
30 changes: 8 additions & 22 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
@@ -3217,9 +3217,11 @@ impl<'a> Parser<'a> {
let body_expr = self.parse_expr()?;
P(ast::Block {
id: ast::DUMMY_NODE_ID,
stmts: vec![],
span: body_expr.span,
expr: Some(body_expr),
stmts: vec![Spanned {
span: body_expr.span,
node: StmtKind::Expr(body_expr, ast::DUMMY_NODE_ID),
}],
rules: BlockCheckMode::Default,
})
}
@@ -4082,7 +4084,6 @@ impl<'a> Parser<'a> {
/// Precondition: already parsed the '{'.
fn parse_block_tail(&mut self, lo: BytePos, s: BlockCheckMode) -> PResult<'a, P<Block>> {
let mut stmts = vec![];
let mut expr = None;

while !self.eat(&token::CloseDelim(token::Brace)) {
let Spanned {node, span} = if let Some(s) = self.parse_stmt_() {
@@ -4095,11 +4096,10 @@ impl<'a> Parser<'a> {
};
match node {
StmtKind::Expr(e, _) => {
self.handle_expression_like_statement(e, span, &mut stmts, &mut expr)?;
self.handle_expression_like_statement(e, span, &mut stmts)?;
}
StmtKind::Mac(mac, MacStmtStyle::NoBraces, attrs) => {
// statement macro without braces; might be an
// expr depending on whether a semicolon follows
// statement macro without braces
match self.token {
token::Semi => {
stmts.push(Spanned {
@@ -4115,11 +4115,7 @@ impl<'a> Parser<'a> {
let lo = e.span.lo;
let e = self.parse_dot_or_call_expr_with(e, lo, attrs)?;
let e = self.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(e))?;
self.handle_expression_like_statement(
e,
span,
&mut stmts,
&mut expr)?;
self.handle_expression_like_statement(e, span, &mut stmts)?;
}
}
}
@@ -4133,13 +4129,6 @@ impl<'a> Parser<'a> {
});
self.bump();
}
token::CloseDelim(token::Brace) => {
// if a block ends in `m!(arg)` without
// a `;`, it must be an expr
expr = Some(self.mk_mac_expr(span.lo, span.hi,
m.and_then(|x| x.node),
attrs));
}
_ => {
stmts.push(Spanned {
node: StmtKind::Mac(m, style, attrs),
@@ -4165,7 +4154,6 @@ impl<'a> Parser<'a> {

Ok(P(ast::Block {
stmts: stmts,
expr: expr,
id: ast::DUMMY_NODE_ID,
rules: s,
span: mk_sp(lo, self.last_span.hi),
@@ -4175,8 +4163,7 @@ impl<'a> Parser<'a> {
fn handle_expression_like_statement(&mut self,
e: P<Expr>,
span: Span,
stmts: &mut Vec<Stmt>,
last_block_expr: &mut Option<P<Expr>>)
stmts: &mut Vec<Stmt>)
-> PResult<'a, ()> {
// expression without semicolon
if classify::expr_requires_semi_to_be_stmt(&e) {
@@ -4202,7 +4189,6 @@ impl<'a> Parser<'a> {
span: span_with_semi,
});
}
token::CloseDelim(token::Brace) => *last_block_expr = Some(e),
_ => {
stmts.push(Spanned {
node: StmtKind::Expr(e, ast::DUMMY_NODE_ID),
29 changes: 9 additions & 20 deletions src/libsyntax/print/pprust.rs
Original file line number Diff line number Diff line change
@@ -1619,9 +1619,6 @@ impl<'a> State<'a> {
}
}
}
if parse::classify::stmt_ends_with_semi(&st.node) {
try!(word(&mut self.s, ";"));
}
self.maybe_print_trailing_comment(st.span, None)
}

@@ -1668,14 +1665,6 @@ impl<'a> State<'a> {
for st in &blk.stmts {
try!(self.print_stmt(st));
}
match blk.expr {
Some(ref expr) => {
try!(self.space_if_not_bol());
try!(self.print_expr_outer_attr_style(&expr, false));
try!(self.maybe_print_trailing_comment(expr.span, Some(blk.span.hi)));
}
_ => ()
}
try!(self.bclose_maybe_open(blk.span, indented, close_box));
self.ann.post(self, NodeBlock(blk))
}
@@ -2084,24 +2073,23 @@ impl<'a> State<'a> {
_ => false
};

if !default_return || !body.stmts.is_empty() || body.expr.is_none() {
try!(self.print_block_unclosed(&body));
} else {
// we extract the block, so as not to create another set of boxes
let i_expr = body.expr.as_ref().unwrap();
match i_expr.node {
ast::ExprKind::Block(ref blk) => {
match body.stmts.last().map(|stmt| &stmt.node) {
Some(&ast::StmtKind::Expr(ref i_expr, _)) if default_return &&
body.stmts.len() == 1 => {
// we extract the block, so as not to create another set of boxes
if let ast::ExprKind::Block(ref blk) = i_expr.node {
try!(self.print_block_unclosed_with_attrs(
&blk,
i_expr.attrs.as_attr_slice()));
}
_ => {
} else {
// this is a bare expression
try!(self.print_expr(&i_expr));
try!(self.end()); // need to close a box
}
}
_ => try!(self.print_block_unclosed(&body)),
}

// a box will be closed by print_expr, but we didn't want an overall
// wrapper so we closed the corresponding opening. so create an
// empty box to satisfy the close.
@@ -2295,6 +2283,7 @@ impl<'a> State<'a> {
try!(self.word_space("="));
try!(self.print_expr(&init));
}
try!(word(&mut self.s, ";"));
self.end()
}
ast::DeclKind::Item(ref item) => self.print_item(&item)
2 changes: 1 addition & 1 deletion src/libsyntax/test.rs
Original file line number Diff line number Diff line change
@@ -474,7 +474,7 @@ fn mk_main(cx: &mut TestCtxt) -> P<ast::Item> {
let main_attr = ecx.attribute(sp, main_meta);
// pub fn main() { ... }
let main_ret_ty = ecx.ty(sp, ast::TyKind::Tup(vec![]));
let main_body = ecx.block_all(sp, vec![call_test_main], None);
let main_body = ecx.block_all(sp, vec![call_test_main]);
let main = ast::ItemKind::Fn(ecx.fn_decl(vec![], main_ret_ty),
ast::Unsafety::Normal,
ast::Constness::NotConst,
1 change: 0 additions & 1 deletion src/libsyntax/visit.rs
Original file line number Diff line number Diff line change
@@ -608,7 +608,6 @@ pub fn walk_struct_field<'v, V: Visitor<'v>>(visitor: &mut V,

pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block) {
walk_list!(visitor, visit_stmt, &block.stmts);
walk_list!(visitor, visit_expr, &block.expr);
}

pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt) {
10 changes: 4 additions & 6 deletions src/libsyntax_ext/deriving/clone.rs
Original file line number Diff line number Diff line change
@@ -145,12 +145,10 @@ fn cs_clone(

match mode {
Mode::Shallow => {
cx.expr_block(cx.block(trait_span,
all_fields.iter()
.map(subcall)
.map(|e| cx.stmt_expr(e))
.collect(),
Some(cx.expr_deref(trait_span, cx.expr_self(trait_span)))))
let mut stmts: Vec<_> =
all_fields.iter().map(subcall).map(|e| cx.stmt_expr(e)).collect();
stmts.push(cx.stmt_expr(cx.expr_deref(trait_span, cx.expr_self(trait_span))));
cx.expr_block(cx.block(trait_span, stmts))
}
Mode::Deep => {
match *vdata {
2 changes: 1 addition & 1 deletion src/libsyntax_ext/deriving/cmp/eq.rs
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ pub fn expand_deriving_eq(cx: &mut ExtCtxt,
// create `a.<method>(); b.<method>(); c.<method>(); ...`
// (where method is `assert_receiver_is_total_eq`)
let stmts = exprs.into_iter().map(|e| cx.stmt_expr(e)).collect();
let block = cx.block(span, stmts, None);
let block = cx.block(span, stmts);
cx.expr_block(block)
},
Box::new(|cx, sp, _, _| {
5 changes: 3 additions & 2 deletions src/libsyntax_ext/deriving/debug.rs
Original file line number Diff line number Diff line change
@@ -78,7 +78,7 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,

let fmt = substr.nonself_args[0].clone();

let stmts = match *substr.fields {
let mut stmts = match *substr.fields {
Struct(_, ref fields) | EnumMatching(_, _, ref fields) => {
let mut stmts = vec![];
if !is_struct {
@@ -136,7 +136,8 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,
token::str_to_ident("finish"),
vec![]);

let block = cx.block(span, stmts, Some(expr));
stmts.push(cx.stmt_expr(expr));
let block = cx.block(span, stmts);
cx.expr_block(block)
}

2 changes: 1 addition & 1 deletion src/libsyntax_ext/deriving/encodable.rs
Original file line number Diff line number Diff line change
@@ -285,7 +285,7 @@ fn encodable_substructure(cx: &mut ExtCtxt, trait_span: Span,
cx.expr_str(trait_span, substr.type_ident.name.as_str()),
blk
));
cx.expr_block(cx.block(trait_span, vec!(me), Some(ret)))
cx.expr_block(cx.block(trait_span, vec![me, cx.stmt_expr(ret)]))
}

_ => cx.bug("expected Struct or EnumMatching in derive(Encodable)")
4 changes: 2 additions & 2 deletions src/libsyntax_ext/deriving/generic/mod.rs
Original file line number Diff line number Diff line change
@@ -1332,8 +1332,8 @@ impl<'a> MethodDef<'a> {
// }
let all_match = cx.expr_match(sp, match_arg, match_arms);
let arm_expr = cx.expr_if(sp, discriminant_test, all_match, Some(arm_expr));
cx.expr_block(
cx.block_all(sp, index_let_stmts, Some(arm_expr)))
index_let_stmts.push(cx.stmt_expr(arm_expr));
cx.expr_block(cx.block_all(sp, index_let_stmts))
} else if variants.is_empty() {
// As an additional wrinkle, For a zero-variant enum A,
// currently the compiler
2 changes: 1 addition & 1 deletion src/libsyntax_ext/deriving/hash.rs
Original file line number Diff line number Diff line change
@@ -99,5 +99,5 @@ fn hash_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure)
stmts.push(call_hash(span, self_.clone()));
}

cx.expr_block(cx.block(trait_span, stmts, None))
cx.expr_block(cx.block(trait_span, stmts))
}
3 changes: 1 addition & 2 deletions src/libsyntax_ext/deriving/mod.rs
Original file line number Diff line number Diff line change
@@ -297,8 +297,7 @@ fn call_intrinsic(cx: &ExtCtxt,
let call = cx.expr_call_global(span, path, args);

cx.expr_block(P(ast::Block {
stmts: vec![],
expr: Some(call),
stmts: vec![cx.stmt_expr(call)],
id: ast::DUMMY_NODE_ID,
rules: ast::BlockCheckMode::Unsafe(ast::CompilerGenerated),
span: span }))
7 changes: 4 additions & 3 deletions src/libsyntax_ext/format.rs
Original file line number Diff line number Diff line change
@@ -444,9 +444,10 @@ impl<'a, 'b> Context<'a, 'b> {
let decl = respan(sp, ast::DeclKind::Item(item));

// Wrap the declaration in a block so that it forms a single expression.
ecx.expr_block(ecx.block(sp,
vec![respan(sp, ast::StmtKind::Decl(P(decl), ast::DUMMY_NODE_ID))],
Some(ecx.expr_ident(sp, name))))
ecx.expr_block(ecx.block(sp, vec![
respan(sp, ast::StmtKind::Decl(P(decl), ast::DUMMY_NODE_ID)),
ecx.stmt_expr(ecx.expr_ident(sp, name)),
]))
}

/// Actually builds the expression which the iformat! block will be expanded