Skip to content

Commit b585030

Browse files
committed
allow the props name pattern only when the handler is "this.props.* or "props.*"
1 parent b707b0a commit b585030

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

crates/oxc_linter/src/rules/react/jsx_handler_names.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ impl Rule for JsxHandlerNames {
282282
return;
283283
}
284284
if let Some((name, span, is_props_handler)) =
285-
get_event_handler_name_from_arrow_function(arrow_function, ctx)
285+
get_event_handler_name_from_arrow_function(arrow_function)
286286
{
287287
(Some(name), span, is_props_handler)
288288
} else {
@@ -297,7 +297,7 @@ impl Rule for JsxHandlerNames {
297297
}
298298
JSXExpression::StaticMemberExpression(member_expr) => {
299299
let (name, span, is_props_handler) =
300-
get_event_handler_name_from_static_member_expression(member_expr, ctx);
300+
get_event_handler_name_from_static_member_expression(member_expr);
301301
(Some(name), span, is_props_handler)
302302
}
303303
_ => {
@@ -377,22 +377,23 @@ fn is_member_expression_callee(arrow_function: &ArrowFunctionExpression<'_>) ->
377377

378378
fn get_event_handler_name_from_static_member_expression(
379379
member_expr: &StaticMemberExpression,
380-
ctx: &LintContext,
381380
) -> (CompactStr, Span, bool) {
382381
let name = member_expr.property.name.as_str();
383382
let span = member_expr.property.span;
384383
match &member_expr.object {
385-
Expression::ThisExpression(_) => (name.into(), span, false),
386384
Expression::Identifier(ident) => {
387385
let obj_name = ident.name.as_str();
388-
(name.into(), span, obj_name == "props")
386+
(name.into(), span, obj_name == "props") // props.handleChange or obj.handleChange
389387
}
390388
Expression::StaticMemberExpression(expr) => {
391-
let (obj_name, _obj_span, is_props) =
392-
get_event_handler_name_from_static_member_expression(expr, ctx);
393-
(name.into(), span, !is_props && obj_name == "props")
389+
if let Expression::ThisExpression(_) = &expr.object {
390+
let obj_name = expr.property.name.as_str();
391+
(name.into(), span, obj_name == "props") // this.props.handleChange or this.obj.handleChange
392+
} else {
393+
(name.into(), span, false) // foo.props.handleChange, props.foo.handleChange, foo.bar.handleChange, etc.
394+
}
394395
}
395-
_ => (ctx.source_range(member_expr.span).into(), member_expr.span, false),
396+
_ => (name.into(), span, false), // this.handleChange
396397
}
397398
}
398399

@@ -453,7 +454,6 @@ fn test_normalize_handler_name() {
453454

454455
fn get_event_handler_name_from_arrow_function<'a>(
455456
arrow_function: &'a ArrowFunctionExpression<'a>,
456-
ctx: &LintContext<'a>,
457457
) -> Option<(CompactStr, Span, bool)> {
458458
if !arrow_function.expression {
459459
// Ignore arrow functions with block bodies like `() => { this.handleChange() }`.
@@ -471,7 +471,7 @@ fn get_event_handler_name_from_arrow_function<'a>(
471471
match &call_expr.callee {
472472
Expression::Identifier(ident) => Some((ident.name.as_str().into(), ident.span, false)),
473473
Expression::StaticMemberExpression(member_expr) => {
474-
Some(get_event_handler_name_from_static_member_expression(member_expr, ctx))
474+
Some(get_event_handler_name_from_static_member_expression(member_expr))
475475
}
476476
_ => None,
477477
}
@@ -622,6 +622,8 @@ fn test() {
622622
("<TestComponent onChange={this.handl3Change} />", None),
623623
("<TestComponent onChange={this.handle4change} />", None),
624624
("<TestComponent onChange={this.props.doSomethingOnChange} />", None),
625+
("<TestComponent onChange={this.props.obj.onChange} />", None),
626+
("<TestComponent onChange={props.obj.onChange} />", None),
625627
(
626628
"<TestComponent onChange={takeCareOfChange} />",
627629
Some(serde_json::json!([{ "checkLocalVariables": true }])),

crates/oxc_linter/src/snapshots/react_jsx_handler_names.snap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ source: crates/oxc_linter/src/tester.rs
5050
╰────
5151
help: Handler function for onChange prop key must be a camelCase name beginning with 'handle' only
5252

53+
⚠ eslint-plugin-react(jsx-handler-names): Invalid handler name: onChange
54+
╭─[jsx_handler_names.tsx:1:41]
55+
1 │ <TestComponent onChange={this.props.obj.onChange} />
56+
· ────────
57+
╰────
58+
help: Handler function for onChange prop key must be a camelCase name beginning with 'handle' only
59+
60+
⚠ eslint-plugin-react(jsx-handler-names): Invalid handler name: onChange
61+
╭─[jsx_handler_names.tsx:1:36]
62+
1 │ <TestComponent onChange={props.obj.onChange} />
63+
· ────────
64+
╰────
65+
help: Handler function for onChange prop key must be a camelCase name beginning with 'handle' only
66+
5367
⚠ eslint-plugin-react(jsx-handler-names): Invalid handler name: takeCareOfChange
5468
╭─[jsx_handler_names.tsx:1:26]
5569
1 │ <TestComponent onChange={takeCareOfChange} />

0 commit comments

Comments
 (0)