Skip to content

Commit

Permalink
[Fix] Detect components with return statement in switch/case
Browse files Browse the repository at this point in the history
Fixes #2118
  • Loading branch information
yannickcr committed Jan 6, 2019
1 parent 2f5cec9 commit ba80a4c
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 6 deletions.
20 changes: 14 additions & 6 deletions lib/util/ast.js
Expand Up @@ -18,13 +18,21 @@ function findReturnStatement(node) {

const bodyNodes = (node.value ? node.value.body.body : node.body.body);

let i = bodyNodes.length - 1;
for (; i >= 0; i--) {
if (bodyNodes[i].type === 'ReturnStatement') {
return bodyNodes[i];
return (function loopNodes(nodes) {
let i = nodes.length - 1;
for (; i >= 0; i--) {
if (nodes[i].type === 'ReturnStatement') {
return nodes[i];
}
if (nodes[i].type === 'SwitchStatement') {
let j = nodes[i].cases.length - 1;
for (; j >= 0; j--) {
return loopNodes(nodes[i].cases[j].consequent);
}
}
}
}
return false;
return false;
}(bodyNodes));
}

/**
Expand Down
24 changes: 24 additions & 0 deletions tests/lib/rules/no-unused-prop-types.js
Expand Up @@ -4961,6 +4961,30 @@ ruleTester.run('no-unused-prop-types', rule, {
errors: [{
message: '\'person.lastname\' PropType is defined but prop is never used'
}]
}, {
code: `
import PropTypes from 'prop-types';
import React from 'react';
const MyComponent= (props) => {
switch (props.usedProp) {
case 1:
return (<div />);
default:
return <div />;
}
};
MyComponent.propTypes = {
usedProp: PropTypes.string,
unUsedProp: PropTypes.string,
};
export default MyComponent;
`,
errors: [{
message: '\'unUsedProp\' PropType is defined but prop is never used'
}]
}

/* , {
Expand Down
19 changes: 19 additions & 0 deletions tests/lib/rules/prop-types.js
Expand Up @@ -4334,6 +4334,25 @@ ruleTester.run('prop-types', rule, {
errors: [{
message: '\'text\' is missing in props validation'
}]
}, {
code: `
import PropTypes from 'prop-types';
import React from 'react';
const MyComponent = (props) => {
switch (props.usedProp) {
case 1:
return (<div />);
default:
return <div />;
}
};
export default MyComponent;
`,
errors: [{
message: '\'usedProp\' is missing in props validation'
}]
}
]
});
23 changes: 23 additions & 0 deletions tests/lib/rules/require-default-props.js
Expand Up @@ -2199,6 +2199,29 @@ ruleTester.run('require-default-props', rule, {
errors: [{
message: 'propType "name" is not required, but has no corresponding defaultProps declaration.'
}]
}, {
code: `
import PropTypes from 'prop-types';
import React from 'react';
const MyComponent= (props) => {
switch (props.usedProp) {
case 1:
return (<div />);
default:
return <div />;
}
};
MyComponent.propTypes = {
usedProp: PropTypes.string,
};
export default MyComponent;
`,
errors: [{
message: 'propType "usedProp" is not required, but has no corresponding defaultProps declaration.'
}]
}
]
});

0 comments on commit ba80a4c

Please sign in to comment.