From acd69b1c70ea30a4f79c83f8f78d32ce9eb45a1d Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 30 Jul 2010 22:50:35 -0400 Subject: [PATCH] Fixing issue #544. Needed to special case implicit-object-closing for outdents -- it's different than a single-line implicit object with a terminator. --- lib/rewriter.js | 8 +++++++- src/rewriter.coffee | 5 +++++ test/test_literals.coffee | 13 +++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/rewriter.js b/lib/rewriter.js index 0baf897d..9f9f8322 100644 --- a/lib/rewriter.js +++ b/lib/rewriter.js @@ -128,7 +128,7 @@ return size; }, this); return this.scanTokens(__bind(function(prev, token, post, i) { - var _c, after, before, idx, len, open, tag; + var _c, after, before, idx, len, open, size, tag; tag = token[0]; len = stack.length - 1; before = this.tokens[i - 2]; @@ -146,10 +146,16 @@ if (tag === 'OUTDENT' && post && post[0] === '}') { return 1; } + if (tag === 'OUTDENT') { + size = closeBrackets(i); + } stack[len - 1] += stack.pop(); if (tag === '}') { stack[len - 1] -= 1; } + if (tag === 'OUTDENT') { + return size; + } } else if (tag === ':' && !open) { idx = before && before[0] === '@' ? i - 2 : i - 1; this.tokens.splice(idx, 0, ['{', '{', token[2]]); diff --git a/src/rewriter.coffee b/src/rewriter.coffee index b3133f22..9163d9e7 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -19,6 +19,9 @@ else # its internal array of tokens. exports.Rewriter = class Rewriter + # Helpful snippet for debugging: + # puts (t[0] + '/' + t[1] for t in @tokens).join ' ' + # Rewrite the token stream in multiple passes, one logical filter at # a time. This could certainly be changed into a single pass through the # stream, with a big ol' efficient switch, but it's much nicer to work with @@ -138,8 +141,10 @@ exports.Rewriter = class Rewriter return 2 if tag is '{' and post and post[0] is 'INDENT' else if include EXPRESSION_END, tag return 1 if tag is 'OUTDENT' and post and post[0] is '}' + size = closeBrackets(i) if tag is 'OUTDENT' stack[len - 1] += stack.pop() stack[len - 1] -= 1 if tag is '}' + return size if tag is 'OUTDENT' else if tag is ':' and not open idx = if before and before[0] is '@' then i - 2 else i - 1 @tokens.splice idx, 0, ['{', '{', token[2]] diff --git a/test/test_literals.coffee b/test/test_literals.coffee index 0a736a46..889cace2 100644 --- a/test/test_literals.coffee +++ b/test/test_literals.coffee @@ -139,3 +139,16 @@ obj = ok obj.a is 1 ok obj.b is 2 + + +# Implicit objects nesting. +obj = + options: + value: yes + + fn: -> + {} + null + +ok obj.options.value is yes +ok obj.fn() is null \ No newline at end of file