8000 feat: add suggestions for `eqeqeq` rule (#19640) · eslint/eslint@0fa2b7a · GitHub
[go: up one dir, main page]

Skip to content

Commit 0fa2b7a

Browse files
authored
feat: add suggestions for eqeqeq rule (#19640)
* feat: add suggestions for `eqeqeq` rule * test: update eqeqeq assertions * fix: report suggestion in specific cases only * chore: fix tests
1 parent dd98d63 commit 0fa2b7a

File tree

5 files changed

+346
-8
lines changed

5 files changed

+346
-8
lines changed

lib/rules/eqeqeq.js

Lines changed: 31 additions & 8 deletions
154
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const astUtils = require("./utils/ast-utils");
1919
module.exports = {
2020
meta: {
2121
type: "suggestion",
22+
hasSuggestions: true,
2223

2324
docs: {
2425
description: "Require the use of `===` and `!==`",
@@ -63,6 +64,8 @@ module.exports = {
6364
messages: {
6465
unexpected:
6566
"Expected '{{expectedOperator}}' and instead saw '{{actualOperator}}'.",
67+
replaceOperator:
68+
"Use '{{expectedOperator}}' instead of '{{actualOperator}}'.",
6669
},
6770
},
6871

@@ -138,22 +141,42 @@ module.exports = {
138141
token => token.value === node.operator,
139142
);
140143

141-
context.report({
144+
const commonReportParams = {
142145
node,
143146
loc: operatorToken.loc,
144147
messageId: "unexpected",
145148
data: { expectedOperator, actualOperator: node.operator },
146-
fix(fixer) {
147-
// If the comparison is a `typeof` comparison or both sides are literals with the same type, then it's safe to fix.
148-
if (isTypeOfBinary(node) || areLiteralsAndSameType(node)) {
149+
};
150+
151+
if (isTypeOfBinary(node) || areLiteralsAndSameType(node)) {
152+
context.report({
153+
...commonReportParams,
154+
fix(fixer) {
149155
return fixer.replaceText(
150156
operatorToken,
151157
expectedOperator,
152158
);
153-
}
-
return null;
155-
},
156-
});
159+
},
160+
});
161+
} else {
162+
context.report({
163+
...commonReportParams,
164+
suggest: [
165+
{
166+
messageId: "replaceOperator",
167+
data: {
168+
expectedOperator,
169+
actualOperator: node.operator,
170+
},
171+
fix: fixer =>
172+
fixer.replaceText(
173+
operatorToken,
174+
expectedOperator,
175+
),
176+
},
177+
],
178+
});
179+
}
157180
}
158181

159182
return {

tests/lib/cli-engine/cli-engine.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,6 +2103,20 @@ describe("CLIEngine", () => {
21032103
nodeType: "BinaryExpression",
21042104
ruleId: "eqeqeq",
21052105
severity: 2,
2106+
suggestions: [
2107+
{
2108+
data: {
2109+
actualOperator: "==",
2110+
expectedOperator: "===",
2111+
} 1E0A ,
2112+
desc: "Use '===' instead of '=='.",
2113+
fix: {
2114+
range: [24, 26],
2115+
text: "===",
2116+
},
2117+
messageId: "replaceOperator",
2118+
},
2119+
],
21062120
},
21072121
],
21082122
suppressedMessages: [],
@@ -7814,6 +7828,20 @@ describe("CLIEngine", () => {
78147828
messageId: "unexpected",
78157829
nodeType: "BinaryExpression",
78167830
ruleId: "eqeqeq",
7831+
suggestions: [
7832+
{
7833+
data: {
7834+
actualOperator: "==",
7835+
expectedOperator: "===",
7836+
},
7837+
desc: "Use '===' instead of '=='.",
7838+
fix: {
7839+
range: [2, 4],
7840+
text: "===",
7841+
},
7842+
messageId: "replaceOperator",
7843+
},
7844+
],
78177845
severity: 2,
78187846
},
78197847
],
@@ -7934,6 +7962,20 @@ describe("CLIEngine", () => {
79347962
nodeType: "BinaryExpression",
79357963
ruleId: "eqeqeq",
79367964
severity: 2,
7965+
suggestions: [
7966+
{
7967+
data: {
7968+
actualOperator: "==",
7969+
expectedOperator: "===",
7970+
},
7971+
desc: "Use '===' instead of '=='.",
7972+
fix: {
7973+
range: [2, 4],
7974+
text: "===",
7975+
},
7976+
messageId: "replaceOperator",
7977+
},
7978+
],
79377979
},
79387980
],
79397981
suppressedMessages: [],

tests/lib/eslint/eslint.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4437,6 +4437,20 @@ describe("ESLint", () => {
44374437
nodeType: "BinaryExpression",
44384438
ruleId: "eqeqeq",
44394439
severity: 2,
4440+
suggestions: [
4441+
{
4442+
data: {
4443+
actualOperator: "==",
4444+
expectedOperator: "===",
4445+
},
4446+
desc: "Use '===' instead of '=='.",
4447+
fix: {
4448+
range: [24, 26],
4449+
text: "===",
4450+
},
4451+
messageId: "replaceOperator",
4452+
},
4453+
],
44404454
},
44414455
],
44424456
suppressedMessages: [],
@@ -11350,6 +11364,20 @@ describe("ESLint", () => {
1135011364
nodeType: "BinaryExpression",
1135111365
ruleId: "eqeqeq",
1135211366
severity: 2,
11367+
suggestions: [
11368+
{
11369+
data: {
11370+
actualOperator: "==",
11371+
expectedOperator: "===",
11372+
},
11373+
desc: "Use '===' instead of '=='.",
11374+
fix: {
11375+
range: [2, 4],
11376+
text: "===",
11377+
},
11378+
messageId: "replaceOperator",
11379+
},
11380+
],
1135311381
},
1135411382
],
1135511383
source: "a == b",
@@ -11481,6 +11509,20 @@ describe("ESLint", () => {
1148111509
nodeType: "BinaryExpression",
1148211510
ruleId: "eqeqeq",
1148311511
severity: 2,
11512+
suggestions: [
11513+
{
11514+
data: {
11515+
actualOperator: "==",
11516+
expectedOperator: "===",
11517+
},
11518+
desc: "Use '===' instead of '=='.",
11519+
fix: {
11520+
range: [2, 4],
11521+
text: "===",
11522+
},
11523+
messageId: "replaceOperator",
11524+
},
11525+
],
1148411526
},
1148511527
],
1148611528
source: "a == b",

tests/lib/eslint/legacy-eslint.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2262,6 +2262,20 @@ describe("LegacyESLint", () => {
22622262
nodeType: "BinaryExpression",
22632263
ruleId: "eqeqeq",
22642264
severity: 2,
2265+
suggestions: [
2266+
{
2267+
data: {
2268+
actualOperator: "==",
2269+
expectedOperator: "===",
2270+
},
2271+
desc: "Use '===' instead of '=='.",
2272+
fix: {
2273+
range: [24, 26],
2274+
text: "===",
2275+
},
2276+
messageId: "replaceOperator",
2277+
},
2278+
],
22652279
},
22662280
],
22672281
suppressedMessages: [],
@@ -8759,6 +8773,20 @@ describe("LegacyESLint", () => {
87598773
nodeType: "BinaryExpression",
87608774
ruleId: "eqeqeq",
87618775
severity: 2,
8776+
suggestions: [
8777+
{
8778+
data: {
8779+
actualOperator: "==",
8780+
expectedOperator: "===",
8781+
},
8782+
desc: "Use '===' instead of '=='.",
8783+
fix: {
8784+
range: [2, 4],
8785+
text: "===",
8786+
},
8787+
messageId: "replaceOperator",
8788+
},
8789+
],
87628790
},
87638791
],
87648792
suppressedMessages: [],
@@ -8881,6 +8909,20 @@ describe("LegacyESLint", () => {
88818909
nodeType: "BinaryExpression",
88828910
ruleId: "eqeqeq",
88838911
severity: 2,
8912+
suggestions: [
8913+
{
8914+
data: {
8915+
actualOperator: "==",
8916+
expectedOperator: "===",
8917+
},
8918+
desc: "Use '===' instead of '=='.",
8919+
fix: {
8920+
range: [2, 4],
8921+
text: "===",
8922+
},
8923+
messageId: "replaceOperator",
8924+
},
8925+
],
88848926
},
88858927
],
88868928
suppressedMessages: [],

0 commit comments

Comments
 (0)
0