Skip to content

Commit 0503b4a

Browse files
committed
fix(check-param-names): provide fixer duplicate param names (remove extra); partial fix for #47
1 parent 2ea3b36 commit 0503b4a

File tree

3 files changed

+43
-10
lines changed

3 files changed

+43
-10
lines changed

src/iterateJsdoc.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
// eslint-disable-next-line import/no-named-default
2+
import {default as commentParser, stringify as commentStringify} from 'comment-parser';
13
import _ from 'lodash';
2-
import commentParser from 'comment-parser';
34
import jsdocUtils from './jsdocUtils';
45
import getJSDocComment from './eslint/getJSDocComment';
56

@@ -77,6 +78,23 @@ const getUtils = (
7778

7879
const utils = {};
7980

81+
utils.stringify = (tagBlock) => {
82+
let indent = sourceCode.text.match(/^\n*([ \t]+)/);
83+
/* istanbul ignore next */
84+
indent = indent ? indent[1] + indent[1].charAt() : ' ';
85+
86+
return commentStringify([tagBlock], {indent}).slice(indent.length - 1);
87+
};
88+
89+
utils.reportJSDoc = (msg, tag, handler) => {
90+
report(msg, (fixer) => {
91+
handler();
92+
const replacement = utils.stringify(jsdoc);
93+
94+
return fixer.replaceText(jsdocNode, replacement);
95+
}, tag);
96+
};
97+
8098
utils.getFunctionParameterNames = () => {
8199
return jsdocUtils.getFunctionParameterNames(node);
82100
};

src/rules/checkParamNames.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
import iterateJsdoc from '../iterateJsdoc';
22

3-
const validateParameterNames = (targetTagName : string, functionParameterNames : Array<string>, jsdoc, report) => {
3+
const validateParameterNames = (targetTagName : string, functionParameterNames : Array<string>, jsdoc, jsdocNode, utils, report) => {
44
if (!jsdoc || !jsdoc.tags) {
55
return false;
66
}
77

8-
const paramTags = jsdoc.tags.filter((tag) => {
8+
const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
99
return tag.tag === targetTagName && !tag.name.includes('.');
1010
});
1111

12-
return paramTags.some((tag, index) => {
13-
const dupeTag = paramTags.find((tg, idx) => {
12+
return paramTags.some(([, tag], index) => {
13+
let tagsIndex;
14+
const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {
15+
tagsIndex = tgsIndex;
16+
1417
return tg.name === tag.name && idx !== index;
1518
});
16-
if (dupeTag) {
17-
report(`Duplicate @${targetTagName} "${tag.name}"`, null, dupeTag);
19+
if (dupeTagInfo) {
20+
utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], () => {
21+
jsdoc.tags.splice(tagsIndex, 1);
22+
});
1823

1924
return true;
2025
}
@@ -36,7 +41,7 @@ const validateParameterNames = (targetTagName : string, functionParameterNames :
3641

3742
if (functionParameterName !== tag.name) {
3843
const expectedNames = functionParameterNames.join(', ');
39-
const actualNames = paramTags.map(({name}) => {
44+
const actualNames = paramTags.map(([, {name}]) => {
4045
return name;
4146
}).join(', ');
4247

@@ -92,6 +97,7 @@ const validateParameterNamesDeep = (targetTagName : string, jsdocParameterNames
9297

9398
export default iterateJsdoc(({
9499
jsdoc,
100+
jsdocNode,
95101
report,
96102
utils
97103
}) => {
@@ -101,7 +107,7 @@ export default iterateJsdoc(({
101107
return;
102108
}
103109
const targetTagName = utils.getPreferredTagName({tagName: 'param'});
104-
const isError = validateParameterNames(targetTagName, functionParameterNames, jsdoc, report);
110+
const isError = validateParameterNames(targetTagName, functionParameterNames, jsdoc, jsdocNode, utils, report);
105111

106112
if (isError) {
107113
return;
@@ -110,6 +116,7 @@ export default iterateJsdoc(({
110116
validateParameterNamesDeep(targetTagName, jsdocParameterNamesDeep, jsdoc, report);
111117
}, {
112118
meta: {
119+
fixable: 'code',
113120
type: 'suggestion'
114121
}
115122
});

test/rules/assertions/checkParamNames.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,15 @@ export default {
144144
line: 4,
145145
message: 'Duplicate @param "foo"'
146146
}
147-
]
147+
],
148+
output: `
149+
/**
150+
* @param foo
151+
*/
152+
function quux (foo) {
153+
154+
}
155+
`
148156
},
149157
{
150158
code: `

0 commit comments

Comments
 (0)