You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.9 KiB
95 lines
2.9 KiB
/** |
|
* @fileoverview Rule to disallow a negated condition |
|
* @author Alberto Rodríguez |
|
*/ |
|
"use strict"; |
|
|
|
//------------------------------------------------------------------------------ |
|
// Rule Definition |
|
//------------------------------------------------------------------------------ |
|
|
|
/** @type {import('../shared/types').Rule} */ |
|
module.exports = { |
|
meta: { |
|
type: "suggestion", |
|
|
|
docs: { |
|
description: "Disallow negated conditions", |
|
recommended: false, |
|
url: "https://eslint.org/docs/rules/no-negated-condition" |
|
}, |
|
|
|
schema: [], |
|
|
|
messages: { |
|
unexpectedNegated: "Unexpected negated condition." |
|
} |
|
}, |
|
|
|
create(context) { |
|
|
|
/** |
|
* Determines if a given node is an if-else without a condition on the else |
|
* @param {ASTNode} node The node to check. |
|
* @returns {boolean} True if the node has an else without an if. |
|
* @private |
|
*/ |
|
function hasElseWithoutCondition(node) { |
|
return node.alternate && node.alternate.type !== "IfStatement"; |
|
} |
|
|
|
/** |
|
* Determines if a given node is a negated unary expression |
|
* @param {Object} test The test object to check. |
|
* @returns {boolean} True if the node is a negated unary expression. |
|
* @private |
|
*/ |
|
function isNegatedUnaryExpression(test) { |
|
return test.type === "UnaryExpression" && test.operator === "!"; |
|
} |
|
|
|
/** |
|
* Determines if a given node is a negated binary expression |
|
* @param {Test} test The test to check. |
|
* @returns {boolean} True if the node is a negated binary expression. |
|
* @private |
|
*/ |
|
function isNegatedBinaryExpression(test) { |
|
return test.type === "BinaryExpression" && |
|
(test.operator === "!=" || test.operator === "!=="); |
|
} |
|
|
|
/** |
|
* Determines if a given node has a negated if expression |
|
* @param {ASTNode} node The node to check. |
|
* @returns {boolean} True if the node has a negated if expression. |
|
* @private |
|
*/ |
|
function isNegatedIf(node) { |
|
return isNegatedUnaryExpression(node.test) || isNegatedBinaryExpression(node.test); |
|
} |
|
|
|
return { |
|
IfStatement(node) { |
|
if (!hasElseWithoutCondition(node)) { |
|
return; |
|
} |
|
|
|
if (isNegatedIf(node)) { |
|
context.report({ |
|
node, |
|
messageId: "unexpectedNegated" |
|
}); |
|
} |
|
}, |
|
ConditionalExpression(node) { |
|
if (isNegatedIf(node)) { |
|
context.report({ |
|
node, |
|
messageId: "unexpectedNegated" |
|
}); |
|
} |
|
} |
|
}; |
|
} |
|
};
|
|
|