diff --git a/lib/coffeescript/rewriter.js b/lib/coffeescript/rewriter.js index 7e29b4febd..31cc3bce2c 100644 --- a/lib/coffeescript/rewriter.js +++ b/lib/coffeescript/rewriter.js @@ -395,7 +395,7 @@ starter = indent = outdent = null; condition = function(token, i) { var ref, ref1, ref2, ref3; - return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && this.tokens[i - 1].newLine; + return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && (this.tokens[i - 1].newLine || this.tokens[i - 1][0] === 'OUTDENT'); }; action = function(token, i) { return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); diff --git a/src/rewriter.coffee b/src/rewriter.coffee index da4c26e6ec..133b7d4fdf 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -396,7 +396,8 @@ exports.Rewriter = class Rewriter not (token[0] is 'TERMINATOR' and @tag(i + 1) in EXPRESSION_CLOSE) and not (token[0] is 'ELSE' and starter isnt 'THEN') and not (token[0] in ['CATCH', 'FINALLY'] and starter in ['->', '=>']) or - token[0] in CALL_CLOSERS and @tokens[i - 1].newLine + token[0] in CALL_CLOSERS and + (@tokens[i - 1].newLine or @tokens[i - 1][0] is 'OUTDENT') action = (token, i) -> @tokens.splice (if @tag(i - 1) is ',' then i - 1 else i), 0, outdent diff --git a/test/formatting.coffee b/test/formatting.coffee index 544ded6902..138cdf2d4d 100644 --- a/test/formatting.coffee +++ b/test/formatting.coffee @@ -198,6 +198,29 @@ test "#1495, method call chaining", -> ).join ', ' eq 'a, b, c', result +test "chaining should not wrap spilling ternary", -> + throws -> CoffeeScript.compile """ + if 0 then 1 else g + a: 42 + .h() + """ + +test "chaining should wrap calls containing spilling ternary", -> + f = (x) -> h: x + id = (x) -> x + result = f if true then 42 else id + a: 2 + .h + eq 42, result + +test "chaining should work within spilling ternary", -> + f = (x) -> h: x + id = (x) -> x + result = f if false then 1 else id + a: 3 + .a + eq 3, result.h + # Nested blocks caused by paren unwrapping test "#1492: Nested blocks don't cause double semicolons", -> js = CoffeeScript.compile '(0;0)' diff --git a/test/modules.coffee b/test/modules.coffee index 33a9c30ac4..b662ed68b7 100644 --- a/test/modules.coffee +++ b/test/modules.coffee @@ -36,12 +36,6 @@ # CoffeeScript also supports optional commas within `{ … }`. -# Helper function -toJS = (str) -> - CoffeeScript.compile str, bare: yes - .replace /^\s+|\s+$/g, '' # Trim leading/trailing whitespace - - # Import statements test "backticked import statement", -> diff --git a/test/regexps.coffee b/test/regexps.coffee index 5ee91a15a9..8ee2b74c99 100644 --- a/test/regexps.coffee +++ b/test/regexps.coffee @@ -6,12 +6,6 @@ # * Regexen # * Heregexen -# Helper function -toJS = (str) -> - CoffeeScript.compile str, bare: yes - .replace /^\s+|\s+$/g, '' # Trim leading/trailing whitespace - - test "basic regular expression literals", -> ok 'a'.match(/a/) ok 'a'.match /a/ diff --git a/test/strings.coffee b/test/strings.coffee index a2bd804141..3e0407ecf9 100644 --- a/test/strings.coffee +++ b/test/strings.coffee @@ -7,12 +7,6 @@ # * Strings # * Heredocs -# Helper function -toJS = (str) -> - CoffeeScript.compile str, bare: yes - .replace /^\s+|\s+$/g, '' # Trim leading/trailing whitespace - - test "backslash escapes", -> eq "\\/\\\\", /\/\\/.source diff --git a/test/support/helpers.coffee b/test/support/helpers.coffee index 3fc46508af..5ec9684156 100644 --- a/test/support/helpers.coffee +++ b/test/support/helpers.coffee @@ -15,3 +15,7 @@ arrayEgal = (a, b) -> exports.eq = (a, b, msg) -> ok egal(a, b), msg or "Expected #{a} to equal #{b}" exports.arrayEq = (a, b, msg) -> ok arrayEgal(a,b), msg or "Expected #{a} to deep equal #{b}" + +exports.toJS = (str) -> + CoffeeScript.compile str, bare: yes + .replace /^\s+|\s+$/g, '' # Trim leading/trailing whitespace