From 41974e5a89e527b79e97e097210a001de6e42788 Mon Sep 17 00:00:00 2001 From: Luke Zapart Date: Thu, 3 Jan 2019 14:14:04 -0800 Subject: [PATCH] Fix propType detection inside class bodies --- lib/util/propTypes.js | 10 ++++---- tests/lib/rules/no-unused-prop-types.js | 33 ++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/util/propTypes.js b/lib/util/propTypes.js index 59d4d6d94c..283e969284 100644 --- a/lib/util/propTypes.js +++ b/lib/util/propTypes.js @@ -68,15 +68,15 @@ function iterateProperties(context, properties, fn) { } /** - * Checks if a node is inside a class property. + * Checks if a node is inside a class body. * * @param {ASTNode} node the AST node being checked. - * @returns {Boolean} True if the node has a ClassProperty ancestor, false if not. + * @returns {Boolean} True if the node has a ClassBody ancestor, false if not. */ -function isInsideClassProperty(node) { +function isInsideClassBody(node) { let parent = node.parent; while (parent) { - if (parent.type === 'ClassProperty') { + if (parent.type === 'ClassBody') { return true; } parent = parent.parent; @@ -572,7 +572,7 @@ module.exports = function propTypesInstructions(context, components, utils) { return; } - if (isInsideClassProperty(node)) { + if (isInsideClassBody(node)) { return; } diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index 359676c1d7..1483370ff0 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -2935,7 +2935,7 @@ ruleTester.run('no-unused-prop-types', rule, { used: string, } class Hello extends React.Component { - renderHelper = ({unused}: {unused: string}) => { + renderHelper = ({notAProp}: {notAProp: string}) => { return
; } render() { @@ -2944,6 +2944,37 @@ ruleTester.run('no-unused-prop-types', rule, { } `, parser: 'babel-eslint' + }, { + code: ` + type Props = { + used: string, + } + class Hello extends React.Component { + componentDidMount() { + foo( + ({notAProp}: {notAProp: string}) => (
) + ); + } + render() { + return
{this.props.used}
; + } + } + `, + parser: 'babel-eslint' + }, { + code: ` + type Props = { + used: string, + } + class Hello extends React.Component { + render() { + return
{this.props.used}
} + />; + } + } + `, + parser: 'babel-eslint' } ],