275 lines
11 KiB
Plaintext
275 lines
11 KiB
Plaintext
"use strict";
|
|
// any is required to work around manipulating the AST in weird ways
|
|
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const utils_1 = require("@typescript-eslint/utils");
|
|
const util_1 = require("../util");
|
|
const getESLintCoreRule_1 = require("../util/getESLintCoreRule");
|
|
const baseRule = (0, getESLintCoreRule_1.getESLintCoreRule)('no-extra-parens');
|
|
exports.default = (0, util_1.createRule)({
|
|
name: 'no-extra-parens',
|
|
meta: {
|
|
deprecated: true,
|
|
replacedBy: ['@stylistic/ts/no-extra-parens'],
|
|
type: 'layout',
|
|
docs: {
|
|
description: 'Disallow unnecessary parentheses',
|
|
extendsBaseRule: true,
|
|
},
|
|
fixable: 'code',
|
|
hasSuggestions: baseRule.meta.hasSuggestions,
|
|
schema: baseRule.meta.schema,
|
|
messages: baseRule.meta.messages,
|
|
},
|
|
defaultOptions: ['all'],
|
|
create(context) {
|
|
const rules = baseRule.create(context);
|
|
function binaryExp(node) {
|
|
const rule = rules.BinaryExpression;
|
|
// makes the rule think it should skip the left or right
|
|
const isLeftTypeAssertion = (0, util_1.isTypeAssertion)(node.left);
|
|
const isRightTypeAssertion = (0, util_1.isTypeAssertion)(node.right);
|
|
if (isLeftTypeAssertion && isRightTypeAssertion) {
|
|
return; // ignore
|
|
}
|
|
if (isLeftTypeAssertion) {
|
|
return rule({
|
|
...node,
|
|
left: {
|
|
...node.left,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
if (isRightTypeAssertion) {
|
|
return rule({
|
|
...node,
|
|
right: {
|
|
...node.right,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rule(node);
|
|
}
|
|
function callExp(node) {
|
|
const rule = rules.CallExpression;
|
|
if ((0, util_1.isTypeAssertion)(node.callee)) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
return rule({
|
|
...node,
|
|
callee: {
|
|
...node.callee,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
if (node.arguments.length === 1 &&
|
|
// is there any opening parenthesis in type arguments
|
|
context.sourceCode.getTokenAfter(node.callee, util_1.isOpeningParenToken) !==
|
|
context.sourceCode.getTokenBefore(node.arguments[0], util_1.isOpeningParenToken)) {
|
|
return rule({
|
|
...node,
|
|
arguments: [
|
|
{
|
|
...node.arguments[0],
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
],
|
|
});
|
|
}
|
|
return rule(node);
|
|
}
|
|
function unaryUpdateExpression(node) {
|
|
const rule = rules.UnaryExpression;
|
|
if ((0, util_1.isTypeAssertion)(node.argument)) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
return rule({
|
|
...node,
|
|
argument: {
|
|
...node.argument,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rule(node);
|
|
}
|
|
const overrides = {
|
|
// ArrayExpression
|
|
ArrowFunctionExpression(node) {
|
|
if (!(0, util_1.isTypeAssertion)(node.body)) {
|
|
return rules.ArrowFunctionExpression(node);
|
|
}
|
|
},
|
|
// AssignmentExpression
|
|
AwaitExpression(node) {
|
|
if ((0, util_1.isTypeAssertion)(node.argument)) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
return rules.AwaitExpression({
|
|
...node,
|
|
argument: {
|
|
...node.argument,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.AwaitExpression(node);
|
|
},
|
|
BinaryExpression: binaryExp,
|
|
CallExpression: callExp,
|
|
ClassDeclaration(node) {
|
|
if (node.superClass?.type === utils_1.AST_NODE_TYPES.TSAsExpression) {
|
|
return rules.ClassDeclaration({
|
|
...node,
|
|
superClass: {
|
|
...node.superClass,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.ClassDeclaration(node);
|
|
},
|
|
ClassExpression(node) {
|
|
if (node.superClass?.type === utils_1.AST_NODE_TYPES.TSAsExpression) {
|
|
return rules.ClassExpression({
|
|
...node,
|
|
superClass: {
|
|
...node.superClass,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.ClassExpression(node);
|
|
},
|
|
ConditionalExpression(node) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
if ((0, util_1.isTypeAssertion)(node.test)) {
|
|
return rules.ConditionalExpression({
|
|
...node,
|
|
test: {
|
|
...node.test,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
if ((0, util_1.isTypeAssertion)(node.consequent)) {
|
|
return rules.ConditionalExpression({
|
|
...node,
|
|
consequent: {
|
|
...node.consequent,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
if ((0, util_1.isTypeAssertion)(node.alternate)) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
return rules.ConditionalExpression({
|
|
...node,
|
|
alternate: {
|
|
...node.alternate,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.ConditionalExpression(node);
|
|
},
|
|
ForInStatement(node) {
|
|
if ((0, util_1.isTypeAssertion)(node.right)) {
|
|
// as of 7.20.0 there's no way to skip checking the right of the ForIn
|
|
// so just don't validate it at all
|
|
return;
|
|
}
|
|
return rules.ForInStatement(node);
|
|
},
|
|
ForOfStatement(node) {
|
|
if ((0, util_1.isTypeAssertion)(node.right)) {
|
|
// makes the rule skip checking of the right
|
|
return rules.ForOfStatement({
|
|
...node,
|
|
type: utils_1.AST_NODE_TYPES.ForOfStatement,
|
|
right: {
|
|
...node.right,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.ForOfStatement(node);
|
|
},
|
|
// DoWhileStatement
|
|
ForStatement(node) {
|
|
// make the rule skip the piece by removing it entirely
|
|
if (node.init && (0, util_1.isTypeAssertion)(node.init)) {
|
|
return rules.ForStatement({
|
|
...node,
|
|
init: null,
|
|
});
|
|
}
|
|
if (node.test && (0, util_1.isTypeAssertion)(node.test)) {
|
|
return rules.ForStatement({
|
|
...node,
|
|
test: null,
|
|
});
|
|
}
|
|
if (node.update && (0, util_1.isTypeAssertion)(node.update)) {
|
|
return rules.ForStatement({
|
|
...node,
|
|
update: null,
|
|
});
|
|
}
|
|
return rules.ForStatement(node);
|
|
},
|
|
'ForStatement > *.init:exit'(node) {
|
|
if (!(0, util_1.isTypeAssertion)(node)) {
|
|
return rules['ForStatement > *.init:exit'](node);
|
|
}
|
|
},
|
|
// IfStatement
|
|
LogicalExpression: binaryExp,
|
|
MemberExpression(node) {
|
|
if ((0, util_1.isTypeAssertion)(node.object)) {
|
|
// reduces the precedence of the node so the rule thinks it needs to be wrapped
|
|
return rules.MemberExpression({
|
|
...node,
|
|
object: {
|
|
...node.object,
|
|
type: utils_1.AST_NODE_TYPES.SequenceExpression,
|
|
},
|
|
});
|
|
}
|
|
return rules.MemberExpression(node);
|
|
},
|
|
NewExpression: callExp,
|
|
// ObjectExpression
|
|
// ReturnStatement
|
|
// SequenceExpression
|
|
SpreadElement(node) {
|
|
if (!(0, util_1.isTypeAssertion)(node.argument)) {
|
|
return rules.SpreadElement(node);
|
|
}
|
|
},
|
|
SwitchCase(node) {
|
|
if (node.test && !(0, util_1.isTypeAssertion)(node.test)) {
|
|
return rules.SwitchCase(node);
|
|
}
|
|
},
|
|
// SwitchStatement
|
|
ThrowStatement(node) {
|
|
if (node.argument && !(0, util_1.isTypeAssertion)(node.argument)) {
|
|
return rules.ThrowStatement(node);
|
|
}
|
|
},
|
|
UnaryExpression: unaryUpdateExpression,
|
|
UpdateExpression: unaryUpdateExpression,
|
|
// VariableDeclarator
|
|
// WhileStatement
|
|
// WithStatement - i'm not going to even bother implementing this terrible and never used feature
|
|
YieldExpression(node) {
|
|
if (node.argument && !(0, util_1.isTypeAssertion)(node.argument)) {
|
|
return rules.YieldExpression(node);
|
|
}
|
|
},
|
|
};
|
|
return Object.assign({}, rules, overrides);
|
|
},
|
|
});
|
|
//# sourceMappingURL=no-extra-parens.js.map |