diff --git a/lib/rules/prefer-stateless-function.js b/lib/rules/prefer-stateless-function.js index 4403273d9c..f9a989bb1b 100644 --- a/lib/rules/prefer-stateless-function.js +++ b/lib/rules/prefer-stateless-function.js @@ -296,16 +296,19 @@ module.exports = { }); } - return { - ClassDeclaration: function (node) { - if (ignorePureComponents && utils.isPureComponent(node)) { - markSCUAsDeclared(node); - } + function visitClass(node) { + if (ignorePureComponents && utils.isPureComponent(node)) { + markSCUAsDeclared(node); + } - if (node.decorators && node.decorators.length) { - markDecoratorsAsUsed(node); - } - }, + if (node.decorators && node.decorators.length) { + markDecoratorsAsUsed(node); + } + } + + return { + ClassDeclaration: visitClass, + ClassExpression: visitClass, // Mark `this` destructuring as a usage of `this` VariableDeclarator: function(node) { @@ -401,7 +404,6 @@ module.exports = { if (list[component].hasSCU && list[component].usePropsOrContext) { continue; } - context.report({ node: list[component].node, message: 'Component should be written as a pure function' diff --git a/tests/lib/rules/prefer-stateless-function.js b/tests/lib/rules/prefer-stateless-function.js index edf32e1673..e27a0b8dab 100644 --- a/tests/lib/rules/prefer-stateless-function.js +++ b/tests/lib/rules/prefer-stateless-function.js @@ -62,6 +62,19 @@ ruleTester.run('prefer-stateless-function', rule, { options: [{ ignorePureComponents: true }] + }, { + // Extends from PureComponent in an expression context. + code: [ + 'const Foo = class extends React.PureComponent {', + ' render() {', + ' return
{this.props.foo}
;', + ' }', + '};' + ].join('\n'), + parserOptions: parserOptions, + options: [{ + ignorePureComponents: true + }] }, { // Has a lifecyle method code: [