Skip to content

Commit 292bbbb

Browse files
committed
fixup! [New] Symmetric useState hook variable names
1 parent a5b1f2b commit 292bbbb

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

lib/rules/hook-use-state.js

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ module.exports = {
5454
? useStateReactImportSpecifier.local.name
5555
: undefined;
5656

57-
const isReactUseStateCall = (
57+
const isPotentialReactUseStateCall = (
5858
defaultReactImportName
5959
&& node.callee.type === 'MemberExpression'
6060
&& node.callee.object.type === 'Identifier'
@@ -69,17 +69,28 @@ module.exports = {
6969
&& node.callee.name === useStateReactImportName
7070
);
7171

72-
const scope = isPotentialUseStateCall && context.getScope();
73-
const useStateReference = scope && scope.references.find(
72+
const scope = isPotentialReactUseStateCall || isPotentialUseStateCall
73+
? context.getScope()
74+
: undefined;
75+
76+
const reactResolvedDefs = isPotentialReactUseStateCall && scope.references.find(
77+
(reference) => reference.identifier.name === defaultReactImportName
78+
).resolved.defs;
79+
const useStateResolvedDefs = isPotentialUseStateCall && scope.references.find(
7480
(reference) => reference.identifier.name === useStateReactImportName
75-
);
76-
const useStateResolvedDefs = useStateReference
77-
? useStateReference.resolved.defs
81+
).resolved.defs;
82+
83+
const ultimateReactResolvedDef = reactResolvedDefs
84+
? reactResolvedDefs[reactResolvedDefs.length - 1]
7885
: undefined;
7986
const ultimateUseStateResolvedDef = useStateResolvedDefs
8087
? useStateResolvedDefs[useStateResolvedDefs.length - 1]
8188
: undefined;
89+
90+
const isReactShadowed = ultimateReactResolvedDef && ultimateReactResolvedDef.type !== 'ImportBinding';
8291
const isUseStateShadowed = ultimateUseStateResolvedDef && ultimateUseStateResolvedDef.type !== 'ImportBinding';
92+
93+
const isReactUseStateCall = isPotentialReactUseStateCall && !isReactShadowed;
8394
const isUseStateCall = isPotentialUseStateCall && !isUseStateShadowed;
8495

8596
// Ignore unless this is a useState() or React.useState() call.

tests/lib/rules/hook-use-state.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,25 @@ const tests = {
9191
{
9292
code: `import { useState } from 'react'
9393
function useState() { // shadows React's useState
94-
return null;
94+
return null
9595
}
9696
export default function useColor() {
9797
const result = useState()
9898
}`,
9999
features: ['no-default'],
100100
},
101+
{
102+
code: `import React from 'react'
103+
const React = {
104+
useState: () => {
105+
return null
106+
}
107+
}
108+
export default function useColor() {
109+
const result = React.useState()
110+
}`,
111+
features: ['no-default'],
112+
},
101113
{
102114
code: `import { useState } from 'react'
103115
export default function useColor() {

0 commit comments

Comments
 (0)