Skip to content

Commit 4da90ea

Browse files
committed
[Fix] prop-types: avoid crash on used prevProps
Fixes #2095.
1 parent 0202de3 commit 4da90ea

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

lib/util/usedPropTypes.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -379,15 +379,18 @@ module.exports = function usedPropTypesInstructions(context, components, utils)
379379
}
380380

381381
const nodeSource = sourceCode.getText(node);
382-
const isDirectProp = DIRECT_PROPS_REGEX.test(nodeSource) || DIRECT_NEXT_PROPS_REGEX.test(nodeSource);
382+
const isDirectProp = DIRECT_PROPS_REGEX.test(nodeSource)
383+
|| DIRECT_NEXT_PROPS_REGEX.test(nodeSource)
384+
|| DIRECT_PREV_PROPS_REGEX.test(nodeSource);
385+
const reportedNode = (
386+
!isDirectProp && !inConstructor() && !inComponentWillReceiveProps() ?
387+
node.parent.property :
388+
node.property
389+
);
383390
usedPropTypes.push({
384391
name: name,
385392
allNames: allNames,
386-
node: (
387-
!isDirectProp && !inConstructor() && !inComponentWillReceiveProps() ?
388-
node.parent.property :
389-
node.property
390-
)
393+
node: reportedNode
391394
});
392395
break;
393396
case 'destructuring':

tests/lib/rules/prop-types.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,36 @@ ruleTester.run('prop-types', rule, {
22472247
query: PropTypes.string,
22482248
};
22492249
`
2250+
},
2251+
{
2252+
code: [
2253+
'export default class LazyLoader extends Component {',
2254+
' static propTypes = {',
2255+
' children: PropTypes.node,',
2256+
' load: PropTypes.any,',
2257+
' };',
2258+
' state = { mod: null };',
2259+
' shouldComponentUpdate(prevProps) {',
2260+
' assert(prevProps.load === this.props.load);',
2261+
' return true;',
2262+
' }',
2263+
' load() {',
2264+
' this.props.load(mod => {',
2265+
' this.setState({',
2266+
' mod: mod.default ? mod.default : mod',
2267+
' });',
2268+
' });',
2269+
' }',
2270+
' render() {',
2271+
' if (this.state.mod !== null) {',
2272+
' return this.props.children(this.state.mod);',
2273+
' }',
2274+
' this.load();',
2275+
' return null;',
2276+
' }',
2277+
'}'
2278+
].join('\n'),
2279+
parser: 'babel-eslint'
22502280
}
22512281
],
22522282

0 commit comments

Comments
 (0)