From ffb488f81fe6787b6aac4db7798e96d7da9b9cb8 Mon Sep 17 00:00:00 2001 From: Julian Rosse Date: Thu, 6 Apr 2017 15:08:09 -0400 Subject: [PATCH] Fix #4487: Outdentation bug --- lib/coffee-script/lexer.js | 9 +++------ src/lexer.coffee | 9 +++------ test/formatting.coffee | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/coffee-script/lexer.js b/lib/coffee-script/lexer.js index c87dc96349..26d6577141 100644 --- a/lib/coffee-script/lexer.js +++ b/lib/coffee-script/lexer.js @@ -471,12 +471,9 @@ lastIndent = this.indents[this.indents.length - 1]; if (!lastIndent) { moveOut = 0; - } else if (lastIndent === this.outdebt) { - moveOut -= this.outdebt; - this.outdebt = 0; - } else if (lastIndent < this.outdebt) { - this.outdebt -= lastIndent; - moveOut -= lastIndent; + } else if (this.outdebt && moveOut <= this.outdebt) { + this.outdebt -= moveOut; + moveOut = 0; } else { dent = this.indents.pop() + this.outdebt; if (outdentLength && (ref2 = this.chunk[outdentLength], indexOf.call(INDENTABLE_CLOSERS, ref2) >= 0)) { diff --git a/src/lexer.coffee b/src/lexer.coffee index df10eaa98b..bfa6ec9a54 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -402,12 +402,9 @@ exports.Lexer = class Lexer lastIndent = @indents[@indents.length - 1] if not lastIndent moveOut = 0 - else if lastIndent is @outdebt - moveOut -= @outdebt - @outdebt = 0 - else if lastIndent < @outdebt - @outdebt -= lastIndent - moveOut -= lastIndent + else if @outdebt and moveOut <= @outdebt + @outdebt -= moveOut + moveOut = 0 else dent = @indents.pop() + @outdebt if outdentLength and @chunk[outdentLength] in INDENTABLE_CLOSERS diff --git a/test/formatting.coffee b/test/formatting.coffee index 31cc282840..d340ba709f 100644 --- a/test/formatting.coffee +++ b/test/formatting.coffee @@ -254,3 +254,20 @@ test "#1275: allow indentation before closing brackets", -> a = 1 ) eq 1, a + +test "#4487: Handle unusual outdentation", -> + a = + switch 1 + when 2 + no + when 3 then no + when 1 then yes + eq yes, a + + b = do -> + if no + if no + 1 + 2 + 3 + eq b, undefined