Skip to content

Commit

Permalink
Check further AST
Browse files Browse the repository at this point in the history
  • Loading branch information
brettz9 committed Jan 31, 2021
1 parent ceadcfe commit 445b020
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 10 deletions.
34 changes: 25 additions & 9 deletions src/jsdocUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
return hasNonEmptyResolverCall(node.body, resolverName);
}
case 'LabeledStatement':
case 'WhileStatement':
case 'DoWhileStatement':
case 'ForStatement':
Expand Down Expand Up @@ -664,32 +665,46 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
}
case 'ArrayExpression':
return node.elements.some((bodyNode) => {
return hasNonEmptyResolverCall(bodyNode, resolverName);
return node.elements.some((element) => {
return hasNonEmptyResolverCall(element, resolverName);
});
case 'ObjectExpression':
return node.properties.some((property) => {
return hasNonEmptyResolverCall(property, resolverName);
});
case 'Property':
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
hasNonEmptyResolverCall(node.value, resolverName);
case 'AwaitExpression':
case 'SpreadElement':
case 'UnaryExpression':
case 'YieldExpression':
return hasNonEmptyResolverCall(node.argument, resolverName);
case 'VariableDeclaration': {
return node.declarations.some((nde) => {
return hasNonEmptyResolverCall(nde, resolverName);
});
}
case 'VariableDeclarator': {
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
return hasNonEmptyResolverCall(node.init, resolverName);
}
/*
case 'LabeledStatement':
case 'VariableDeclaration':
// Todo: As relevant, also check these in return/throw and yield checks
case 'MemberExpression': case 'OptionalMemberExpression': // ?.
case 'OptionalCallExpression': ?.x()
case 'OptionalCallExpression': ?.x(resolve)
case 'TaggedTemplateExpression':
case 'TemplateElement': case 'TemplateLiteral':
case 'AssignmentPattern':
case 'AssignmentPattern': // Default destructuring value
case 'ArrayPattern': case 'ObjectPattern':
case 'ObjectExpression':
case 'Property':
case 'ClassProperty':
case 'ClassDeclaration': case 'ClassExpression': case 'MethodDefinition':
case 'Super':
Expand Down Expand Up @@ -803,6 +818,7 @@ const hasYieldValue = (node, checkYieldReturnValue) => {
});
}
case 'VariableDeclarator': {
// Todo: Check `id` too once `ArrayPattern` is implemented (destructuring default)
return hasYieldValue(node.init, checkYieldReturnValue);
}
case 'YieldExpression': {
Expand Down
66 changes: 65 additions & 1 deletion test/rules/assertions/requireReturns.js
Original file line number Diff line number Diff line change
Expand Up @@ -1068,7 +1068,7 @@ export default {
return new Promise((resolve, reject) => {
+resolve();
[...resolve()];
[resolve(true)];
[...+resolve(true)];
});
}
`,
Expand Down Expand Up @@ -1121,6 +1121,70 @@ export default {
ecmaVersion: 8,
},
},
{
code: `
/**
*
*/
function quux () {
return new Promise((resolve, reject) => {
someLabel: {
resolve(true);
}
});
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @returns declaration.',
},
],
ignoreReadme: true,
},
{
code: `
/**
*
*/
function quux () {
return new Promise((resolve, reject) => {
var obj = {
[someKey]: 'val',
anotherKey: resolve(true)
}
});
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @returns declaration.',
},
],
ignoreReadme: true,
},
{
code: `
/**
*
*/
function quux () {
return new Promise((resolve, reject) => {
var obj = {
[resolve(true)]: 'val',
}
});
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @returns declaration.',
},
],
ignoreReadme: true,
},
{
code: `
/**
Expand Down

0 comments on commit 445b020

Please sign in to comment.