Fix issue with multiple code branches in hooks linter (#14661)
* Fix issue with multiple code branches * Add solution by @calebmer * Add performance test * Undo unrelated change
This commit is contained in:
parent
f11a9c1cb0
commit
e19c9e1064
|
@ -270,6 +270,75 @@ eslintTester.run('react-hooks', ReactHooksESLintRule, {
|
||||||
useState();
|
useState();
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
|
`
|
||||||
|
// Valid because the loop doesn't change the order of hooks calls.
|
||||||
|
function RegressionTest() {
|
||||||
|
const res = [];
|
||||||
|
const additionalCond = true;
|
||||||
|
for (let i = 0; i !== 10 && additionalCond; ++i ) {
|
||||||
|
res.push(i);
|
||||||
|
}
|
||||||
|
React.useLayoutEffect(() => {});
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
// Is valid but hard to compute by brute-forcing
|
||||||
|
function MyComponent() {
|
||||||
|
// 40 conditions
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
if (c) {} else {}
|
||||||
|
|
||||||
|
// 10 hooks
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
useHook();
|
||||||
|
}
|
||||||
|
`,
|
||||||
],
|
],
|
||||||
invalid: [
|
invalid: [
|
||||||
{
|
{
|
||||||
|
|
|
@ -149,7 +149,14 @@ export default {
|
||||||
paths += countPathsFromStart(prevSegment);
|
paths += countPathsFromStart(prevSegment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cache.set(segment.id, paths);
|
|
||||||
|
// If our segment is reachable then there should be at least one path
|
||||||
|
// to it from the start of our code path.
|
||||||
|
if (segment.reachable && paths === 0) {
|
||||||
|
cache.delete(segment.id);
|
||||||
|
} else {
|
||||||
|
cache.set(segment.id, paths);
|
||||||
|
}
|
||||||
|
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue