diff --git a/lib/6to5/transformation/transformers/_block-hoist.js b/lib/6to5/transformation/transformers/_block-hoist.js index b6fff4a860..e024a8a193 100644 --- a/lib/6to5/transformation/transformers/_block-hoist.js +++ b/lib/6to5/transformation/transformers/_block-hoist.js @@ -1,4 +1,5 @@ -var _ = require("lodash"); +var useStrict = require("./use-strict"); +var _ = require("lodash"); // Priority: // @@ -17,13 +18,15 @@ exports.Program = { } if (!hasChange) return; - var nodePriorities = _.groupBy(node.body, function (bodyNode) { - var priority = bodyNode._blockHoist; - if (priority == null) priority = 1; - if (priority === true) priority = 2; - return priority; - }); + useStrict._wrap(node, function () { + var nodePriorities = _.groupBy(node.body, function (bodyNode) { + var priority = bodyNode._blockHoist; + if (priority == null) priority = 1; + if (priority === true) priority = 2; + return priority; + }); - node.body = _.flatten(_.values(nodePriorities).reverse()); + node.body = _.flatten(_.values(nodePriorities).reverse()); + }); } }; diff --git a/lib/6to5/transformation/transformers/_declarations.js b/lib/6to5/transformation/transformers/_declarations.js index ae0f355b08..20fbfadb6e 100644 --- a/lib/6to5/transformation/transformers/_declarations.js +++ b/lib/6to5/transformation/transformers/_declarations.js @@ -1,4 +1,5 @@ -var t = require("../../types"); +var useStrict = require("./use-strict"); +var t = require("../../types"); exports.secondPass = true; @@ -7,23 +8,25 @@ exports.Program = function (node) { var kinds = {}; var kind; - for (var i in node._declarations) { - var declar = node._declarations[i]; + useStrict._wrap(node, function () { + for (var i in node._declarations) { + var declar = node._declarations[i]; - kind = declar.kind || "var"; - var declarNode = t.variableDeclarator(declar.id, declar.init); + kind = declar.kind || "var"; + var declarNode = t.variableDeclarator(declar.id, declar.init); - if (!declar.init) { - kinds[kind] = kinds[kind] || []; - kinds[kind].push(declarNode); - } else { - node.body.unshift(t.variableDeclaration(kind, [declarNode])); + if (!declar.init) { + kinds[kind] = kinds[kind] || []; + kinds[kind].push(declarNode); + } else { + node.body.unshift(t.variableDeclaration(kind, [declarNode])); + } } - } - for (kind in kinds) { - node.body.unshift(t.variableDeclaration(kind, kinds[kind])); - } + for (kind in kinds) { + node.body.unshift(t.variableDeclaration(kind, kinds[kind])); + } + }); node._declarations = null; }; diff --git a/lib/6to5/transformation/transformers/use-strict.js b/lib/6to5/transformation/transformers/use-strict.js index 02d4dbc264..bd9fd9c651 100644 --- a/lib/6to5/transformation/transformers/use-strict.js +++ b/lib/6to5/transformation/transformers/use-strict.js @@ -1,14 +1,27 @@ var t = require("../../types"); +exports._has = function (node) { + var first = node.body[0]; + return t.isExpressionStatement(first) && t.isLiteral(first.expression, { value: "use strict" }); +}; + +exports._wrap = function (node, callback) { + var useStrictNode; + if (exports._has(node)) { + useStrictNode = node.body.shift(); + } + + callback(); + + if (useStrictNode) { + node.body.unshift(useStrictNode); + } +}; + exports.ast = { exit: function (ast) { - var body = ast.program.body; - var first = body[0]; - - var noStrict = !first || !t.isExpressionStatement(first) || !t.isLiteral(first.expression) || first.expression.value !== "use strict"; - - if (noStrict) { - body.unshift(t.expressionStatement(t.literal("use strict"))); + if (!exports._has(ast.program)) { + ast.program.body.unshift(t.expressionStatement(t.literal("use strict"))); } } };