Skip to content

Commit a87ed9e

Browse files
committed
fix(require-jsdoc): add fixer to add empty jsdoc block
1 parent fda4186 commit a87ed9e

File tree

5 files changed

+93
-22
lines changed

5 files changed

+93
-22
lines changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4769,8 +4769,8 @@ function myFunction() {
47694769
/**
47704770
* @func myFunction
47714771
*/
4772-
4773-
4772+
4773+
47744774
function myFunction() {
47754775

47764776
}
@@ -4839,6 +4839,13 @@ function quux (foo) {
48394839
// Options: [{"exemptEmptyFunctions":true}]
48404840
// Message: Missing JSDoc comment.
48414841

4842+
function quux (foo) {
4843+
4844+
}
4845+
// Settings: {"jsdoc":{"minLines":2}}
4846+
// Options: [{"exemptEmptyFunctions":true}]
4847+
// Message: Missing JSDoc comment.
4848+
48424849
function myFunction() {}
48434850
// Message: Missing JSDoc comment.
48444851

@@ -5231,10 +5238,10 @@ function myFunction() {
52315238
}
52325239
// Settings: {"jsdoc":{"maxLines":0,"minLines":0}}
52335240

5234-
/**
5241+
/**
52355242
* @func myFunction
52365243
*/
5237-
5244+
52385245
function myFunction() {
52395246

52405247
}

src/iterateJsdoc.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ const getUtils = (
8181
const utils = {};
8282

8383
utils.stringify = (tagBlock) => {
84-
let indent = sourceCode.text.match(/^\n*([ \t]+)/);
85-
/* istanbul ignore next */
86-
indent = indent ? indent[1] + indent[1].charAt() : ' ';
84+
const indent = jsdocUtils.getIndent(sourceCode);
8785

8886
return commentStringify([tagBlock], {indent}).slice(indent.length - 1);
8987
};

src/jsdocUtils.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,12 +570,21 @@ const getAncestor = (sourceCode, nde, depth, idx = 0) => {
570570
return null;
571571
};
572572

573+
const getIndent = (sourceCode) => {
574+
let indent = sourceCode.text.match(/^\n*([ \t]+)/);
575+
/* istanbul ignore next */
576+
indent = indent ? indent[1] + indent[1].charAt() : ' ';
577+
578+
return indent;
579+
};
580+
573581
export default {
574582
enforcedContexts,
575583
filterTags,
576584
getAncestor,
577585
getContextObject,
578586
getFunctionParameterNames,
587+
getIndent,
579588
getJsdocParameterNames,
580589
getJsdocParameterNamesDeep,
581590
getPreferredTagName,

src/rules/requireJsdoc.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ export default {
125125
url: 'https://github.com/gajus/eslint-plugin-jsdoc'
126126
},
127127

128+
fixable: 'code',
129+
128130
messages: {
129131
missingJsDoc: 'Missing JSDoc comment.'
130132
},
@@ -158,6 +160,18 @@ export default {
158160
}
159161
}
160162

163+
const fix = (fixer) => {
164+
// Default to one line break if the `minLines`/`maxLines` settings allow
165+
const lines = settings.minLines === 0 && settings.maxLines >= 1 ? 1 : settings.minLines;
166+
const indent = jsdocUtils.getIndent(sourceCode);
167+
const insertion = `/**\n${indent}*\n${indent}*/${'\n'.repeat(lines)}${indent.slice(0, -1)}`;
168+
const baseNode = [
169+
'ExportDefaultDeclaration', 'ExportNamedDeclaration'
170+
].includes(node.parent && node.parent.type) ? node.parent : node;
171+
172+
return fixer.insertTextBefore(baseNode, insertion);
173+
};
174+
161175
if (publicOnly) {
162176
const opt = {
163177
ancestorsOnly: Boolean(_.get(publicOnly, 'ancestorsOnly', false)),
@@ -170,12 +184,14 @@ export default {
170184

171185
if (exported && !jsDocNode) {
172186
context.report({
187+
fix,
173188
messageId: 'missingJsDoc',
174189
node
175190
});
176191
}
177192
} else {
178193
context.report({
194+
fix,
179195
messageId: 'missingJsDoc',
180196
node
181197
});

test/rules/assertions/requireJsdoc.js

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default {
1010
* @func myFunction
1111
*/
1212
function myFunction() {
13-
13+
1414
}
1515
`,
1616
errors: [
@@ -30,10 +30,10 @@ export default {
3030
/**
3131
* @func myFunction
3232
*/
33-
34-
33+
34+
3535
function myFunction() {
36-
36+
3737
}
3838
`,
3939
errors: [
@@ -50,7 +50,7 @@ export default {
5050
{
5151
code: `
5252
/** @func myFunction */ function myFunction() {
53-
53+
5454
}
5555
`,
5656
errors: [
@@ -245,6 +245,12 @@ export default {
245245
ClassDeclaration: true
246246
}
247247
}],
248+
output: `
249+
/**
250+
*
251+
*/
252+
export default class {}
253+
`,
248254
parserOptions: {
249255
sourceType: 'module'
250256
}
@@ -288,7 +294,42 @@ export default {
288294
],
289295
options: [
290296
{exemptEmptyFunctions: true}
291-
]
297+
],
298+
output: `
299+
/**
300+
*
301+
*/
302+
function quux (foo) {
303+
304+
}`
305+
},
306+
{
307+
code: `
308+
function quux (foo) {
309+
310+
}`,
311+
errors: [
312+
{
313+
line: 2,
314+
message: 'Missing JSDoc comment.'
315+
}
316+
],
317+
options: [
318+
{exemptEmptyFunctions: true}
319+
],
320+
output: `
321+
/**
322+
*
323+
*/
324+
325+
function quux (foo) {
326+
327+
}`,
328+
settings: {
329+
jsdoc: {
330+
minLines: 2
331+
}
332+
}
292333
},
293334
{
294335
code: 'function myFunction() {}',
@@ -1195,9 +1236,9 @@ export default {
11951236
/**
11961237
* @func myFunction
11971238
*/
1198-
1239+
11991240
function myFunction() {
1200-
1241+
12011242
}
12021243
`,
12031244
settings: {
@@ -1212,10 +1253,10 @@ export default {
12121253
/**
12131254
* @func myFunction
12141255
*/
1215-
1216-
1256+
1257+
12171258
function myFunction() {
1218-
1259+
12191260
}
12201261
`,
12211262
settings: {
@@ -1228,7 +1269,7 @@ export default {
12281269
{
12291270
code: `
12301271
/** @func myFunction */ function myFunction() {
1231-
1272+
12321273
}
12331274
`,
12341275
settings: {
@@ -1240,12 +1281,12 @@ export default {
12401281
},
12411282
{
12421283
code: `
1243-
/**
1284+
/**
12441285
* @func myFunction
12451286
*/
1246-
1287+
12471288
function myFunction() {
1248-
1289+
12491290
}
12501291
`,
12511292
settings: {

0 commit comments

Comments
 (0)