Skip to content

Commit 1252497

Browse files
committed
fixup! [New] Symmetric useState hook variable names
1 parent 952b712 commit 1252497

File tree

2 files changed

+59
-104
lines changed

2 files changed

+59
-104
lines changed

lib/rules/hook-use-state.js

+16-61
Original file line numberDiff line numberDiff line change
@@ -33,71 +33,12 @@ module.exports = {
3333
hasSuggestions: true,
3434
},
3535

36-
create: Components.detect((context, components) => ({
36+
create: Components.detect((context, components, util) => ({
3737
CallExpression(node) {
3838
const isImmediateReturn = node.parent
3939
&& node.parent.type === 'ReturnStatement';
4040

41-
if (isImmediateReturn) {
42-
return;
43-
}
44-
45-
const defaultReactImports = components.getDefaultReactImports();
46-
const namedReactImports = components.getNamedReactImports();
47-
const defaultReactImportSpecifier = defaultReactImports
48-
? defaultReactImports[0]
49-
: undefined;
50-
const defaultReactImportName = defaultReactImportSpecifier
51-
? defaultReactImportSpecifier.local.name
52-
: undefined;
53-
const useStateReactImportSpecifier = namedReactImports
54-
? namedReactImports.find((specifier) => specifier.imported.name === 'useState')
55-
: undefined;
56-
const useStateReactImportName = useStateReactImportSpecifier
57-
? useStateReactImportSpecifier.local.name
58-
: undefined;
59-
60-
const isPotentialReactUseStateCall = (
61-
defaultReactImportName
62-
&& node.callee.type === 'MemberExpression'
63-
&& node.callee.object.type === 'Identifier'
64-
&& node.callee.object.name === defaultReactImportName
65-
&& node.callee.property.type === 'Identifier'
66-
&& node.callee.property.name === 'useState'
67-
);
68-
69-
const isPotentialUseStateCall = (
70-
useStateReactImportName
71-
&& node.callee.type === 'Identifier'
72-
&& node.callee.name === useStateReactImportName
73-
);
74-
75-
const scope = isPotentialReactUseStateCall || isPotentialUseStateCall
76-
? context.getScope()
77-
: undefined;
78-
79-
const reactResolvedDefs = isPotentialReactUseStateCall && scope.references.find(
80-
(reference) => reference.identifier.name === defaultReactImportName
81-
).resolved.defs;
82-
const useStateResolvedDefs = isPotentialUseStateCall && scope.references.find(
83-
(reference) => reference.identifier.name === useStateReactImportName
84-
).resolved.defs;
85-
86-
const ultimateReactResolvedDef = reactResolvedDefs
87-
? reactResolvedDefs[reactResolvedDefs.length - 1]
88-
: undefined;
89-
const ultimateUseStateResolvedDef = useStateResolvedDefs
90-
? useStateResolvedDefs[useStateResolvedDefs.length - 1]
91-
: undefined;
92-
93-
const isReactShadowed = ultimateReactResolvedDef && ultimateReactResolvedDef.type !== 'ImportBinding';
94-
const isUseStateShadowed = ultimateUseStateResolvedDef && ultimateUseStateResolvedDef.type !== 'ImportBinding';
95-
96-
const isReactUseStateCall = isPotentialReactUseStateCall && !isReactShadowed;
97-
const isUseStateCall = isPotentialUseStateCall && !isUseStateShadowed;
98-
99-
// Ignore unless this is a useState() or React.useState() call.
100-
if (!isReactUseStateCall && !isUseStateCall) {
41+
if (isImmediateReturn || !util.isReactHookCall(node, ['useState'])) {
10142
return;
10243
}
10344

@@ -151,6 +92,20 @@ module.exports = {
15192
},
15293
];
15394

95+
const defaultReactImports = components.getDefaultReactImports();
96+
const defaultReactImportSpecifier = defaultReactImports
97+
? defaultReactImports[0]
98+
: undefined;
99+
100+
const defaultReactImportName = defaultReactImportSpecifier
101+
? defaultReactImportSpecifier.local.name
102+
: undefined;
103+
104+
const namedReactImports = components.getNamedReactImports();
105+
const useStateReactImportSpecifier = namedReactImports
106+
? namedReactImports.find((specifier) => specifier.imported.name === 'useState')
107+
: undefined;
108+
154109
const isSingleGetter = valueVariable && variableNodes.length === 1;
155110
const isUseStateCalledWithSingleArgument = node.arguments.length === 1;
156111
if (isSingleGetter && isUseStateCalledWithSingleArgument) {

0 commit comments

Comments
 (0)