Skip to content

Commit 9f4b4e6

Browse files
committed
Fix name calculation for classes in functions (fixes #264)
1 parent b84ec2b commit 9f4b4e6

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

lib/rules/prop-types.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ module.exports = function(context) {
575575
markPropTypesAsUsed(node);
576576
break;
577577
case 'declaration':
578-
var component = componentList.getByName(node.object.name);
578+
var component = componentList.getByName(context.getSource(node.object));
579579
if (!component) {
580580
return;
581581
}

lib/util/component.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ function isStatelessFunctionComponent(context, node) {
7474
function getIdentifiers(node) {
7575
var name = [];
7676
var loopNode = node;
77-
var namePart = [];
78-
while (loopNode) {
77+
var namePart;
78+
while (loopNode && (!name.length || loopNode.type !== 'FunctionDeclaration')) {
7979
namePart = (loopNode.id && loopNode.id.name) || (loopNode.key && loopNode.key.name);
8080
if (namePart) {
8181
name.unshift(namePart);

tests/lib/rules/prop-types.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,34 @@ ruleTester.run('prop-types', rule, {
818818
'};'
819819
].join('\n'),
820820
parser: 'babel-eslint'
821+
}, {
822+
code: [
823+
'function HelloComponent() {',
824+
' class Hello extends React.Component {',
825+
' render() {',
826+
' return <div>Hello {this.props.name}</div>;',
827+
' }',
828+
' }',
829+
' Hello.propTypes = { name: React.PropTypes.string };',
830+
' return Hello;',
831+
'}',
832+
'module.exports = HelloComponent();'
833+
].join('\n'),
834+
parser: 'babel-eslint'
835+
}, {
836+
code: [
837+
'function HelloComponent() {',
838+
' var Hello = React.createClass({',
839+
' propTypes: { name: React.PropTypes.string },',
840+
' render: function() {',
841+
' return <div>Hello {this.props.name}</div>;',
842+
' }',
843+
' });',
844+
' return Hello;',
845+
'}',
846+
'module.exports = HelloComponent();'
847+
].join('\n'),
848+
parser: 'babel-eslint'
821849
}
822850
],
823851

@@ -1326,6 +1354,38 @@ ruleTester.run('prop-types', rule, {
13261354
{message: '\'source\' is missing in props validation for Hello'},
13271355
{message: '\'source.uri\' is missing in props validation for Hello'}
13281356
]
1357+
}, {
1358+
code: [
1359+
'function HelloComponent() {',
1360+
' class Hello extends React.Component {',
1361+
' render() {',
1362+
' return <div>Hello {this.props.name}</div>;',
1363+
' }',
1364+
' }',
1365+
' return Hello;',
1366+
'}',
1367+
'module.exports = HelloComponent();'
1368+
].join('\n'),
1369+
parser: 'babel-eslint',
1370+
errors: [
1371+
{message: '\'name\' is missing in props validation for Hello'}
1372+
]
1373+
}, {
1374+
code: [
1375+
'function HelloComponent() {',
1376+
' var Hello = React.createClass({',
1377+
' render: function() {',
1378+
' return <div>Hello {this.props.name}</div>;',
1379+
' }',
1380+
' });',
1381+
' return Hello;',
1382+
'}',
1383+
'module.exports = HelloComponent();'
1384+
].join('\n'),
1385+
parser: 'babel-eslint',
1386+
errors: [
1387+
{message: '\'name\' is missing in props validation for Hello'}
1388+
]
13291389
}
13301390
]
13311391
});

0 commit comments

Comments
 (0)