Skip to content

Commit 867edc3

Browse files
committedOct 23, 2022
fix(require-param): do not cache by comment node; fixes #901
May target same comment node but with different JS node (e.g., if `any` context is used, we don't want an export declaration's comment to be cached (but not used) and then this prevent the export's `FunctionDeclaration` from being evaluated
1 parent 4fabdd6 commit 867edc3

File tree

3 files changed

+72
-27
lines changed

3 files changed

+72
-27
lines changed
 

‎src/iterateJsdoc.js

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
getReducedASTNode,
32
getJSDocComment,
43
commentHandler,
54
parseComment,
@@ -1147,14 +1146,8 @@ const iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContext
11471146

11481147
return {
11491148
'*:not(Program)' (node) {
1150-
const reducedNode = getReducedASTNode(node, sourceCode);
1151-
1152-
if (node !== reducedNode) {
1153-
return;
1154-
}
1155-
11561149
const commentNode = getJSDocComment(sourceCode, node, settings);
1157-
if (trackedJsdocs.has(commentNode)) {
1150+
if (!ruleConfig.noTracking && trackedJsdocs.has(commentNode)) {
11581151
return;
11591152
}
11601153

‎src/rules/requireParam.js

+28-19
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,6 @@ export default iterateJsdoc(({
3131
utils,
3232
context,
3333
}) => {
34-
const preferredTagName = utils.getPreferredTagName({
35-
tagName: 'param',
36-
});
37-
if (!preferredTagName) {
38-
return;
39-
}
40-
41-
const jsdocParameterNames = utils.getJsdocTagsDeep(preferredTagName);
42-
43-
const shallowJsdocParameterNames = jsdocParameterNames.filter((tag) => {
44-
return !tag.name.includes('.');
45-
}).map((tag, idx) => {
46-
return {
47-
...tag,
48-
idx,
49-
};
50-
});
51-
5234
if (utils.avoidDocs()) {
5335
return;
5436
}
@@ -73,10 +55,32 @@ export default iterateJsdoc(({
7355
useDefaultObjectProperties = false,
7456
} = context.options[0] || {};
7557

58+
const preferredTagName = utils.getPreferredTagName({
59+
tagName: 'param',
60+
});
61+
if (!preferredTagName) {
62+
return;
63+
}
64+
65+
const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);
66+
if (!functionParameterNames.length) {
67+
return;
68+
}
69+
70+
const jsdocParameterNames = utils.getJsdocTagsDeep(preferredTagName);
71+
72+
const shallowJsdocParameterNames = jsdocParameterNames.filter((tag) => {
73+
return !tag.name.includes('.');
74+
}).map((tag, idx) => {
75+
return {
76+
...tag,
77+
idx,
78+
};
79+
});
80+
7681
const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);
7782

7883
const missingTags = [];
79-
const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);
8084
const flattenedRoots = utils.flattenRoots(functionParameterNames).names;
8185

8286
const paramIndex = {};
@@ -486,4 +490,9 @@ export default iterateJsdoc(({
486490
],
487491
type: 'suggestion',
488492
},
493+
494+
// We cannot cache comment nodes as the contexts may recur with the
495+
// same comment node but a different JS node, and we may need the different
496+
// JS node to ensure we iterate its context
497+
noTracking: true,
489498
});

‎test/rules/assertions/requireParam.js

+43
Original file line numberDiff line numberDiff line change
@@ -2408,6 +2408,49 @@ export default {
24082408
`,
24092409
parser: require.resolve('@typescript-eslint/parser'),
24102410
},
2411+
{
2412+
code: `
2413+
/**
2414+
* Helper function to warp to a custom stage/level.
2415+
*
2416+
* @param name The name
2417+
* @param firstFloor Optional.
2418+
*/
2419+
export function setCustomStage(
2420+
name: string,
2421+
firstFloor = true,
2422+
verbose = false,
2423+
): void {}
2424+
`,
2425+
errors: [
2426+
{
2427+
message: 'Missing JSDoc @param "verbose" declaration.',
2428+
},
2429+
],
2430+
ignoreReadme: true,
2431+
options: [
2432+
{
2433+
contexts: [
2434+
'any',
2435+
],
2436+
},
2437+
],
2438+
output: `
2439+
/**
2440+
* Helper function to warp to a custom stage/level.
2441+
*
2442+
* @param name The name
2443+
* @param firstFloor Optional.
2444+
* @param verbose
2445+
*/
2446+
export function setCustomStage(
2447+
name: string,
2448+
firstFloor = true,
2449+
verbose = false,
2450+
): void {}
2451+
`,
2452+
parser: require.resolve('@typescript-eslint/parser'),
2453+
},
24112454
],
24122455
valid: [
24132456
{

0 commit comments

Comments
 (0)
Please sign in to comment.