Skip to content

Commit

Permalink
Support ConditionalExpressions in dry-error-messages rule (#11917)
Browse files Browse the repository at this point in the history
* Support ConditionalExpressions in dry-error-messages rule

* tests
  • Loading branch information
existentialism committed Aug 5, 2020
1 parent 50b3262 commit c0f6f03
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 11 deletions.
Expand Up @@ -41,6 +41,25 @@ function findIdNode(node) {
return null;
}

function findIdNodes(node) {
if (node.type === "ConditionalExpression") {
const consequent = findIdNode(node.consequent);
const alternate = findIdNode(node.alternate);

if (consequent && alternate) {
return [consequent, alternate];
}
}

const idNode = findIdNode(node);

if (idNode) {
return [idNode];
}

return null;
}

function findReference(node, scope) {
let currentScope = scope;

Expand Down Expand Up @@ -128,11 +147,13 @@ export default {
node,
) {
const [, errorMsgNode] = node.arguments;
const nodeToCheck = findIdNode(errorMsgNode);
const nodesToCheck = findIdNodes(errorMsgNode);

if (
nodeToCheck &&
referencesImportedBinding(nodeToCheck, getScope(), importedBindings)
Array.isArray(nodesToCheck) &&
nodesToCheck.every(node =>
referencesImportedBinding(node, getScope(), importedBindings),
)
) {
return;
}
Expand Down
Expand Up @@ -261,6 +261,14 @@ ruleTester.run("dry-error-messages", rule, {
code: "this.raise(loc);",
options: [{ errorModule: ERRORS_MODULE }],
},

// Support ternary as second argument
{
filename: FILENAME,
code:
"import Errors, { NotErrors } from 'errorsModule'; this.raise(loc, a ? Errors.someErrorMessage : Errors.someOtherErrorMessage);",
options: [{ errorModule: ERRORS_MODULE }],
},
],
invalid: [
{
Expand Down Expand Up @@ -691,5 +699,43 @@ ruleTester.run("dry-error-messages", rule, {
},
],
},

// Should error if either part of a ternary isn't from error module
{
filename: FILENAME,
code:
"import Errors, { NotErrors } from 'errorsModule'; this.raise(loc, a ? Errors.someErrorMessage : 'hello');",
options: [{ errorModule: ERRORS_MODULE }],
errors: [
{
messageId: "mustBeImported",
data: { errorModule: ERRORS_MODULE },
},
],
},
{
filename: FILENAME,
code:
"import Errors, { NotErrors } from 'errorsModule'; this.raise(loc, a ? 'hello' : Errors.someErrorMessage);",
options: [{ errorModule: ERRORS_MODULE }],
errors: [
{
messageId: "mustBeImported",
data: { errorModule: ERRORS_MODULE },
},
],
},
{
filename: FILENAME,
code:
"import Errors, { NotErrors } from 'errorsModule'; this.raise(loc, a ? 'hello' : 'world');",
options: [{ errorModule: ERRORS_MODULE }],
errors: [
{
messageId: "mustBeImported",
data: { errorModule: ERRORS_MODULE },
},
],
},
],
});
4 changes: 0 additions & 4 deletions packages/babel-parser/src/parser/lval.js
Expand Up @@ -366,15 +366,13 @@ export default class LValParser extends NodeUtils {
? isStrictBindReservedWord(expr.name, this.inModule)
: isStrictBindOnlyReservedWord(expr.name))
) {
/* eslint-disable @babel/development-internal/dry-error-messages */
this.raise(
expr.start,
bindingType === BIND_NONE
? Errors.StrictEvalArguments
: Errors.StrictEvalArgumentsBinding,
expr.name,
);
/* eslint-enable @babel/development-internal/dry-error-messages */
}

if (checkClashes) {
Expand Down Expand Up @@ -471,15 +469,13 @@ export default class LValParser extends NodeUtils {
break;

default: {
/* eslint-disable @babel/development-internal/dry-error-messages */
this.raise(
expr.start,
bindingType === BIND_NONE
? Errors.InvalidLhs
: Errors.InvalidLhsBinding,
contextDescription,
);
/* eslint-enable @babel/development-internal/dry-error-messages */
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions packages/babel-parser/src/parser/statement.js
Expand Up @@ -2042,15 +2042,13 @@ export default class StatementParser extends ExpressionParser {
name: string,
): void {
if (this.state.exportedIdentifiers.indexOf(name) > -1) {
/* eslint-disable @babel/development-internal/dry-error-messages */
this.raise(
node.start,
name === "default"
? Errors.DuplicateDefaultExport
: Errors.DuplicateExport,
name,
);
/* eslint-enable @babel/development-internal/dry-error-messages */
}
this.state.exportedIdentifiers.push(name);
}
Expand Down
2 changes: 0 additions & 2 deletions packages/babel-parser/src/tokenizer/index.js
Expand Up @@ -420,14 +420,12 @@ export default class Tokenizer extends ParserErrors {
// misleading
this.expectPlugin("recordAndTuple");
if (this.getPluginOption("recordAndTuple", "syntaxType") !== "hash") {
/* eslint-disable @babel/development-internal/dry-error-messages */
throw this.raise(
this.state.pos,
next === charCodes.leftCurlyBrace
? Errors.RecordExpressionHashIncorrectStartSyntaxType
: Errors.TupleExpressionHashIncorrectStartSyntaxType,
);
/* eslint-enable @babel/development-internal/dry-error-messages */
}

if (next === charCodes.leftCurlyBrace) {
Expand Down

0 comments on commit c0f6f03

Please sign in to comment.