add messages to make it easier to make error messages

This commit is contained in:
Sebastian McKenzie 2015-02-11 15:57:30 +11:00
parent 4ebd0a1e8a
commit a4932e0e0f
24 changed files with 98 additions and 41 deletions

48
lib/6to5/messages.js Normal file
View File

@ -0,0 +1,48 @@
var toArray = require("lodash/lang/toArray");
exports.messages = {
tailCallReassignmentDeopt: "Function reference has been reassigned so it's probably be dereferenced so we can't optimise this with confidence",
JSXNamespacedTags: "Namespace tags are not supported. ReactJSX is not XML.",
classesIllegalBareSuper: "Illegal use of bare super",
classesIllegalSuperCall: "Direct super call is illegal in non-constructor, use super.$1() instead",
classesIllegalConstructorKind: "Illegal kind for constructor method",
scopeDuplicateDeclaration: "Duplicate declaration $1",
undeclaredVariable: "Reference to undeclared variable $1",
undeclaredVariableSuggestion: "Reference to undeclared variable $1 - did you mean $2?",
settersInvalidParamLength: "Setters must have only one parameter",
noAssignmentsInForHead: "No assignments allowed in for-in/of head",
expectedMemberExpressionOrIdentifier: "Expected type MemeberExpression or Identifier",
invalidParentForThisNode: "We don't know how to handle this node within the current parent - please open an issue",
readOnly: "$1 is read-only",
modulesIllegalExportName: "Illegal export $1",
unknownForHead: "Unknown node type $1 in ForStatement"
};
exports.get = function (key) {
var msg = exports.messages[key];
if (!msg) throw new ReferenceError("Unknown message `" + key + "`");
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
args = exports.parseArgs(args);
return msg.replace(/\$(\d+)/g, function (str, i) {
return args[--i];
});
};
exports.parseArgs = function (args) {
return args.map(function (val) {
if (val != null && val.inspect) {
return val.inspect();
} else {
try {
return JSON.stringify(val) || val + "";
} catch (e) {
return util.inspect(val);
}
}
});
};

View File

@ -6,6 +6,7 @@
// jsx
var isString = require("lodash/lang/isString");
var messages = require("../../messages");
var esutils = require("esutils");
var react = require("./react");
var t = require("../../types");
@ -28,7 +29,7 @@ module.exports = function (exports, opts) {
};
exports.JSXNamespacedName = function (node, parent, scope, file) {
throw file.errorWithNode(node, "Namespace tags are not supported. ReactJSX is not XML.");
throw file.errorWithNode(node, messages.get("JSXNamespacedTags"));
};
exports.JSXMemberExpression = {

View File

@ -2,7 +2,8 @@
module.exports = ReplaceSupers;
var t = require("../../types");
var messages = require("../../messages");
var t = require("../../types");
/**
* Description
@ -232,7 +233,7 @@ ReplaceSupers.prototype.specHandle = function (getThisReference, node, parent) {
var thisReference;
if (isIllegalBareSuper(node, parent)) {
throw this.file.errorWithNode(node, "Illegal use of bare super");
throw this.file.errorWithNode(node, messages.get("classesIllegalBareSuper"));
}
if (t.isCallExpression(node)) {
@ -248,7 +249,7 @@ ReplaceSupers.prototype.specHandle = function (getThisReference, node, parent) {
// - https://twitter.com/wycats/status/544553184396836864
if (methodNode.key.name !== "constructor" || !this.inClass) {
var methodName = methodNode.key.name || "METHOD_NAME";
throw this.file.errorWithNode(node, "Direct super call is illegal in non-constructor, use super." + methodName + "() instead");
throw this.file.errorWithNode(node, messages.get("classesIllegalSuperCall", methodName));
}
} else if (t.isMemberExpression(callee) && isSuper(callee.object, callee)) {
// super.test(); -> _get(Object.getPrototypeOf(ClassName.prototype), "test", this).call(this);

View File

@ -2,10 +2,11 @@
module.exports = DefaultFormatter;
var messages = require("../../messages");
var extend = require("lodash/object/extend");
var object = require("../../helpers/object");
var util = require("../../util");
var t = require("../../types");
var extend = require("lodash/object/extend");
function DefaultFormatter(file) {
this.file = file;
@ -124,13 +125,6 @@ DefaultFormatter.prototype.isLocalReference = function (node) {
return t.isIdentifier(node) && localImports[node.name] && localImports[node.name] !== node;
};
DefaultFormatter.prototype.checkLocalReference = function (node) {
var file = this.file;
if (this.isLocalReference(node)) {
throw file.errorWithNode(node, "Illegal assignment of module import");
}
};
DefaultFormatter.prototype.remapExportAssignment = function (node) {
return t.assignmentExpression(
"=",
@ -213,7 +207,7 @@ DefaultFormatter.prototype.getExternalReference = function (node, nodes) {
DefaultFormatter.prototype.checkExportIdentifier = function (node) {
if (t.isIdentifier(node, { name: "__esModule" })) {
throw this.file.errorWithNode(node, "Illegal export __esModule - this is used internally for CommonJS interop");
throw this.file.errorWithNode(node, messages.get("modulesIllegalExportName", node.name));
}
};

View File

@ -3,6 +3,7 @@
var ReplaceSupers = require("../../helpers/replace-supers");
var nameMethod = require("../../helpers/name-method");
var defineMap = require("../../helpers/define-map");
var messages = require("../../../messages");
var util = require("../../../util");
var t = require("../../../types");
@ -277,7 +278,7 @@ ClassTransformer.prototype.pushProperty = function (node) {
ClassTransformer.prototype.pushConstructor = function (method) {
if (method.kind) {
throw this.file.errorWithNode(method, "illegal kind for constructor method");
throw this.file.errorWithNode(method, messages.get("classesIllegalConstructorKind"));
}
var construct = this.constructor;

View File

@ -1,6 +1,7 @@
"use strict";
var t = require("../../../types");
var messages = require("../../../messages");
var t = require("../../../types");
exports.check = function (node) {
return t.isVariableDeclaration(node, { kind: "const" });
@ -29,7 +30,7 @@ var visitor = {
// check if there's been a local binding that shadows this constant
if (!scope.bindingIdentifierEquals(name, constantIdentifier)) continue;
throw state.file.errorWithNode(id, name + " is read-only");
throw state.file.errorWithNode(id, messages.get("readOnly", name));
}
} else if (t.isScope(node, parent)) {
this.skip();

View File

@ -1,6 +1,7 @@
"use strict";
var t = require("../../../types");
var messages = require("../../../messages");
var t = require("../../../types");
exports.check = t.isPattern;
@ -387,7 +388,7 @@ exports.VariableDeclaration = function (node, parent, scope, file) {
declar = declar || t.variableDeclaration(node.kind, []);
if (!t.isVariableDeclaration(node) && declar.kind !== node.kind) {
throw file.errorWithNode(node, "Cannot use this node within the current parent");
throw file.errorWithNode(node, messages.get("invalidParentForThisNode"));
}
declar.declarations = declar.declarations.concat(node.declarations);

View File

@ -1,7 +1,8 @@
"use strict";
var util = require("../../../util");
var t = require("../../../types");
var messages = require("../../../messages");
var util = require("../../../util");
var t = require("../../../types");
exports.check = t.isForOfStatement;
@ -50,7 +51,7 @@ var loose = function (node, parent, scope, file) {
t.variableDeclarator(left.declarations[0].id, id)
]);
} else {
throw file.errorWithNode(left, "Unknown node type " + left.type + " in ForOfStatement");
throw file.errorWithNode(left, messages.get("unknownForHead", left.type));
}
var loop = util.template("for-of-loose", {
@ -89,7 +90,7 @@ var spec = function (node, parent, scope, file) {
t.variableDeclarator(left.declarations[0].id, stepValue)
]);
} else {
throw file.errorWithNode(left, "Unknown node type " + left.type + " in ForOfStatement");
throw file.errorWithNode(left, messages.get("unknownForHead", left.type));
}
var loop = util.template("for-of", {

View File

@ -1,7 +1,8 @@
"use strict";
var build = require("../../helpers/build-conditional-assignment-operator-transformer");
var t = require("../../../types");
var messages = require("../../../messages");
var build = require("../../helpers/build-conditional-assignment-operator-transformer");
var t = require("../../../types");
exports.playground = true;
@ -11,7 +12,7 @@ build(exports, {
if (is) {
var left = node.left;
if (!t.isMemberExpression(left) && !t.isIdentifier(left)) {
throw file.errorWithNode(left, "Expected type MemeberExpression or Identifier");
throw file.errorWithNode(left, messages.get("expectedMemberExpressionOrIdentifier"));
}
return true;
}

View File

@ -1,6 +1,7 @@
"use strict";
var t = require("../../../types");
var messages = require("../../../messages");
var t = require("../../../types");
exports.check = t.isFor;
@ -9,6 +10,6 @@ exports.ForOfStatement = function (node, parent, scope, file) {
var left = node.left;
if (t.isVariableDeclaration(left)) {
var declar = left.declarations[0];
if (declar.init) throw file.errorWithNode(declar, "No assignments allowed in for-in/of head");
if (declar.init) throw file.errorWithNode(declar, messages.get("noAssignmentsInForHead"));
}
};

View File

@ -1,5 +1,7 @@
"use strict";
var messages = require("../../../messages");
exports.check = function (node) {
return node.kind === "set";
};
@ -7,6 +9,6 @@ exports.check = function (node) {
exports.MethodDefinition =
exports.Property = function (node, parent, scope, file) {
if (node.kind === "set" && node.value.params.length !== 1) {
throw file.errorWithNode(node.value, "Setters must have only one parameter");
throw file.errorWithNode(node.value, messages.get("settersInvalidParamLength"));
}
};

View File

@ -1,6 +1,7 @@
"use strict";
var levenshtein = require("../../../helpers/levenshtein");
var messages = require("../../../messages");
var t = require("../../../types");
exports.optional = true;
@ -28,8 +29,11 @@ exports.Identifier = function (node, parent, scope, file) {
shortest = distance;
}
var msg;
if (closest) {
msg += " - Did you mean " + closest + "?";
msg = messages.get("undeclaredVariableSuggestion", node.name, closest);
} else {
msg = messages.get("undeclaredVariable", node.name);
}
//

View File

@ -5,6 +5,7 @@ module.exports = Scope;
var includes = require("lodash/collection/includes");
var traverse = require("./index");
var defaults = require("lodash/object/defaults");
var messages = require("../messages");
var globals = require("globals");
var flatten = require("lodash/array/flatten");
var extend = require("lodash/object/extend");
@ -141,7 +142,7 @@ Scope.prototype.checkBlockScopedCollisions = function (kind, name, id) {
if (kind === "hoisted" && local.kind === "let") return;
if (local.kind === "let" || local.kind === "const") {
throw this.file.errorWithNode(id, "Duplicate declaration " + name, TypeError);
throw this.file.errorWithNode(id, messages.get("scopeDuplicateDeclaration", name), TypeError);
}
};

View File

@ -1,3 +1,3 @@
{
"throws": "Line 2: MULTIPLIER is read-only"
"throws": "Line 2: \"MULTIPLIER\" is read-only"
}

View File

@ -1,3 +1,3 @@
{
"throws": "illegal kind for constructor method"
"throws": "Illegal kind for constructor method"
}

View File

@ -1,3 +1,3 @@
{
"throws": "a is read-only"
"throws": "\"a\" is read-only"
}

View File

@ -1,3 +1,3 @@
{
"throws": "MULTIPLIER is read-only"
"throws": "\"MULTIPLIER\" is read-only"
}

View File

@ -1,3 +1,3 @@
{
"throws": "Duplicate declaration MULTIPLIER"
"throws": "Duplicate declaration \"MULTIPLIER\""
}

View File

@ -1,3 +1,3 @@
{
"throws": "Duplicate declaration MULTIPLIER"
"throws": "Duplicate declaration \"MULTIPLIER\""
}

View File

@ -1,3 +1,3 @@
{
"throws": "Duplicate declaration MULTIPLIER"
"throws": "Duplicate declaration \"MULTIPLIER\""
}

View File

@ -1,3 +1,3 @@
{
"throws": "foo is read-only"
"throws": "\"foo\" is read-only"
}

View File

@ -1,3 +1,3 @@
{
"throws": "Unknown node type MemberExpression in ForOfStatement"
"throws": "Unknown node type \"MemberExpression\" in ForStatement"
}

View File

@ -1,3 +1,3 @@
{
"throws": "Illegal export __esModule - this is used internally for CommonJS interop"
"throws": "Illegal export \"__esModule\""
}

View File

@ -1,3 +1,3 @@
{
"throws": "Illegal export __esModule - this is used internally for CommonJS interop"
"throws": "Illegal export \"__esModule\""
}