Skip to content

Commit 4af3a1a

Browse files
committed
allow the props name pattern for the event handler name only when the direct parent's name is "props"
1 parent b707b0a commit 4af3a1a

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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, ctx, 0);
301301
(Some(name), span, is_props_handler)
302302
}
303303
_ => {
@@ -378,19 +378,24 @@ fn is_member_expression_callee(arrow_function: &ArrowFunctionExpression<'_>) ->
378378
fn get_event_handler_name_from_static_member_expression(
379379
member_expr: &StaticMemberExpression,
380380
ctx: &LintContext,
381+
depth: usize,
381382
) -> (CompactStr, Span, bool) {
382383
let name = member_expr.property.name.as_str();
383384
let span = member_expr.property.span;
384385
match &member_expr.object {
385-
Expression::ThisExpression(_) => (name.into(), span, false),
386+
Expression::ThisExpression(_) => {
387+
let is_props_property = depth == 1 && name == "props"; // this.props.*
388+
(name.into(), span, is_props_property)
389+
}
386390
Expression::Identifier(ident) => {
387391
let obj_name = ident.name.as_str();
388-
(name.into(), span, obj_name == "props")
392+
let is_props_property = depth == 0 && obj_name == "props"; // props.*
393+
(name.into(), span, is_props_property)
389394
}
390395
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")
396+
let (_, _, is_props_property) =
397+
get_event_handler_name_from_static_member_expression(expr, ctx, depth + 1);
398+
(name.into(), span, is_props_property)
394399
}
395400
_ => (ctx.source_range(member_expr.span).into(), member_expr.span, false),
396401
}
@@ -471,7 +476,7 @@ fn get_event_handler_name_from_arrow_function<'a>(
471476
match &call_expr.callee {
472477
Expression::Identifier(ident) => Some((ident.name.as_str().into(), ident.span, false)),
473478
Expression::StaticMemberExpression(member_expr) => {
474-
Some(get_event_handler_name_from_static_member_expression(member_expr, ctx))
479+
Some(get_event_handler_name_from_static_member_expression(member_expr, ctx, 0))
475480
}
476481
_ => None,
477482
}
@@ -622,6 +627,8 @@ fn test() {
622627
("<TestComponent onChange={this.handl3Change} />", None),
623628
("<TestComponent onChange={this.handle4change} />", None),
624629
("<TestComponent onChange={this.props.doSomethingOnChange} />", None),
630+
("<TestComponent onChange={this.props.obj.onChange} />", None),
631+
("<TestComponent onChange={props.obj.onChange} />", None),
625632
(
626633
"<TestComponent onChange={takeCareOfChange} />",
627634
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)