diff --git a/lib/nodes.js b/lib/nodes.js index a2f609a8..eaec7104 100644 --- a/lib/nodes.js +++ b/lib/nodes.js @@ -733,7 +733,7 @@ // Compiles the range's source variables -- where it starts and where it ends. // But only if they need to be cached to avoid double evaluation. RangeNode.prototype.compile_variables = function(o) { - var _b, _c, parts, tail; + var _b, _c, parts; _b = this.from.compile_reference(o, true); this.from = _b[0]; this.from_var = _b[1]; @@ -747,11 +747,10 @@ if (this.to !== this.to_var) { parts.push(this.to.compile(o)); } - tail = ("\n" + o.indent); if (parts.length) { - return "" + (parts.join('; ')) + ";" + tail; + return "" + (parts.join('; ')) + ";\n" + o.indent; } else { - return tail; + return ''; } }; // When compiled normally, the range returns the contents of the *for loop* @@ -1621,7 +1620,7 @@ // comprehensions. Some of the generated code can be shared in common, and // some cannot. ForNode.prototype.compile_node = function(o) { - var body, body_dent, close, for_part, index, ivar, lvar, name, range, return_result, rvar, scope, set_result, source, source_part, step_part, svar, top_level, var_part, vars; + var body, body_dent, close, for_part, index, ivar, lvar, name, range, return_result, rvar, scope, source, source_part, step_part, svar, top_level, var_part, vars; top_level = del(o, 'top') && !this.returns; range = this.source instanceof ValueNode && this.source.base instanceof RangeNode && !this.source.properties.length; source = range ? this.source.base : this.source; @@ -1649,7 +1648,7 @@ })); } else { svar = scope.free_variable(); - source_part = ("" + svar + " = " + (this.source.compile(o)) + ";\n" + this.tab); + source_part = ("" + svar + " = " + (this.source.compile(o)) + ";"); if (this.pattern) { var_part = new AssignNode(this.name, literal(("" + svar + "[" + ivar + "]"))).compile(merge(o, { indent: this.idt(1), @@ -1666,7 +1665,8 @@ for_part = ("" + ivar + " = 0, " + lvar + " = " + (svar) + ".length; " + ivar + " < " + lvar + "; " + step_part); } } - set_result = rvar ? this.idt() + rvar + ' = []; ' : this.idt(); + source_part = (rvar ? ("" + rvar + " = []; ") : '') + source_part; + source_part = source_part ? ("" + this.tab + source_part + "\n" + this.tab) : this.tab; return_result = this.compile_return_value(rvar, o); if (top_level && body.contains(function(n) { return n instanceof CodeNode; @@ -1684,7 +1684,7 @@ })); vars = range ? name : ("" + name + ", " + ivar); close = this.object ? '}}' : '}'; - return "" + set_result + (source_part) + "for (" + for_part + ") {\n" + var_part + body + "\n" + this.tab + close + return_result; + return "" + (source_part) + "for (" + for_part + ") {\n" + var_part + body + "\n" + this.tab + close + return_result; }; return ForNode; })(); diff --git a/lib/rewriter.js b/lib/rewriter.js index 0c9e75f3..12194f44 100644 --- a/lib/rewriter.js +++ b/lib/rewriter.js @@ -148,6 +148,7 @@ close_calls = __bind(function(i) { var _c, size, tmp; (_c = stack[stack.length - 1]); + for (tmp = 0; tmp < _c; tmp += 1) { this.tokens.splice(i, 0, ['CALL_END', ')', this.tokens[i][2]]); } diff --git a/src/nodes.coffee b/src/nodes.coffee index 3de2c227..dc97e5c7 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -541,8 +541,7 @@ exports.RangeNode: class RangeNode extends BaseNode parts: [] parts.push @from.compile o if @from isnt @from_var parts.push @to.compile o if @to isnt @to_var - tail: "\n$o.indent" - if parts.length then "${parts.join('; ')};$tail" else tail + if parts.length then "${parts.join('; ')};\n$o.indent" else '' # When compiled normally, the range returns the contents of the *for loop* # needed to iterate over the values in the range. Used by comprehensions. @@ -1226,7 +1225,7 @@ exports.ForNode: class ForNode extends BaseNode for_part: source.compile merge o, {index: ivar, step: @step} else svar: scope.free_variable() - source_part: "$svar = ${ @source.compile(o) };\n$@tab" + source_part: "$svar = ${ @source.compile(o) };" if @pattern var_part: new AssignNode(@name, literal("$svar[$ivar]")).compile(merge o, {indent: @idt(1), top: true}) + "\n" else @@ -1235,7 +1234,8 @@ exports.ForNode: class ForNode extends BaseNode lvar: scope.free_variable() step_part: if @step then "$ivar += ${ @step.compile(o) }" else "$ivar++" for_part: "$ivar = 0, $lvar = ${svar}.length; $ivar < $lvar; $step_part" - set_result: if rvar then @idt() + rvar + ' = []; ' else @idt() + source_part: (if rvar then "$rvar = []; " else '') + source_part + source_part: if source_part then "$@tab$source_part\n$@tab" else @tab return_result: @compile_return_value(rvar, o) body: ClosureNode.wrap(body, true) if top_level and body.contains (n) -> n instanceof CodeNode @@ -1247,7 +1247,7 @@ exports.ForNode: class ForNode extends BaseNode body: body.compile(merge(o, {indent: body_dent, top: true})) vars: if range then name else "$name, $ivar" close: if @object then '}}' else '}' - "$set_result${source_part}for ($for_part) {\n$var_part$body\n$@tab$close$return_result" + "${source_part}for ($for_part) {\n$var_part$body\n$@tab$close$return_result" #### IfNode