Skip to content

Commit 6fd8a07

Browse files
committed
fix(require-returns, require-yields): support more AST checking
1 parent 923a42a commit 6fd8a07

File tree

3 files changed

+76
-11
lines changed

3 files changed

+76
-11
lines changed

src/jsdocUtils.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,16 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
654654
);
655655
}
656656
657+
case 'ArrayPattern':
658+
case 'ArrayExpression':
659+
return node.elements.some((element) => {
660+
return hasNonEmptyResolverCall(element, resolverName);
661+
});
662+
663+
case 'AssignmentPattern':
664+
return hasNonEmptyResolverCall(node.right, resolverName);
665+
666+
// Todo: Review all of the statements below this for relevance to yields/throw/return checkers
657667
case 'AssignmentExpression':
658668
case 'BinaryExpression':
659669
case 'LogicalExpression': {
@@ -668,11 +678,6 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
668678
return hasNonEmptyResolverCall(subExpression, resolverName);
669679
});
670680
671-
case 'ArrayExpression':
672-
return node.elements.some((element) => {
673-
return hasNonEmptyResolverCall(element, resolverName);
674-
});
675-
676681
case 'ObjectExpression':
677682
return node.properties.some((property) => {
678683
return hasNonEmptyResolverCall(property, resolverName);
@@ -693,8 +698,8 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
693698
});
694699
}
695700
case 'VariableDeclarator': {
696-
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
697-
return hasNonEmptyResolverCall(node.init, resolverName);
701+
return hasNonEmptyResolverCall(node.id, resolverName) ||
702+
hasNonEmptyResolverCall(node.init, resolverName);
698703
}
699704
700705
case 'TaggedTemplateExpression':
@@ -710,8 +715,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
710715
/*
711716
// Todo: As relevant, also check these in return/throw and yield checks
712717
713-
case 'AssignmentPattern': // Default destructuring value
714-
case 'ArrayPattern': case 'ObjectPattern':
718+
case 'ObjectPattern':
715719
716720
case 'ClassProperty':
717721
case 'ClassDeclaration': case 'ClassExpression': case 'MethodDefinition':
@@ -826,14 +830,22 @@ const hasYieldValue = (node, checkYieldReturnValue) => {
826830
},
827831
);
828832
}
833+
case 'ArrayPattern':
834+
case 'ArrayExpression':
835+
return node.elements.some((element) => {
836+
return hasYieldValue(element, checkYieldReturnValue);
837+
});
838+
case 'AssignmentPattern':
839+
return hasYieldValue(node.right, checkYieldReturnValue);
840+
829841
case 'VariableDeclaration': {
830842
return node.declarations.some((nde) => {
831843
return hasYieldValue(nde, checkYieldReturnValue);
832844
});
833845
}
834846
case 'VariableDeclarator': {
835-
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
836-
return hasYieldValue(node.init, checkYieldReturnValue);
847+
return hasYieldValue(node.id, checkYieldReturnValue) ||
848+
hasYieldValue(node.init, checkYieldReturnValue);
837849
}
838850
case 'YieldExpression': {
839851
if (checkYieldReturnValue) {

test/rules/assertions/requireReturns.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,25 @@ export default {
12831283
ecmaVersion: 2_020,
12841284
},
12851285
},
1286+
{
1287+
code: `
1288+
/**
1289+
*
1290+
*/
1291+
function quux () {
1292+
return new Promise((resolve, reject) => {
1293+
const [a = resolve(true)] = [];
1294+
});
1295+
}
1296+
`,
1297+
errors: [
1298+
{
1299+
line: 2,
1300+
message: 'Missing JSDoc @returns declaration.',
1301+
},
1302+
],
1303+
ignoreReadme: true,
1304+
},
12861305
{
12871306
code: `
12881307
/**

test/rules/assertions/requireYields.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,40 @@ export default {
881881
},
882882
],
883883
},
884+
{
885+
code: `
886+
/**
887+
*
888+
*/
889+
function * quux () {
890+
[yield true];
891+
}
892+
`,
893+
errors: [
894+
{
895+
line: 2,
896+
message: 'Missing JSDoc @yields declaration.',
897+
},
898+
],
899+
ignoreReadme: true,
900+
},
901+
{
902+
code: `
903+
/**
904+
*
905+
*/
906+
function * quux () {
907+
const [a = yield true] = [];
908+
}
909+
`,
910+
errors: [
911+
{
912+
line: 2,
913+
message: 'Missing JSDoc @yields declaration.',
914+
},
915+
],
916+
ignoreReadme: true,
917+
},
884918
],
885919
valid: [
886920
{

0 commit comments

Comments
 (0)