fix blockHoist and declarations transformers unneccesarily unshifting use strict statements
This commit is contained in:
parent
45d0eea842
commit
f85eeeb93c
@ -1,4 +1,5 @@
|
|||||||
var _ = require("lodash");
|
var useStrict = require("./use-strict");
|
||||||
|
var _ = require("lodash");
|
||||||
|
|
||||||
// Priority:
|
// Priority:
|
||||||
//
|
//
|
||||||
@ -17,13 +18,15 @@ exports.Program = {
|
|||||||
}
|
}
|
||||||
if (!hasChange) return;
|
if (!hasChange) return;
|
||||||
|
|
||||||
var nodePriorities = _.groupBy(node.body, function (bodyNode) {
|
useStrict._wrap(node, function () {
|
||||||
var priority = bodyNode._blockHoist;
|
var nodePriorities = _.groupBy(node.body, function (bodyNode) {
|
||||||
if (priority == null) priority = 1;
|
var priority = bodyNode._blockHoist;
|
||||||
if (priority === true) priority = 2;
|
if (priority == null) priority = 1;
|
||||||
return priority;
|
if (priority === true) priority = 2;
|
||||||
});
|
return priority;
|
||||||
|
});
|
||||||
|
|
||||||
node.body = _.flatten(_.values(nodePriorities).reverse());
|
node.body = _.flatten(_.values(nodePriorities).reverse());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
var t = require("../../types");
|
var useStrict = require("./use-strict");
|
||||||
|
var t = require("../../types");
|
||||||
|
|
||||||
exports.secondPass = true;
|
exports.secondPass = true;
|
||||||
|
|
||||||
@ -7,23 +8,25 @@ exports.Program = function (node) {
|
|||||||
var kinds = {};
|
var kinds = {};
|
||||||
var kind;
|
var kind;
|
||||||
|
|
||||||
for (var i in node._declarations) {
|
useStrict._wrap(node, function () {
|
||||||
var declar = node._declarations[i];
|
for (var i in node._declarations) {
|
||||||
|
var declar = node._declarations[i];
|
||||||
|
|
||||||
kind = declar.kind || "var";
|
kind = declar.kind || "var";
|
||||||
var declarNode = t.variableDeclarator(declar.id, declar.init);
|
var declarNode = t.variableDeclarator(declar.id, declar.init);
|
||||||
|
|
||||||
if (!declar.init) {
|
if (!declar.init) {
|
||||||
kinds[kind] = kinds[kind] || [];
|
kinds[kind] = kinds[kind] || [];
|
||||||
kinds[kind].push(declarNode);
|
kinds[kind].push(declarNode);
|
||||||
} else {
|
} else {
|
||||||
node.body.unshift(t.variableDeclaration(kind, [declarNode]));
|
node.body.unshift(t.variableDeclaration(kind, [declarNode]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (kind in kinds) {
|
for (kind in kinds) {
|
||||||
node.body.unshift(t.variableDeclaration(kind, kinds[kind]));
|
node.body.unshift(t.variableDeclaration(kind, kinds[kind]));
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
node._declarations = null;
|
node._declarations = null;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,14 +1,27 @@
|
|||||||
var t = require("../../types");
|
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 = {
|
exports.ast = {
|
||||||
exit: function (ast) {
|
exit: function (ast) {
|
||||||
var body = ast.program.body;
|
if (!exports._has(ast.program)) {
|
||||||
var first = body[0];
|
ast.program.body.unshift(t.expressionStatement(t.literal("use strict")));
|
||||||
|
|
||||||
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")));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user