diff --git a/src/resolver/__tests__/findAllComponentDefinitions-test.js b/src/resolver/__tests__/findAllComponentDefinitions-test.js index 37fd267a150..eb2fa3155ac 100644 --- a/src/resolver/__tests__/findAllComponentDefinitions-test.js +++ b/src/resolver/__tests__/findAllComponentDefinitions-test.js @@ -227,4 +227,30 @@ describe('findAllComponentDefinitions', () => { expect(result[0].value.type).toEqual('CallExpression'); }); }); + + describe('regressions', () => { + it('finds component wrapped in HOC', () => { + const source = ` + /** + * @flow + */ + import * as React from 'react'; + + type Props = $ReadOnly<{| + tabs: $ReadOnlyArray, + |}>; + + const TetraAdminTabs = React.memo((props: Props) => ( +
+ )); + + export default TetraAdminTabs; + `; + + const result = parse(source); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBe(1); + expect(result[0].value.type).toEqual('ArrowFunctionExpression'); + }); + }); }); diff --git a/src/resolver/findAllComponentDefinitions.js b/src/resolver/findAllComponentDefinitions.js index 47121531dcc..78de5c7418a 100644 --- a/src/resolver/findAllComponentDefinitions.js +++ b/src/resolver/findAllComponentDefinitions.js @@ -53,13 +53,22 @@ export default function findAllReactCreateClassCalls( const inner = resolveToValue(path.get('arguments', 0)); definitions.delete(inner); definitions.add(path); + + // Do not traverse into arguments + return false; } else if (isReactCreateClassCall(path)) { const resolvedPath = resolveToValue(path.get('arguments', 0)); if (types.ObjectExpression.check(resolvedPath.node)) { definitions.add(resolvedPath); } + + // Do not traverse into arguments + return false; } - return false; + + // If it is neither of the above cases we need to traverse further + // as this call expression could be a HOC + this.traverse(path); }, });