Expr Visit(Block block)
{
var parentScope = scope;
scope = Scope.CreateChild(parentScope);
var statementExprs = block.Statements.Select(s => s.Visit(this)).ToList();
if (block.LastStatement != null)
{
statementExprs.Add(block.LastStatement.Visit(this));
}
var locals = scope.AllLocals();
// Don't output blocks if we don't declare any locals and it's a single statement
var expr = locals.Length == 0 && statementExprs.Count == 1
? statementExprs[0]
: Expr.Block(locals, statementExprs);
scope = parentScope;
return(expr);
}