Skip to content

Commit 19c6856

Browse files
authored
feat: Add no-useless-constructor suggestion (#18799)
* feat: add fixer for `no-useless-constructor` & tests * docs: updated docs * changed to suggestion * added suggestion messageId * support automatic semi insertion * added deleted test * add failing test * altered logic * using `unIndent`
1 parent fa11b2e commit 19c6856

4 files changed

Lines changed: 108 additions & 15 deletions

File tree

docs/src/_data/rules.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,7 +1135,7 @@
11351135
"description": "Disallow unnecessary constructors",
11361136
"recommended": false,
11371137
"fixable": false,
1138-
"hasSuggestions": false
1138+
"hasSuggestions": true
11391139
},
11401140
{
11411141
"name": "no-useless-escape",
@@ -2088,4 +2088,4 @@
20882088
"replacedBy": []
20892089
}
20902090
]
2091-
}
2091+
}

docs/src/_data/rules_meta.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,7 +2023,8 @@
20232023
"description": "Disallow unnecessary constructors",
20242024
"recommended": false,
20252025
"url": "https://eslint.org/docs/latest/rules/no-useless-constructor"
2026-
}
2026+
},
2027+
"hasSuggestions": true
20272028
},
20282029
"no-useless-escape": {
20292030
"type": "suggestion",
@@ -2667,4 +2668,4 @@
26672668
},
26682669
"fixable": "code"
26692670
}
2670-
}
2671+
}

lib/rules/no-useless-constructor.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
"use strict";
66

7+
const astUtils = require("./utils/ast-utils");
8+
79
//------------------------------------------------------------------------------
810
// Helpers
911
//------------------------------------------------------------------------------
@@ -143,10 +145,13 @@ module.exports = {
143145
url: "https://eslint.org/docs/latest/rules/no-useless-constructor"
144146
},
145147

148+
hasSuggestions: true,
149+
146150
schema: [],
147151

148152
messages: {
149-
noUselessConstructor: "Useless constructor."
153+
noUselessConstructor: "Useless constructor.",
154+
removeConstructor: "Remove the constructor."
150155
}
151156
},
152157

@@ -177,7 +182,18 @@ module.exports = {
177182
if (superClass ? isRedundantSuperCall(body, ctorParams) : (body.length === 0)) {
178183
context.report({
179184
node,
180-
messageId: "noUselessConstructor"
185+
messageId: "noUselessConstructor",
186+
suggest: [
187+
{
188+
messageId: "removeConstructor",
189+
*fix(fixer) {
190+
const nextToken = context.sourceCode.getTokenAfter(node);
191+
const addSemiColon = nextToken.type === "Punctuator" && nextToken.value === "[" && astUtils.needsPrecedingSemicolon(context.sourceCode, node);
192+
193+
yield fixer.replaceText(node, addSemiColon ? ";" : "");
194+
}
195+
}
196+
]
181197
});
182198
}
183199
}

tests/lib/rules/no-useless-constructor.js

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
const rule = require("../../../lib/rules/no-useless-constructor");
1313
const RuleTester = require("../../../lib/rule-tester/rule-tester");
14+
const { unIndent } = require("../../_utils");
1415

1516
//------------------------------------------------------------------------------
1617
// Tests
@@ -47,39 +48,114 @@ ruleTester.run("no-useless-constructor", rule, {
4748
invalid: [
4849
{
4950
code: "class A { constructor(){} }",
50-
errors: [error]
51+
errors: [{
52+
...error,
53+
suggestions: [{
54+
messageId: "removeConstructor",
55+
output: "class A { }"
56+
}]
57+
}]
5158
},
5259
{
5360
code: "class A { 'constructor'(){} }",
54-
errors: [error]
61+
errors: [{
62+
...error,
63+
suggestions: [{
64+
messageId: "removeConstructor",
65+
output: "class A { }"
66+
}]
67+
}]
5568
},
5669
{
5770
code: "class A extends B { constructor() { super(); } }",
58-
errors: [error]
71+
errors: [{
72+
...error,
73+
suggestions: [{
74+
messageId: "removeConstructor",
75+
output: "class A extends B { }"
76+
}]
77+
}]
5978
},
6079
{
6180
code: "class A extends B { constructor(foo){ super(foo); } }",
62-
errors: [error]
81+
errors: [{
82+
...error,
83+
suggestions: [{
84+
messageId: "removeConstructor",
85+
output: "class A extends B { }"
86+
}]
87+
}]
6388
},
6489
{
6590
code: "class A extends B { constructor(foo, bar){ super(foo, bar); } }",
66-
errors: [error]
91+
errors: [{
92+
...error,
93+
suggestions: [{
94+
messageId: "removeConstructor",
95+
output: "class A extends B { }"
96+
}]
97+
}]
6798
},
6899
{
69100
code: "class A extends B { constructor(...args){ super(...args); } }",
70-
errors: [error]
101+
errors: [{
102+
...error,
103+
suggestions: [{
104+
messageId: "removeConstructor",
105+
output: "class A extends B { }"
106+
}]
107+
}]
71108
},
72109
{
73110
code: "class A extends B.C { constructor() { super(...arguments); } }",
74-
errors: [error]
111+
errors: [{
112+
...error,
113+
suggestions: [{
114+
messageId: "removeConstructor",
115+
output: "class A extends B.C { }"
116+
}]
117+
}]
75118
},
76119
{
77120
code: "class A extends B { constructor(a, b, ...c) { super(...arguments); } }",
78-
errors: [error]
121+
errors: [{
122+
...error,
123+
suggestions: [{
124+
messageId: "removeConstructor",
125+
output: "class A extends B { }"
126+
}]
127+
}]
79128
},
80129
{
81130
code: "class A extends B { constructor(a, b, ...c) { super(a, b, ...c); } }",
82-
errors: [error]
131+
errors: [{
132+
...error,
133+
suggestions: [{
134+
messageId: "removeConstructor",
135+
output: "class A extends B { }"
136+
}]
137+
}]
138+
},
139+
{
140+
code: unIndent`
141+
class A {
142+
foo = 'bar'
143+
constructor() { }
144+
[0]() { }
145+
}`,
146+
languageOptions: { ecmaVersion: 2022 },
147+
errors: [{
148+
...error,
149+
suggestions: [{
150+
messageId: "removeConstructor",
151+
output: unIndent`
152+
class A {
153+
foo = 'bar'
154+
;
155+
[0]() { }
156+
}`
157+
}]
158+
}]
83159
}
84160
]
85161
});

0 commit comments

Comments
 (0)