diff --git a/src/stages/main/patchers/BlockPatcher.js b/src/stages/main/patchers/BlockPatcher.js index cf34b76fa..af577a930 100644 --- a/src/stages/main/patchers/BlockPatcher.js +++ b/src/stages/main/patchers/BlockPatcher.js @@ -37,14 +37,22 @@ export default class BlockPatcher extends NodePatcher { this.statements.forEach( (statement, i, statements) => { if (i === statements.length - 1 && this.parent instanceof FunctionPatcher) { - let previousStatement = statements[i - 1]; if (statement instanceof ReturnPatcher && !statement.expression) { + let removeStart; + if (statements.length > 1) { + let startOfLineIndex = this.context.sourceTokens.lastIndexOfTokenMatchingPredicate( + token => token.type === NEWLINE || token.type === SEMICOLON, + statement.outerStartTokenIndex + ); + removeStart = this.sourceTokenAtIndex(startOfLineIndex).start; + } else { + removeStart = statement.outerStart; + } this.remove( - previousStatement ? - previousStatement.outerEnd : - statement.outerStart, + removeStart, statement.outerEnd ); + return; } } if (statement.isSurroundedByParentheses()) { diff --git a/test/return_test.js b/test/return_test.js index e3b46bda4..d09fdbffc 100644 --- a/test/return_test.js +++ b/test/return_test.js @@ -27,4 +27,32 @@ describe('return', () => { () => true ? null : undefined; `) ); + + it('preserves comments when removing trailing empty returns', () => + check(` + -> + a # b + return + `, ` + (function() { + a; // b + }); + `) + ); + + it('correctly removes trailing empty returns on the same line as another statement', () => + check(` + -> a; return + `, ` + (function() { a; }); + `) + ); + + it('correctly removes trailing empty returns as the only function statement', () => + check(` + -> return + `, ` + (function() { }); + `) + ); });