Skip to content

Commit 421a99c

Browse files
fix(linter): add help guidance to eslint diagnostic messages (#19562)
Partially addresses #19121 Add `.with_help()` to 4 ESLint rule diagnostics to help developers understand how to resolve warnings: - `no-undef`: "Either define '{name}' or remove the reference to it. If '{name}' is a global variable, add it to the 'globals' configuration." - `no-setter-return`: "Remove the return statement or ensure it does not return a value." - `no-unreachable`: "Remove the unreachable code or fix the control flow to make it reachable." --------- Co-authored-by: Cameron <cameron.clark@hey.com>
1 parent e81364a commit 421a99c

8 files changed

+108
-3
lines changed

apps/oxlint/src/snapshots/_-W no-undef -c fixtures__eslintrc_env__eslintrc_no_env.json fixtures__eslintrc_env__test.js@oxlint.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ working directory:
1111
1 | console.log('')
1212
: ^^^^^^^
1313
`----
14+
help: Either define 'console' or remove the reference to it. If 'console' is a global variable, add it to the 'globals' configuration.
1415
1516
Found 1 warning and 0 errors.
1617
Finished in <variable>ms on 1 file with 94 rules using 1 threads.

apps/oxlint/src/snapshots/_-W no-undef -c fixtures__no_undef__eslintrc.json fixtures__no_undef__test.js@oxlint.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ working directory:
1111
1 | console.log(foo)
1212
: ^^^^^^^
1313
`----
14+
help: Either define 'console' or remove the reference to it. If 'console' is a global variable, add it to the 'globals' configuration.
1415
1516
Found 1 warning and 0 errors.
1617
Finished in <variable>ms on 1 file with 94 rules using 1 threads.

crates/oxc_linter/src/rules/eslint/no_setter_return.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ use oxc_span::Span;
66
use crate::{AstNode, context::LintContext, rule::Rule};
77

88
fn no_setter_return_diagnostic(span: Span) -> OxcDiagnostic {
9-
OxcDiagnostic::warn("Setter cannot return a value").with_label(span)
9+
OxcDiagnostic::warn("Setter cannot return a value")
10+
.with_help("Remove the return statement or ensure it does not return a value.")
11+
.with_label(span)
1012
}
1113

1214
#[derive(Debug, Default, Clone)]

crates/oxc_linter/src/rules/eslint/no_undef.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ use crate::{
1313
};
1414

1515
fn no_undef_diagnostic(name: &str, span: Span) -> OxcDiagnostic {
16-
OxcDiagnostic::warn(format!("'{name}' is not defined.")).with_label(span)
16+
OxcDiagnostic::warn(format!("'{name}' is not defined."))
17+
.with_help(format!(
18+
"Either define '{name}' or remove the reference to it. If '{name}' is a global variable, add it to the 'globals' configuration."
19+
))
20+
.with_label(span)
1721
}
1822

1923
#[derive(Debug, Default, Clone, JsonSchema, Deserialize)]

crates/oxc_linter/src/rules/eslint/no_unreachable.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ use oxc_span::{GetSpan, Span};
1414
use crate::{context::LintContext, rule::Rule};
1515

1616
fn no_unreachable_diagnostic(span: Span) -> OxcDiagnostic {
17-
OxcDiagnostic::warn("Unreachable code.").with_label(span)
17+
OxcDiagnostic::warn("Unreachable code.")
18+
.with_help("Remove the unreachable code or fix the control flow to make it reachable.")
19+
.with_label(span)
1820
}
1921

2022
/// <https://github.com/eslint/eslint/blob/069aa680c78b8516b9a1b568519f1d01e74fb2a2/lib/rules/no-unreachable.js#L196>

crates/oxc_linter/src/snapshots/eslint_no_setter_return.snap

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,249 +7,291 @@ source: crates/oxc_linter/src/tester.rs
77
1 │ ({ set a(val){ return val + 1; } })
88
· ───────────────
99
╰────
10+
help: Remove the return statement or ensure it does not return a value.
1011

1112
eslint(no-setter-return): Setter cannot return a value
1213
╭─[no_setter_return.js:1:17]
1314
1 │ ({ set a(val) { return 1; } })
1415
· ─────────
1516
╰────
17+
help: Remove the return statement or ensure it does not return a value.
1618

1719
eslint(no-setter-return): Setter cannot return a value
1820
╭─[no_setter_return.js:1:24]
1921
1class A { set a(val) { return 1; } }
2022
· ─────────
2123
╰────
24+
help: Remove the return statement or ensure it does not return a value.
2225

2326
eslint(no-setter-return): Setter cannot return a value
2427
╭─[no_setter_return.js:1:31]
2528
1class A { static set a(val) { return 1; } }
2629
· ─────────
2730
╰────
31+
help: Remove the return statement or ensure it does not return a value.
2832

2933
eslint(no-setter-return): Setter cannot return a value
3034
╭─[no_setter_return.js:1:23]
3135
1 │ (class { set a(val) { return 1; } })
3236
· ─────────
3337
╰────
38+
help: Remove the return statement or ensure it does not return a value.
3439

3540
eslint(no-setter-return): Setter cannot return a value
3641
╭─[no_setter_return.js:1:17]
3742
1 │ ({ set a(val) { return val; } })
3843
· ───────────
3944
╰────
45+
help: Remove the return statement or ensure it does not return a value.
4046

4147
eslint(no-setter-return): Setter cannot return a value
4248
╭─[no_setter_return.js:1:24]
4349
1class A { set a(val) { return undefined; } }
4450
· ─────────────────
4551
╰────
52+
help: Remove the return statement or ensure it does not return a value.
4653

4754
eslint(no-setter-return): Setter cannot return a value
4855
╭─[no_setter_return.js:1:23]
4956
1 │ (class { set a(val) { return null; } })
5057
· ────────────
5158
╰────
59+
help: Remove the return statement or ensure it does not return a value.
5260

5361
eslint(no-setter-return): Setter cannot return a value
5462
╭─[no_setter_return.js:1:17]
5563
1 │ ({ set a(val) { return x + y; } })
5664
· ─────────────
5765
╰────
66+
help: Remove the return statement or ensure it does not return a value.
5867

5968
eslint(no-setter-return): Setter cannot return a value
6069
╭─[no_setter_return.js:1:24]
6170
1class A { set a(val) { return foo(); } }
6271
· ─────────────
6372
╰────
73+
help: Remove the return statement or ensure it does not return a value.
6474

6575
eslint(no-setter-return): Setter cannot return a value
6676
╭─[no_setter_return.js:1:23]
6777
1 │ (class { set a(val) { return this._a; } })
6878
· ───────────────
6979
╰────
80+
help: Remove the return statement or ensure it does not return a value.
7081

7182
eslint(no-setter-return): Setter cannot return a value
7283
╭─[no_setter_return.js:1:17]
7384
1 │ ({ set a(val) { return this.a; } })
7485
· ──────────────
7586
╰────
87+
help: Remove the return statement or ensure it does not return a value.
7688

7789
eslint(no-setter-return): Setter cannot return a value
7890
╭─[no_setter_return.js:1:28]
7991
1 │ ({ set a(val) { if (foo) { return 1; }; } })
8092
· ─────────
8193
╰────
94+
help: Remove the return statement or ensure it does not return a value.
8295

8396
eslint(no-setter-return): Setter cannot return a value
8497
╭─[no_setter_return.js:1:30]
8598
1class A { set a(val) { try { return 1; } catch(e) {} } }
8699
· ─────────
87100
╰────
101+
help: Remove the return statement or ensure it does not return a value.
88102

89103
eslint(no-setter-return): Setter cannot return a value
90104
╭─[no_setter_return.js:1:57]
91105
1 │ (class { set a(val) { while (foo){ if (bar) break; else return 1; } } })
92106
· ─────────
93107
╰────
108+
help: Remove the return statement or ensure it does not return a value.
94109

95110
eslint(no-setter-return): Setter cannot return a value
96111
╭─[no_setter_return.js:1:17]
97112
1 │ ({ set a(val) { return 1; }, set b(val) { return 1; } })
98113
· ─────────
99114
╰────
115+
help: Remove the return statement or ensure it does not return a value.
100116

101117
eslint(no-setter-return): Setter cannot return a value
102118
╭─[no_setter_return.js:1:43]
103119
1 │ ({ set a(val) { return 1; }, set b(val) { return 1; } })
104120
· ─────────
105121
╰────
122+
help: Remove the return statement or ensure it does not return a value.
106123

107124
eslint(no-setter-return): Setter cannot return a value
108125
╭─[no_setter_return.js:1:24]
109126
1class A { set a(val) { return 1; } set b(val) { return 1; } }
110127
· ─────────
111128
╰────
129+
help: Remove the return statement or ensure it does not return a value.
112130

113131
eslint(no-setter-return): Setter cannot return a value
114132
╭─[no_setter_return.js:1:49]
115133
1class A { set a(val) { return 1; } set b(val) { return 1; } }
116134
· ─────────
117135
╰────
136+
help: Remove the return statement or ensure it does not return a value.
118137

119138
eslint(no-setter-return): Setter cannot return a value
120139
╭─[no_setter_return.js:1:23]
121140
1 │ (class { set a(val) { return 1; } static set b(val) { return 1; } })
122141
· ─────────
123142
╰────
143+
help: Remove the return statement or ensure it does not return a value.
124144

125145
eslint(no-setter-return): Setter cannot return a value
126146
╭─[no_setter_return.js:1:55]
127147
1 │ (class { set a(val) { return 1; } static set b(val) { return 1; } })
128148
· ─────────
129149
╰────
150+
help: Remove the return statement or ensure it does not return a value.
130151

131152
eslint(no-setter-return): Setter cannot return a value
132153
╭─[no_setter_return.js:1:27]
133154
1 │ ({ set a(val) { if(val) { return 1; } else { return 2 }; } })
134155
· ─────────
135156
╰────
157+
help: Remove the return statement or ensure it does not return a value.
136158

137159
eslint(no-setter-return): Setter cannot return a value
138160
╭─[no_setter_return.js:1:46]
139161
1 │ ({ set a(val) { if(val) { return 1; } else { return 2 }; } })
140162
· ────────
141163
╰────
164+
help: Remove the return statement or ensure it does not return a value.
142165

143166
eslint(no-setter-return): Setter cannot return a value
144167
╭─[no_setter_return.js:1:46]
145168
1class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
146169
· ─────────
147170
╰────
171+
help: Remove the return statement or ensure it does not return a value.
148172

149173
eslint(no-setter-return): Setter cannot return a value
150174
╭─[no_setter_return.js:1:64]
151175
1class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
152176
· ─────────
153177
╰────
178+
help: Remove the return statement or ensure it does not return a value.
154179

155180
eslint(no-setter-return): Setter cannot return a value
156181
╭─[no_setter_return.js:1:83]
157182
1class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
158183
· ────────
159184
╰────
185+
help: Remove the return statement or ensure it does not return a value.
160186

161187
eslint(no-setter-return): Setter cannot return a value
162188
╭─[no_setter_return.js:1:62]
163189
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return val; } return false; } })
164190
· ───────────
165191
╰────
192+
help: Remove the return statement or ensure it does not return a value.
166193

167194
eslint(no-setter-return): Setter cannot return a value
168195
╭─[no_setter_return.js:1:76]
169196
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return val; } return false; } })
170197
· ─────────────
171198
╰────
199+
help: Remove the return statement or ensure it does not return a value.
172200

173201
eslint(no-setter-return): Setter cannot return a value
174202
╭─[no_setter_return.js:1:27]
175203
1 │ ({ set a(val) { if(val) { return 1; } else { return; }; } })
176204
· ─────────
177205
╰────
206+
help: Remove the return statement or ensure it does not return a value.
178207

179208
eslint(no-setter-return): Setter cannot return a value
180209
╭─[no_setter_return.js:1:46]
181210
1class A { set a(val) { switch(val) { case 1: return x; case 2: return; default: return z } } }
182211
· ─────────
183212
╰────
213+
help: Remove the return statement or ensure it does not return a value.
184214

185215
eslint(no-setter-return): Setter cannot return a value
186216
╭─[no_setter_return.js:1:81]
187217
1class A { set a(val) { switch(val) { case 1: return x; case 2: return; default: return z } } }
188218
· ────────
189219
╰────
220+
help: Remove the return statement or ensure it does not return a value.
190221

191222
eslint(no-setter-return): Setter cannot return a value
192223
╭─[no_setter_return.js:1:72]
193224
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return; } return false; } })
194225
· ─────────────
195226
╰────
227+
help: Remove the return statement or ensure it does not return a value.
196228

197229
eslint(no-setter-return): Setter cannot return a value
198230
╭─[no_setter_return.js:1:32]
199231
1 │ ({ set a(val) { function b(){} return b(); } })
200232
· ───────────
201233
╰────
234+
help: Remove the return statement or ensure it does not return a value.
202235

203236
eslint(no-setter-return): Setter cannot return a value
204237
╭─[no_setter_return.js:1:24]
205238
1class A { set a(val) { return () => {}; } }
206239
· ────────────────
207240
╰────
241+
help: Remove the return statement or ensure it does not return a value.
208242

209243
eslint(no-setter-return): Setter cannot return a value
210244
╭─[no_setter_return.js:1:49]
211245
1 │ (class { set a(val) { function b(){ return 1; } return 2; } })
212246
· ─────────
213247
╰────
248+
help: Remove the return statement or ensure it does not return a value.
214249

215250
eslint(no-setter-return): Setter cannot return a value
216251
╭─[no_setter_return.js:1:41]
217252
1 │ ({ set a(val) { function b(){ return; } return 1; } })
218253
· ─────────
219254
╰────
255+
help: Remove the return statement or ensure it does not return a value.
220256

221257
eslint(no-setter-return): Setter cannot return a value
222258
╭─[no_setter_return.js:1:58]
223259
1class A { set a(val) { var x = function() { return 1; }; return 2; } }
224260
· ─────────
225261
╰────
262+
help: Remove the return statement or ensure it does not return a value.
226263

227264
eslint(no-setter-return): Setter cannot return a value
228265
╭─[no_setter_return.js:1:50]
229266
1 │ (class { set a(val) { var x = () => { return; }; return 2; } })
230267
· ─────────
231268
╰────
269+
help: Remove the return statement or ensure it does not return a value.
232270

233271
eslint(no-setter-return): Setter cannot return a value
234272
╭─[no_setter_return.js:1:33]
235273
1function f(){}; ({ set a(val) { return 1; } });
236274
· ─────────
237275
╰────
276+
help: Remove the return statement or ensure it does not return a value.
238277

239278
eslint(no-setter-return): Setter cannot return a value
240279
╭─[no_setter_return.js:1:44]
241280
1x = function f(){}; class A { set a(val) { return 1; } };
242281
· ─────────
243282
╰────
283+
help: Remove the return statement or ensure it does not return a value.
244284

245285
eslint(no-setter-return): Setter cannot return a value
246286
╭─[no_setter_return.js:1:40]
247287
1x = () => {}; A = class { set a(val) { return 1; } };
248288
· ─────────
249289
╰────
290+
help: Remove the return statement or ensure it does not return a value.
250291

251292
eslint(no-setter-return): Setter cannot return a value
252293
╭─[no_setter_return.js:1:25]
253294
1return; ({ set a(val) { return 1; } }); return 2;
254295
· ─────────
255296
╰────
297+
help: Remove the return statement or ensure it does not return a value.

0 commit comments

Comments
 (0)