From d3fce0d0ec5823e5a749a0a6f329f8d1144cbd7b Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 2 Oct 2014 15:46:33 +0400 Subject: [PATCH] JS inline return statements after top return --- .../k2js/inline/FunctionInlineMutator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java b/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java index 6d553ffe268..387df918e08 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java @@ -88,10 +88,12 @@ class FunctionInlineMutator { removeDefaultInitializers(arguments, parameters, body); aliasArgumentsIfNeeded(namingContext, arguments, parameters); renameLocalNames(namingContext, invokedFunction); + removeStatementsAfterTopReturn(); if (canBeExpression(body)) { resultExpr = asExpression(body); body.getStatements().clear(); + /** JsExpression can be immutable, so need to reassign */ resultExpr = (JsExpression) namingContext.applyRenameTo(resultExpr); } else { @@ -115,6 +117,20 @@ class FunctionInlineMutator { replaceThisReference(body, thisReplacement); } + private void removeStatementsAfterTopReturn() { + List statements = body.getStatements(); + + int statementsSize = statements.size(); + for (int i = 0; i < statementsSize; i++) { + JsStatement statement = statements.get(i); + + if (statement instanceof JsReturn) { + statements.subList(i + 1, statementsSize).clear(); + break; + } + } + } + private void processReturns() { int returnCount = collectInstances(JsReturn.class, body).size(); if (returnCount == 0) {