Skip to content

Commit 04d9b17

Browse files
committed
Fix require-render-return to only check valid render methods (fixes #563)
1 parent 63d33cb commit 04d9b17

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

lib/rules/require-render-return.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,38 @@ module.exports = Components.detect(function(context, components, utils) {
2222
});
2323
}
2424

25+
/**
26+
* Get properties for a given AST node
27+
* @param {ASTNode} node The AST node being checked.
28+
* @returns {Array} Properties array.
29+
*/
30+
function getComponentProperties(node) {
31+
switch (node.type) {
32+
case 'ClassDeclaration':
33+
return node.body.body;
34+
case 'ObjectExpression':
35+
return node.properties;
36+
default:
37+
return [];
38+
}
39+
}
40+
41+
/**
42+
* Check if a given AST node has a render method
43+
* @param {ASTNode} node The AST node being checked.
44+
* @returns {Boolean} True if there is a render method, false if not
45+
*/
46+
function hasRenderMethod(node) {
47+
var properties = getComponentProperties(node);
48+
for (var i = 0, j = properties.length; i < j; i++) {
49+
if (properties[i].key.name !== 'render') {
50+
continue;
51+
}
52+
return properties[i].value.type === 'FunctionExpression';
53+
}
54+
return false;
55+
}
56+
2557
return {
2658
ReturnStatement: function(node) {
2759
var ancestors = context.getAncestors(node).reverse();
@@ -46,6 +78,7 @@ module.exports = Components.detect(function(context, components, utils) {
4678
for (var component in list) {
4779
if (
4880
!list.hasOwnProperty(component) ||
81+
!hasRenderMethod(list[component].node) ||
4982
list[component].hasReturnStatement ||
5083
(!utils.isES5Component(list[component].node) && !utils.isES6Component(list[component].node))
5184
) {

tests/lib/rules/require-render-return.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,23 @@ ruleTester.run('require-render-return', rule, {
9393
'}'
9494
].join('\n'),
9595
parserOptions: parserOptions
96+
}, {
97+
// ES6 class without a render method
98+
code: 'class Hello extends React.Component {}',
99+
parserOptions: parserOptions
100+
}, {
101+
// ES5 class without a render method
102+
code: 'var Hello = React.createClass({});',
103+
parserOptions: parserOptions
104+
}, {
105+
// ES5 class with an imported render method
106+
code: [
107+
'var render = require(\'./render\');',
108+
'var Hello = React.createClass({',
109+
' render',
110+
'});'
111+
].join('\n'),
112+
parserOptions: parserOptions
96113
}],
97114

98115
invalid: [{

0 commit comments

Comments
 (0)