Skip to content

Commit 445b020

Browse files
committed
Check further AST
1 parent ceadcfe commit 445b020

File tree

2 files changed

+90
-10
lines changed

2 files changed

+90
-10
lines changed

src/jsdocUtils.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
620620
621621
return hasNonEmptyResolverCall(node.body, resolverName);
622622
}
623+
case 'LabeledStatement':
623624
case 'WhileStatement':
624625
case 'DoWhileStatement':
625626
case 'ForStatement':
@@ -664,32 +665,46 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
664665
}
665666
666667
case 'ArrayExpression':
667-
return node.elements.some((bodyNode) => {
668-
return hasNonEmptyResolverCall(bodyNode, resolverName);
668+
return node.elements.some((element) => {
669+
return hasNonEmptyResolverCall(element, resolverName);
669670
});
670671
672+
case 'ObjectExpression':
673+
return node.properties.some((property) => {
674+
return hasNonEmptyResolverCall(property, resolverName);
675+
});
676+
case 'Property':
677+
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
678+
hasNonEmptyResolverCall(node.value, resolverName);
679+
671680
case 'AwaitExpression':
672681
case 'SpreadElement':
673682
case 'UnaryExpression':
674683
case 'YieldExpression':
675684
return hasNonEmptyResolverCall(node.argument, resolverName);
676685
686+
case 'VariableDeclaration': {
687+
return node.declarations.some((nde) => {
688+
return hasNonEmptyResolverCall(nde, resolverName);
689+
});
690+
}
691+
case 'VariableDeclarator': {
692+
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
693+
return hasNonEmptyResolverCall(node.init, resolverName);
694+
}
695+
677696
/*
678-
case 'LabeledStatement':
679-
case 'VariableDeclaration':
697+
// Todo: As relevant, also check these in return/throw and yield checks
680698
681699
case 'MemberExpression': case 'OptionalMemberExpression': // ?.
682-
case 'OptionalCallExpression': ?.x()
700+
case 'OptionalCallExpression': ?.x(resolve)
683701
684702
case 'TaggedTemplateExpression':
685703
case 'TemplateElement': case 'TemplateLiteral':
686704
687-
case 'AssignmentPattern':
705+
case 'AssignmentPattern': // Default destructuring value
688706
case 'ArrayPattern': case 'ObjectPattern':
689707
690-
case 'ObjectExpression':
691-
case 'Property':
692-
693708
case 'ClassProperty':
694709
case 'ClassDeclaration': case 'ClassExpression': case 'MethodDefinition':
695710
case 'Super':
@@ -803,6 +818,7 @@ const hasYieldValue = (node, checkYieldReturnValue) => {
803818
});
804819
}
805820
case 'VariableDeclarator': {
821+
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
806822
return hasYieldValue(node.init, checkYieldReturnValue);
807823
}
808824
case 'YieldExpression': {

test/rules/assertions/requireReturns.js

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ export default {
10681068
return new Promise((resolve, reject) => {
10691069
+resolve();
10701070
[...resolve()];
1071-
[resolve(true)];
1071+
[...+resolve(true)];
10721072
});
10731073
}
10741074
`,
@@ -1121,6 +1121,70 @@ export default {
11211121
ecmaVersion: 8,
11221122
},
11231123
},
1124+
{
1125+
code: `
1126+
/**
1127+
*
1128+
*/
1129+
function quux () {
1130+
return new Promise((resolve, reject) => {
1131+
someLabel: {
1132+
resolve(true);
1133+
}
1134+
});
1135+
}
1136+
`,
1137+
errors: [
1138+
{
1139+
line: 2,
1140+
message: 'Missing JSDoc @returns declaration.',
1141+
},
1142+
],
1143+
ignoreReadme: true,
1144+
},
1145+
{
1146+
code: `
1147+
/**
1148+
*
1149+
*/
1150+
function quux () {
1151+
return new Promise((resolve, reject) => {
1152+
var obj = {
1153+
[someKey]: 'val',
1154+
anotherKey: resolve(true)
1155+
}
1156+
});
1157+
}
1158+
`,
1159+
errors: [
1160+
{
1161+
line: 2,
1162+
message: 'Missing JSDoc @returns declaration.',
1163+
},
1164+
],
1165+
ignoreReadme: true,
1166+
},
1167+
{
1168+
code: `
1169+
/**
1170+
*
1171+
*/
1172+
function quux () {
1173+
return new Promise((resolve, reject) => {
1174+
var obj = {
1175+
[resolve(true)]: 'val',
1176+
}
1177+
});
1178+
}
1179+
`,
1180+
errors: [
1181+
{
1182+
line: 2,
1183+
message: 'Missing JSDoc @returns declaration.',
1184+
},
1185+
],
1186+
ignoreReadme: true,
1187+
},
11241188
{
11251189
code: `
11261190
/**

0 commit comments

Comments
 (0)