diff --git a/src/jsdocUtils.js b/src/jsdocUtils.js index 7cc782971..4cc753c63 100644 --- a/src/jsdocUtils.js +++ b/src/jsdocUtils.js @@ -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': { @@ -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); @@ -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': @@ -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': @@ -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) { diff --git a/test/rules/assertions/requireReturns.js b/test/rules/assertions/requireReturns.js index d7b7732f1..d07b8cf11 100644 --- a/test/rules/assertions/requireReturns.js +++ b/test/rules/assertions/requireReturns.js @@ -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: ` /** diff --git a/test/rules/assertions/requireYields.js b/test/rules/assertions/requireYields.js index 2c8d670d7..0199b2611 100644 --- a/test/rules/assertions/requireYields.js +++ b/test/rules/assertions/requireYields.js @@ -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: [ {