Skip to content

Commit 601e52d

Browse files
committed
fix(require-file-overview): fix logic for detecting start of file
1 parent 9f73e97 commit 601e52d

File tree

2 files changed

+74
-31
lines changed

2 files changed

+74
-31
lines changed

src/rules/checkParamNames.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Todo[engine:node@>=7.0.0]: Replace with `Object.entries`
12
import entries from 'object.entries-ponyfill';
23
import iterateJsdoc from '../iterateJsdoc';
34

src/rules/requireFileOverview.js

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,87 @@
1+
// Todo[engine:node@>=7.0.0]: Replace with `Object.entries`
2+
import entries from 'object.entries-ponyfill';
13
import iterateJsdoc from '../iterateJsdoc';
24

5+
const defaultTags = {
6+
file: {
7+
initialCommentsOnly: true,
8+
mustExist: true,
9+
preventDuplicates: true,
10+
},
11+
};
12+
13+
const setDefaults = (state) => {
14+
// First iteration
15+
if (!state.globalTags) {
16+
state.globalTags = {};
17+
state.hasDuplicates = {};
18+
state.hasTag = {};
19+
state.hasNonCommentBeforeTag = {};
20+
}
21+
};
22+
323
export default iterateJsdoc(({
24+
jsdocNode,
425
state,
526
utils,
627
}) => {
7-
const targetTagName = utils.getPreferredTagName({tagName: 'file'});
28+
const tags = defaultTags;
829

9-
const hasFileOverview = targetTagName && utils.hasTag(targetTagName);
30+
setDefaults(state);
1031

11-
if (state.hasFileOverview) {
12-
state.hasDuplicate = hasFileOverview;
32+
for (const tagName of Object.keys(tags)) {
33+
const targetTagName = utils.getPreferredTagName({tagName});
1334

14-
return;
15-
}
35+
const hasTag = targetTagName && utils.hasTag(targetTagName);
36+
37+
state.hasTag[tagName] = hasTag || state.hasTag[tagName];
38+
39+
const hasDuplicate = state.hasDuplicates[tagName];
1640

17-
state.hasFileOverview = hasFileOverview;
41+
if (hasDuplicate === false) {
42+
// Was marked before, so if a tag now, is a dupe
43+
state.hasDuplicates[tagName] = hasTag;
44+
} else if (!hasDuplicate && hasTag) {
45+
// No dupes set before, but has first tag, so change state
46+
// from `undefined` to `false` so can detect next time
47+
state.hasDuplicates[tagName] = false;
48+
state.hasNonCommentBeforeTag[tagName] = state.hasNonComment &&
49+
state.hasNonComment < jsdocNode.start;
50+
}
51+
}
1852
}, {
1953
exit ({state, utils}) {
20-
if (state.hasFileOverview && !state.hasDuplicate &&
21-
!state.hasNonCommentBeforeFileOverview
22-
) {
23-
return;
24-
}
25-
const obj = utils.getPreferredTagNameObject({tagName: 'file'});
26-
if (obj && obj.blocked) {
27-
utils.reportSettings(
28-
`\`settings.jsdoc.tagNamePreference\` cannot block @${obj.tagName} ` +
29-
'for the `require-file-overview` rule',
30-
);
31-
} else {
32-
const targetTagName = obj && obj.replacement || obj;
33-
if (state.hasDuplicate) {
34-
utils.reportSettings(
35-
`Duplicate @${targetTagName}`,
36-
);
37-
} else if (state.hasFileOverview &&
38-
state.hasNonCommentBeforeFileOverview
39-
) {
54+
setDefaults(state);
55+
const tags = defaultTags;
56+
57+
for (const [tagName, {
58+
mustExist,
59+
preventDuplicates,
60+
initialCommentsOnly,
61+
}] of entries(tags)) {
62+
const obj = utils.getPreferredTagNameObject({tagName});
63+
if (obj && obj.blocked) {
4064
utils.reportSettings(
41-
`@${targetTagName} should be at the beginning of the file`,
65+
`\`settings.jsdoc.tagNamePreference\` cannot block @${obj.tagName} ` +
66+
'for the `require-file-overview` rule',
4267
);
4368
} else {
44-
utils.reportSettings(`Missing @${targetTagName}`);
69+
const targetTagName = obj && obj.replacement || obj;
70+
if (mustExist && !state.hasTag[tagName]) {
71+
utils.reportSettings(`Missing @${targetTagName}`);
72+
}
73+
if (preventDuplicates && state.hasDuplicates[tagName]) {
74+
utils.reportSettings(
75+
`Duplicate @${targetTagName}`,
76+
);
77+
}
78+
if (initialCommentsOnly &&
79+
state.hasNonCommentBeforeTag[tagName]
80+
) {
81+
utils.reportSettings(
82+
`@${targetTagName} should be at the beginning of the file`,
83+
);
84+
}
4585
}
4686
}
4787
},
@@ -50,7 +90,9 @@ export default iterateJsdoc(({
5090
fixable: 'code',
5191
type: 'suggestion',
5292
},
53-
nonComment ({state}) {
54-
state.hasNonCommentBeforeFileOverview = !state.hasFileOverview;
93+
nonComment ({state, node}) {
94+
if (!state.hasNonComment) {
95+
state.hasNonComment = node.start;
96+
}
5597
},
5698
});

0 commit comments

Comments
 (0)