diff --git a/lib/rules/no-unused-prop-types.js b/lib/rules/no-unused-prop-types.js index be9054934c..aa70e176b4 100644 --- a/lib/rules/no-unused-prop-types.js +++ b/lib/rules/no-unused-prop-types.js @@ -635,7 +635,7 @@ module.exports = { break; } - components.set(node, { + components.set(component ? component.node : node, { usedPropTypes: usedPropTypes, ignorePropsValidation: ignorePropsValidation }); diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index 02a6032273..e994a0701b 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -1461,6 +1461,130 @@ ruleTester.run('no-unused-prop-types', rule, { '};' ].join('\n'), parserOptions: parserOptions + }, { + // Props used inside of an async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' await this.props.foo();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Multiple props used inside of an async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' await this.props.foo();', + ' await this.props.bar();', + ' await this.props.baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Destructured props inside of async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' const { foo } = this.props;', + ' await foo();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Multiple destructured props inside of async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' const { foo, bar, baz } = this.props;', + ' await foo();', + ' await bar();', + ' await baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Props used inside of an async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' }', + ' async method() {', + ' await this.props.foo();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Multiple props used inside of an async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' async method() {', + ' await this.props.foo();', + ' await this.props.bar();', + ' await this.props.baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Destrucuted props inside of async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' }', + ' async method() {', + ' const { foo } = this.props;', + ' await foo();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + // Multiple destrucuted props inside of async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' async method() {', + ' const { foo, bar, baz } = this.props;', + ' await foo();', + ' await bar();', + ' await baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint' } ], @@ -2438,6 +2562,84 @@ ruleTester.run('no-unused-prop-types', rule, { line: 3, column: 16 }] + }, { + // Multiple props used inside of an async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' await this.props.foo();', + ' await this.props.bar();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'baz\' PropType is defined but prop is never used' + }] + }, { + // Multiple destructured props inside of async class property + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' classProperty = async () => {', + ' const { bar, baz } = this.props;', + ' await bar();', + ' await baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'foo\' PropType is defined but prop is never used' + }] + }, { + // Multiple props used inside of an async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' async method() {', + ' await this.props.foo();', + ' await this.props.baz();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'bar\' PropType is defined but prop is never used' + }] + }, { + // Multiple destrucuted props inside of async class method + code: [ + 'export class Example extends Component {', + ' static propTypes = {', + ' foo: PropTypes.func,', + ' bar: PropTypes.func,', + ' baz: PropTypes.func,', + ' }', + ' async method() {', + ' const { foo, bar } = this.props;', + ' await foo();', + ' await bar();', + ' };', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [{ + message: '\'baz\' PropType is defined but prop is never used' + }] }/* , { // Enable this when the following issue is fixed // https://github.com/yannickcr/eslint-plugin-react/issues/296