Skip to content

Commit

Permalink
Fix require-render-return to only check valid render methods (fixes #563
Browse files Browse the repository at this point in the history
)
  • Loading branch information
yannickcr committed May 3, 2016
1 parent 63d33cb commit 04d9b17
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
33 changes: 33 additions & 0 deletions lib/rules/require-render-return.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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))
) {
Expand Down
17 changes: 17 additions & 0 deletions tests/lib/rules/require-render-return.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: [{
Expand Down

0 comments on commit 04d9b17

Please sign in to comment.