Skip to content

Commit

Permalink
fix(require-returns, require-yields): support more AST checking
Browse files Browse the repository at this point in the history
  • Loading branch information
brettz9 committed Jan 31, 2021
1 parent 923a42a commit 6fd8a07
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 11 deletions.
34 changes: 23 additions & 11 deletions src/jsdocUtils.js
Expand Up @@ -654,6 +654,16 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
);
}

case 'ArrayPattern':
case 'ArrayExpression':
return node.elements.some((element) => {
return hasNonEmptyResolverCall(element, resolverName);
});

case 'AssignmentPattern':
return hasNonEmptyResolverCall(node.right, resolverName);

// Todo: Review all of the statements below this for relevance to yields/throw/return checkers
case 'AssignmentExpression':
case 'BinaryExpression':
case 'LogicalExpression': {
Expand All @@ -668,11 +678,6 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
return hasNonEmptyResolverCall(subExpression, resolverName);
});

case 'ArrayExpression':
return node.elements.some((element) => {
return hasNonEmptyResolverCall(element, resolverName);
});

case 'ObjectExpression':
return node.properties.some((property) => {
return hasNonEmptyResolverCall(property, resolverName);
Expand All @@ -693,8 +698,8 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
});
}
case 'VariableDeclarator': {
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
return hasNonEmptyResolverCall(node.init, resolverName);
return hasNonEmptyResolverCall(node.id, resolverName) ||
hasNonEmptyResolverCall(node.init, resolverName);
}

case 'TaggedTemplateExpression':
Expand All @@ -710,8 +715,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
/*
// Todo: As relevant, also check these in return/throw and yield checks
case 'AssignmentPattern': // Default destructuring value
case 'ArrayPattern': case 'ObjectPattern':
case 'ObjectPattern':
case 'ClassProperty':
case 'ClassDeclaration': case 'ClassExpression': case 'MethodDefinition':
Expand Down Expand Up @@ -826,14 +830,22 @@ const hasYieldValue = (node, checkYieldReturnValue) => {
},
);
}
case 'ArrayPattern':
case 'ArrayExpression':
return node.elements.some((element) => {
return hasYieldValue(element, checkYieldReturnValue);
});
case 'AssignmentPattern':
return hasYieldValue(node.right, checkYieldReturnValue);

case 'VariableDeclaration': {
return node.declarations.some((nde) => {
return hasYieldValue(nde, checkYieldReturnValue);
});
}
case 'VariableDeclarator': {
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
return hasYieldValue(node.init, checkYieldReturnValue);
return hasYieldValue(node.id, checkYieldReturnValue) ||
hasYieldValue(node.init, checkYieldReturnValue);
}
case 'YieldExpression': {
if (checkYieldReturnValue) {
Expand Down
19 changes: 19 additions & 0 deletions test/rules/assertions/requireReturns.js
Expand Up @@ -1283,6 +1283,25 @@ export default {
ecmaVersion: 2_020,
},
},
{
code: `
/**
*
*/
function quux () {
return new Promise((resolve, reject) => {
const [a = resolve(true)] = [];
});
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @returns declaration.',
},
],
ignoreReadme: true,
},
{
code: `
/**
Expand Down
34 changes: 34 additions & 0 deletions test/rules/assertions/requireYields.js
Expand Up @@ -881,6 +881,40 @@ export default {
},
],
},
{
code: `
/**
*
*/
function * quux () {
[yield true];
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @yields declaration.',
},
],
ignoreReadme: true,
},
{
code: `
/**
*
*/
function * quux () {
const [a = yield true] = [];
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @yields declaration.',
},
],
ignoreReadme: true,
},
],
valid: [
{
Expand Down

0 comments on commit 6fd8a07

Please sign in to comment.