Skip to content

Commit 952da85

Browse files
authored
Merge pull request jsx-eslint#1411 from jackyho112/make-no-unused-state-rule-handle-arrow-function-class-method
[no-unused-state] Add ability to handle arrow function class method
2 parents 773e0fe + e616d7f commit 952da85

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

lib/rules/no-unused-state.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,27 @@ module.exports = {
237237
) {
238238
addStateFields(node.value);
239239
}
240+
241+
if (
242+
!node.static &&
243+
node.value &&
244+
node.value.type === 'ArrowFunctionExpression'
245+
) {
246+
// Create a new set for this.state aliases local to this method.
247+
classInfo.aliases = new Set();
248+
}
249+
},
250+
251+
'ClassProperty:exit'(node) {
252+
if (
253+
classInfo &&
254+
!node.static &&
255+
node.value &&
256+
node.value.type === 'ArrowFunctionExpression'
257+
) {
258+
// Forget our set of local aliases.
259+
classInfo.aliases = null;
260+
}
240261
},
241262

242263
MethodDefinition() {

tests/lib/rules/no-unused-state.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,22 @@ eslintTester.run('no-unused-state', rule, {
387387
return <SomeComponent foo={foo} />;
388388
}
389389
}`,
390+
`class NonRenderClassMethodFalseNegativeTest extends React.Component {
391+
constructor() {
392+
this.state = { foo: 0, bar: 0 };
393+
}
394+
doSomething() {
395+
const { foo } = this.state;
396+
return this.state.foo;
397+
}
398+
doSomethingElse() {
399+
const { state: { bar }} = this;
400+
return bar;
401+
}
402+
render() {
403+
return <SomeComponent />;
404+
}
405+
}`,
390406
{
391407
code: `class TypeCastExpressionSpreadFalseNegativeTest extends React.Component {
392408
constructor() {
@@ -397,6 +413,72 @@ eslintTester.run('no-unused-state', rule, {
397413
}
398414
}`,
399415
parser: 'babel-eslint'
416+
},
417+
{
418+
code: `class ArrowFunctionClassMethodDestructuringFalseNegativeTest extends React.Component {
419+
constructor() {
420+
this.state = { foo: 0 };
421+
}
422+
423+
doSomething = () => {
424+
const { state: { foo } } = this;
425+
426+
return foo;
427+
}
428+
429+
render() {
430+
return <SomeComponent />;
431+
}
432+
}`,
433+
parser: 'babel-eslint'
434+
},
435+
{
436+
code: `class ArrowFunctionClassMethodWithClassPropertyTransformFalseNegativeTest extends React.Component {
437+
state = { foo: 0 };
438+
439+
doSomething = () => {
440+
const { state:{ foo } } = this;
441+
442+
return foo;
443+
}
444+
445+
render() {
446+
return <SomeComponent />;
447+
}
448+
}`,
449+
parser: 'babel-eslint'
450+
},
451+
{
452+
code: `class ArrowFunctionClassMethodDeepDestructuringFalseNegativeTest extends React.Component {
453+
state = { foo: { bar: 0 } };
454+
455+
doSomething = () => {
456+
const { state: { foo: { bar }}} = this;
457+
458+
return bar;
459+
}
460+
461+
render() {
462+
return <SomeComponent />;
463+
}
464+
}`,
465+
parser: 'babel-eslint'
466+
},
467+
{
468+
code: `class ArrowFunctionClassMethodDestructuringAssignmentFalseNegativeTest extends React.Component {
469+
state = { foo: 0 };
470+
471+
doSomething = () => {
472+
const { state: { foo: bar }} = this;
473+
474+
return bar;
475+
}
476+
477+
render() {
478+
return <SomeComponent />;
479+
}
480+
}`,
481+
parser: 'babel-eslint'
400482
}
401483
],
402484

@@ -642,6 +724,21 @@ eslintTester.run('no-unused-state', rule, {
642724
}`,
643725
errors: getErrorMessages(['foo'])
644726
},
727+
{
728+
code: `class UnusedStateArrowFunctionMethodTest extends React.Component {
729+
constructor() {
730+
this.state = { foo: 0 };
731+
}
732+
doSomething = () => {
733+
return null;
734+
}
735+
render() {
736+
return <SomeComponent />;
737+
}
738+
}`,
739+
errors: getErrorMessages(['foo']),
740+
parser: 'babel-eslint'
741+
},
645742
{
646743
code: `class TypeCastExpressionTest extends React.Component {
647744
constructor() {

0 commit comments

Comments
 (0)