diff --git a/lib/rules/require-render-return.js b/lib/rules/require-render-return.js index 1c82cb90ee..28082846df 100644 --- a/lib/rules/require-render-return.js +++ b/lib/rules/require-render-return.js @@ -22,6 +22,38 @@ module.exports = Components.detect(function(context, components, utils) { }); } + /** + * Get properties for a given AST node + * @param {ASTNode} node The AST node being checked. + * @returns {Array} Properties array. + */ + function getComponentProperties(node) { + switch (node.type) { + case 'ClassDeclaration': + return node.body.body; + case 'ObjectExpression': + return node.properties; + default: + return []; + } + } + + /** + * Check if a given AST node has a render method + * @param {ASTNode} node The AST node being checked. + * @returns {Boolean} True if there is a render method, false if not + */ + function hasRenderMethod(node) { + var properties = getComponentProperties(node); + for (var i = 0, j = properties.length; i < j; i++) { + if (properties[i].key.name !== 'render') { + continue; + } + return properties[i].value.type === 'FunctionExpression'; + } + return false; + } + return { ReturnStatement: function(node) { var ancestors = context.getAncestors(node).reverse(); @@ -46,6 +78,7 @@ module.exports = Components.detect(function(context, components, utils) { for (var component in list) { if ( !list.hasOwnProperty(component) || + !hasRenderMethod(list[component].node) || list[component].hasReturnStatement || (!utils.isES5Component(list[component].node) && !utils.isES6Component(list[component].node)) ) { diff --git a/tests/lib/rules/require-render-return.js b/tests/lib/rules/require-render-return.js index d29960b2fc..f6e0665037 100644 --- a/tests/lib/rules/require-render-return.js +++ b/tests/lib/rules/require-render-return.js @@ -93,6 +93,23 @@ ruleTester.run('require-render-return', rule, { '}' ].join('\n'), parserOptions: parserOptions + }, { + // ES6 class without a render method + code: 'class Hello extends React.Component {}', + parserOptions: parserOptions + }, { + // ES5 class without a render method + code: 'var Hello = React.createClass({});', + parserOptions: parserOptions + }, { + // ES5 class with an imported render method + code: [ + 'var render = require(\'./render\');', + 'var Hello = React.createClass({', + ' render', + '});' + ].join('\n'), + parserOptions: parserOptions }], invalid: [{