better categorisation of transformers

This commit is contained in:
Sebastian McKenzie 2015-01-23 23:02:40 +11:00
parent c7e4213641
commit 063fec0ca6
96 changed files with 64 additions and 103 deletions

View File

@ -3,6 +3,7 @@
module.exports = transform;
var Transformer = require("./transformer");
var object = require("../helpers/object");
var File = require("../file");
var util = require("../util");
var _ = require("lodash");
@ -24,7 +25,7 @@ transform.fromAst = function (ast, code, opts) {
transform._ensureTransformerNames = function (type, keys) {
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (!_.has(transform.transformers, key)) {
if (!transform.transformers[key]) {
throw new ReferenceError(
"Unknown transformer " + key + " specified in " + type + " - " +
"transformer key names have been changed in 3.0.0 see " +
@ -35,7 +36,7 @@ transform._ensureTransformerNames = function (type, keys) {
}
};
transform.transformers = {};
transform.transformers = object();
transform.moduleFormatters = {
common: require("./modules/common"),
@ -46,18 +47,20 @@ transform.moduleFormatters = {
};
_.each({
"spec.noForInOfAssignment": require("./transformers/spec/no-for-in-of-assignment"),
"spec.setters": require("./transformers/spec/setters"),
useStrict: require("./transformers/other/use-strict"),
"validation.undeclaredVariableCheck": require("./transformers/validation/undeclared-variable-check"),
"validation.noForInOfAssignment": require("./transformers/validation/no-for-in-of-assignment"),
"validation.setters": require("./transformers/validation/setters"),
"spec.blockScopedFunctions": require("./transformers/spec/block-scoped-functions"),
"spec.illegalTopLevelThis": require("./transformers/spec/illegal-top-level-this"),
"playground.malletOperator": require("./transformers/playground/mallet-operator"),
"playground.methodBinding": require("./transformers/playground/method-binding"),
"playground.memoizationOperator": require("./transformers/playground/memoization-operator"),
"playground.objectGetterMemoization": require("./transformers/playground/object-getter-memoization"),
"optional.asyncToGenerator": require("./transformers/optional/async-to-generator"),
"optional.bluebirdCoroutines": require("./transformers/optional/bluebird-coroutines"),
"misc.asyncToGenerator": require("./transformers/misc/async-to-generator"),
"misc.bluebirdCoroutines": require("./transformers/misc/bluebird-coroutines"),
react: require("./transformers/other/react"),
@ -96,9 +99,8 @@ _.each({
"es6.blockScoping": require("./transformers/es6/block-scoping"),
// needs to be after `es6.blockScoping` due to needing `letReferences` set on blocks
"optional.blockScopingTDZ": require("./transformers/optional/block-scoping-tdz"),
"es6.blockScopingTDZ": require("./transformers/es6/block-scoping-tdz"),
// needs to before `forOf` because otherwise regenerator wont be able to explode them
// needs to be after block scoping since regenerator doesn't support it
regenerator: require("./transformers/other/regenerator"),
@ -110,25 +112,22 @@ _.each({
// needs to be after `regenerator` due to needing `regeneratorRuntime` references
// needs to be after `es6.forOf` due to needing `Symbol.iterator` references
// needs to be before `es6.modules` due to dynamic imports
"optional.selfContained": require("./transformers/optional/self-contained"),
"misc.selfContained": require("./transformers/misc/self-contained"),
_blockHoist: require("./transformers/_block-hoist"),
"optional.protoToAssign": require("./transformers/optional/proto-to-assign"),
"spec.protoToAssign": require("./transformers/spec/proto-to-assign"),
_declarations: require("./transformers/_declarations"),
useStrict: require("./transformers/other/use-strict"),
_aliasFunctions: require("./transformers/_alias-functions"),
_moduleFormatter: require("./transformers/_module-formatter"),
"optional.typeofSymbol": require("./transformers/optional/typeof-symbol"),
"optional.undefinedToVoid": require("./transformers/optional/undefined-to-void"),
"optional.undeclaredVariableCheck": require("./transformers/optional/undeclared-variable-check"),
"spec.typeofSymbol": require("./transformers/spec/typeof-symbol"),
"spec.undefinedToVoid": require("./transformers/spec/undefined-to-void"),
"spec.propertyLiterals": require("./transformers/spec/property-literals"),
"spec.memberExpressionLiterals": require("./transformers/spec/member-expression-literals")
"minification.propertyLiterals": require("./transformers/minification/property-literals"),
"minification.memberExpressionLiterals": require("./transformers/minification/member-expression-literals")
}, function (transformer, key) {
transform.transformers[key] = new Transformer(key, transformer);
});

View File

@ -5,10 +5,11 @@ var t = require("../../../types");
exports.MemberExpression = function (node) {
var prop = node.property;
if (node.computed && t.isLiteral(prop) && t.isValidIdentifier(prop.value)) {
// computed literal that is a valid identifier
// foo["bar"] => foo.bar
node.property = t.identifier(prop.value);
node.computed = false;
} else if (!node.computed && t.isIdentifier(prop) && !t.isValidIdentifier(prop.name)) {
// foo.default -> foo["default"]
node.property = t.literal(prop.name);
node.computed = true;
}

View File

@ -5,11 +5,11 @@ var t = require("../../../types");
exports.Property = function (node) {
var key = node.key;
if (t.isLiteral(key) && t.isValidIdentifier(key.value)) {
// property key is a literal but a valid identifier
// "foo": "bar" -> foo: "bar"
node.key = t.identifier(key.value);
node.computed = false;
} else if (!node.computed && t.isIdentifier(key) && !t.isValidIdentifier(key.name)) {
// property key is a keyword
// default: "bar" -> "default": "bar"
node.key = t.literal(key.name);
}
};

View File

@ -1,48 +0,0 @@
var traverse = require("../../../traverse");
var t = require("../../../types");
var visitor = {
enter: function (node, parent, scope, context, state) {
if (!t.isReferencedIdentifier(node, parent)) return;
var declared = state.letRefs[node.name];
if (!declared) return;
// declared node is different in this scope
if (scope.get(node.name, true) !== declared) return;
var declaredLoc = declared.loc;
var referenceLoc = node.loc;
if (!declaredLoc || !referenceLoc) return;
// does this reference appear on a line before the declaration?
var before = referenceLoc.start.line < declaredLoc.start.line;
if (referenceLoc.start.line === declaredLoc.start.line) {
// this reference appears on the same line
// check it appears before the declaration
before = referenceLoc.start.col < declaredLoc.start.col;
}
if (before) {
throw state.file.errorWithNode(node, "Temporal dead zone - accessing a variable before it's initialized");
}
}
};
exports.optional = true;
exports.Loop =
exports.Program =
exports.BlockStatement = function (node, parent, scope, context, file) {
var letRefs = node._letReferences;
if (!letRefs) return;
var state = {
letRefs: letRefs,
file: file
};
traverse(node, visitor, scope, state);
};

View File

@ -7,7 +7,6 @@
var esutils = require("esutils");
var t = require("../../../types");
var _ = require("lodash");
exports.JSXIdentifier = function (node) {
if (esutils.keyword.isIdentifierName(node.name)) {
@ -148,7 +147,7 @@ exports.JSXElement = {
for (var i = 0; i < node.children.length; i++) {
var child = node.children[i];
if (t.isLiteral(child) && _.isString(child.value)) {
if (t.isLiteral(child) && typeof child.value === "string") {
cleanJSXElementLiteralChild(child, callExpr.arguments);
continue;
} else if (t.isJSXEmptyExpression(child)) {

View File

@ -10,3 +10,12 @@ exports.ast = {
}
}
};
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, parent, scope, context) {
context.skip();
};
exports.ThisExpression = function (node, parent, scope, context, file) {
throw file.errorWithNode(node, "Top level `this` is not allowed", ReferenceError);
};

View File

@ -1,8 +0,0 @@
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, parent, scope, context) {
context.skip();
};
exports.ThisExpression = function (node, parent, scope, context, file) {
throw file.errorWithNode(node, "Top level `this` is not allowed", ReferenceError);
};

View File

@ -0,0 +1,4 @@
{
"noCheckAst": true,
"optional": ["misc.asyncToGenerator"]
}

View File

@ -0,0 +1,4 @@
{
"optional": ["misc.bluebirdCoroutines"],
"noCheckAst": true
}

View File

@ -0,0 +1,4 @@
{
"optional": ["misc.selfContained"],
"experimental": true
}

View File

@ -1,4 +0,0 @@
{
"noCheckAst": true,
"optional": ["asyncToGenerator"]
}

View File

@ -1,4 +0,0 @@
{
"optional": ["bluebirdCoroutines"],
"noCheckAst": true
}

View File

@ -1,3 +0,0 @@
{
"optional": ["protoToAssign"]
}

View File

@ -1,4 +0,0 @@
{
"optional": ["selfContained"],
"experimental": true
}

View File

@ -1,3 +0,0 @@
{
"optional": ["typeofSymbol"]
}

View File

@ -1,3 +0,0 @@
{
"optional": ["undeclaredVariableCheck"]
}

View File

@ -1,3 +0,0 @@
{
"optional": ["undefinedToVoid"]
}

View File

@ -0,0 +1,3 @@
{
"optional": ["spec.protoToAssign"]
}

View File

@ -0,0 +1,3 @@
{
"optional": ["spec.typeofSymbol"]
}

View File

@ -0,0 +1,3 @@
{
"optional": ["spec.undefinedToVoid"]
}

View File

@ -0,0 +1,3 @@
{
"throws": "Top level `this` is not allowed"
}

View File

@ -0,0 +1,3 @@
{
"throws": "Top level `this` is not allowed"
}

View File

@ -0,0 +1,3 @@
{
"throws": "Top level `this` is not allowed"
}

View File

@ -0,0 +1,3 @@
{
"optional": ["validation.undeclaredVariableCheck"]
}