Skip to content

Commit 923a42a

Browse files
committed
require-returns: more AST types
1 parent ba1f510 commit 923a42a

File tree

2 files changed

+121
-9
lines changed

2 files changed

+121
-9
lines changed

src/jsdocUtils.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,10 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
591591
592592
// Arrow function without block
593593
switch (node.type) {
594+
case 'ChainExpression':
595+
return hasNonEmptyResolverCall(node.expression, resolverName);
596+
// istanbul ignore next -- In Babel?
597+
case 'OptionalCallExpression':
594598
case 'CallExpression':
595599
return node.callee.name === resolverName && (
596600
@@ -658,11 +662,11 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
658662
}
659663
660664
// Comma
661-
case 'SequenceExpression': {
665+
case 'SequenceExpression':
666+
case 'TemplateLiteral':
662667
return node.expressions.some((subExpression) => {
663668
return hasNonEmptyResolverCall(subExpression, resolverName);
664669
});
665-
}
666670
667671
case 'ArrayExpression':
668672
return node.elements.some((element) => {
@@ -693,14 +697,18 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
693697
return hasNonEmptyResolverCall(node.init, resolverName);
694698
}
695699
696-
/*
697-
// Todo: As relevant, also check these in return/throw and yield checks
700+
case 'TaggedTemplateExpression':
701+
return hasNonEmptyResolverCall(node.quasi, resolverName);
698702
699-
case 'MemberExpression': case 'OptionalMemberExpression': // ?.
700-
case 'OptionalCallExpression': ?.x(resolve)
703+
// ?.
704+
// istanbul ignore next -- In Babel?
705+
case 'OptionalMemberExpression':
706+
case 'MemberExpression':
707+
return hasNonEmptyResolverCall(node.object, resolverName) ||
708+
hasNonEmptyResolverCall(node.property, resolverName);
701709
702-
case 'TaggedTemplateExpression':
703-
case 'TemplateElement': case 'TemplateLiteral':
710+
/*
711+
// Todo: As relevant, also check these in return/throw and yield checks
704712
705713
case 'AssignmentPattern': // Default destructuring value
706714
case 'ArrayPattern': case 'ObjectPattern':
@@ -714,7 +722,6 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
714722
case 'ImportExpression':
715723
case 'Decorator':
716724
717-
// Todo: Add these (and also add to Yield/Throw checks)
718725
return false;
719726
*/
720727
case 'ReturnStatement': {
@@ -724,6 +731,13 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
724731
725732
return hasNonEmptyResolverCall(node.argument, resolverName);
726733
}
734+
735+
/*
736+
// Shouldn't need to parse literals/literal components
737+
738+
case 'Identifier':
739+
case 'TemplateElement':
740+
*/
727741
default:
728742
return false;
729743
}

test/rules/assertions/requireReturns.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,104 @@ export default {
11851185
],
11861186
ignoreReadme: true,
11871187
},
1188+
{
1189+
code: `
1190+
/**
1191+
*
1192+
*/
1193+
function quux () {
1194+
return new Promise((resolve, reject) => {
1195+
\`abc$\{resolve(true)}\`;
1196+
});
1197+
}
1198+
`,
1199+
errors: [
1200+
{
1201+
line: 2,
1202+
message: 'Missing JSDoc @returns declaration.',
1203+
},
1204+
],
1205+
ignoreReadme: true,
1206+
},
1207+
{
1208+
code: `
1209+
/**
1210+
*
1211+
*/
1212+
function quux () {
1213+
return new Promise((resolve, reject) => {
1214+
tagTemp\`abc$\{resolve(true)}\`;
1215+
});
1216+
}
1217+
`,
1218+
errors: [
1219+
{
1220+
line: 2,
1221+
message: 'Missing JSDoc @returns declaration.',
1222+
},
1223+
],
1224+
ignoreReadme: true,
1225+
},
1226+
{
1227+
code: `
1228+
/**
1229+
*
1230+
*/
1231+
function quux () {
1232+
return new Promise((resolve, reject) => {
1233+
a.b[resolve(true)].c;
1234+
});
1235+
}
1236+
`,
1237+
errors: [
1238+
{
1239+
line: 2,
1240+
message: 'Missing JSDoc @returns declaration.',
1241+
},
1242+
],
1243+
ignoreReadme: true,
1244+
},
1245+
{
1246+
code: `
1247+
/**
1248+
*
1249+
*/
1250+
function quux () {
1251+
return new Promise((resolve, reject) => {
1252+
a.b[resolve(true)].c;
1253+
});
1254+
}
1255+
`,
1256+
errors: [
1257+
{
1258+
line: 2,
1259+
message: 'Missing JSDoc @returns declaration.',
1260+
},
1261+
],
1262+
ignoreReadme: true,
1263+
},
1264+
{
1265+
code: `
1266+
/**
1267+
*
1268+
*/
1269+
function quux () {
1270+
return new Promise((resolve, reject) => {
1271+
abc?.[resolve(true)].d?.e(resolve(true));
1272+
});
1273+
}
1274+
`,
1275+
errors: [
1276+
{
1277+
line: 2,
1278+
message: 'Missing JSDoc @returns declaration.',
1279+
},
1280+
],
1281+
ignoreReadme: true,
1282+
parserOptions: {
1283+
ecmaVersion: 2_020,
1284+
},
1285+
},
11881286
{
11891287
code: `
11901288
/**

0 commit comments

Comments
 (0)