diff --git a/external/builder/fixtures_esprima/blocks-expected.js b/external/builder/fixtures_esprima/blocks-expected.js index 22e7b7434..f45aff378 100644 --- a/external/builder/fixtures_esprima/blocks-expected.js +++ b/external/builder/fixtures_esprima/blocks-expected.js @@ -1,10 +1,10 @@ function test() { - "test"; - "1"; - "2"; - "3"; - if ("test") { - "5"; - } - "4"; + "test"; + "1"; + "2"; + "3"; + if ("test") { + "5"; + } + "4"; } diff --git a/external/builder/fixtures_esprima/comments-expected.js b/external/builder/fixtures_esprima/comments-expected.js index 270742445..f36ff416d 100644 --- a/external/builder/fixtures_esprima/comments-expected.js +++ b/external/builder/fixtures_esprima/comments-expected.js @@ -1,28 +1,28 @@ function f1() { - /* head */ - "1"; - /* mid */ - "2"; + /* head */ + "1"; + /* mid */ + "2"; } /* tail */ function f2() { - // head - "1"; - // mid - "2"; + // head + "1"; + // mid + "2"; } // tail function f2() { - if ("1") { - // begin block - "1"; + if ("1") { + // begin block + "1"; + } + "2"; + // trailing + if (/* s */ + "3") + /*e*/ + { + "4"; } - "2"; - // trailing - if (/* s */ - "3") - /*e*/ - { - "4"; - } } diff --git a/external/builder/fixtures_esprima/deadcode-expected.js b/external/builder/fixtures_esprima/deadcode-expected.js new file mode 100644 index 000000000..ea82c1623 --- /dev/null +++ b/external/builder/fixtures_esprima/deadcode-expected.js @@ -0,0 +1,13 @@ +function f1() { +} +function f2() { + return 1; +} +function f3() { + var i = 0; + throw "test"; +} +function f4() { + var i = 0; +} + diff --git a/external/builder/fixtures_esprima/deadcode.js b/external/builder/fixtures_esprima/deadcode.js new file mode 100644 index 000000000..60c9d0f07 --- /dev/null +++ b/external/builder/fixtures_esprima/deadcode.js @@ -0,0 +1,25 @@ +function f1() { + return; + var i = 0; +} + +function f2() { + return 1; + var i = 0; +} + +function f3() { + var i = 0; + throw "test"; + var j = 0; +} + +function f4() { + var i = 0; + if (true) { + return; + } + throw "test"; + var j = 0; +} + diff --git a/external/builder/fixtures_esprima/evals-expected.js b/external/builder/fixtures_esprima/evals-expected.js index 414de051c..48f1d1605 100644 --- a/external/builder/fixtures_esprima/evals-expected.js +++ b/external/builder/fixtures_esprima/evals-expected.js @@ -5,8 +5,8 @@ var d = false; var e = true; var f = 'text'; var g = { - "obj": { "i": 1 }, - "j": 2 + "obj": { "i": 1 }, + "j": 2 }; var h = { 'test': 'test' }; var i = '0'; diff --git a/external/builder/fixtures_esprima/ifs-expected.js b/external/builder/fixtures_esprima/ifs-expected.js index 12599c619..2e045e7fa 100644 --- a/external/builder/fixtures_esprima/ifs-expected.js +++ b/external/builder/fixtures_esprima/ifs-expected.js @@ -1,17 +1,17 @@ if ('test') { - "1"; + "1"; } { - "1"; + "1"; } { - "1"; + "1"; } ; { - "2"; + "2"; } ; if ('1') { - "1"; + "1"; } diff --git a/external/builder/preprocessor2.js b/external/builder/preprocessor2.js index ed05d2f55..82e15f293 100644 --- a/external/builder/preprocessor2.js +++ b/external/builder/preprocessor2.js @@ -169,22 +169,38 @@ function postprocessNode(ctx, node) { case 'BlockStatement': var subExpressionIndex = 0; while (subExpressionIndex < node.body.length) { - if (node.body[subExpressionIndex].type === 'EmptyStatement') { - // Removing empty statements from the blocks. - node.body.splice(subExpressionIndex, 1); - continue; - } - if (node.body[subExpressionIndex].type === 'BlockStatement') { - // Block statements inside a block are moved to the parent one. - var subChildren = node.body[subExpressionIndex].body; - Array.prototype.splice.apply(node.body, - [subExpressionIndex, 1].concat(subChildren)); - subExpressionIndex += subChildren.length; - continue; + switch (node.body[subExpressionIndex].type) { + case 'EmptyStatement': + // Removing empty statements from the blocks. + node.body.splice(subExpressionIndex, 1); + continue; + case 'BlockStatement': + // Block statements inside a block are moved to the parent one. + var subChildren = node.body[subExpressionIndex].body; + Array.prototype.splice.apply(node.body, + [subExpressionIndex, 1].concat(subChildren)); + subExpressionIndex += Math.max(subChildren.length - 1, 0); + continue; + case 'ReturnStatement': + case 'ThrowStatement': + // Removing dead code after return or throw. + node.body.splice(subExpressionIndex + 1, + node.body.length - subExpressionIndex - 1); + break; } subExpressionIndex++; } break; + case 'FunctionDeclaration': + case 'FunctionExpression': + var block = node.body; + if (block.body.length > 0 && + block.body[block.body.length - 1].type === 'ReturnStatement' && + !block.body[block.body.length - 1].argument) { + // Function body ends with return without arg -- removing it. + block.body.pop(); + } + break; } return node; }