Skip to content

Commit 5dfa6a2

Browse files
committed
Allow JSDoc for now
1 parent f1e06ed commit 5dfa6a2

File tree

1 file changed

+66
-36
lines changed

1 file changed

+66
-36
lines changed

scripts/eslint/rules/parameter-trivia.cjs

Lines changed: 66 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@ const { AST_NODE_TYPES, TSESTree, ESLintUtils } = require("@typescript-eslint/ut
22
const { createRule } = require("./utils.cjs");
33
const ts = require("typescript");
44

5+
const unset = Symbol();
6+
/**
7+
* @template T
8+
* @param {() => T} fn
9+
* @returns {() => T}
10+
*/
11+
function memoize(fn) {
12+
/** @type {T | unset} */
13+
let value = unset;
14+
return () => {
15+
if (value === unset) {
16+
value = fn();
17+
}
18+
return value;
19+
};
20+
}
21+
22+
523
module.exports = createRule({
624
name: "parameter-trivia",
725
meta: {
@@ -74,39 +92,58 @@ module.exports = createRule({
7492
return;
7593
}
7694

77-
const comments = sourceCode.getCommentsBefore(node);
78-
if (!comments || comments.length === 0) {
79-
// TODO(jakebailey): quick fix
80-
context.report({ messageId: "parameterTriviaArgumentError", node });
81-
return;
82-
}
95+
const getExpectedName = memoize(() => {
96+
const signature = getSignature();
97+
if (signature) {
98+
const expectedName = signature.parameters[i]?.escapedName;
99+
if (expectedName) {
100+
return ts.unescapeLeadingUnderscores(expectedName);
101+
}
102+
}
103+
return undefined;
104+
});
83105

106+
const comments = sourceCode.getCommentsBefore(node);
107+
/** @type {TSESTree.Comment | undefined} */
84108
const comment = comments[comments.length - 1];
85-
if (comment.type !== "Block") {
86-
// TODO(jakebailey): quick fix
87-
context.report({ messageId: "parameterTriviaArgumentError", node });
109+
110+
if (!comment || comment.type !== "Block") {
111+
const expectedName = getExpectedName();
112+
if (expectedName) {
113+
context.report({
114+
messageId: "parameterTriviaArgumentError",
115+
node,
116+
fix: (fixer) => {
117+
return fixer.insertTextBefore(node, `/*${expectedName}*/ `);
118+
}
119+
});
120+
}
121+
else {
122+
context.report({ messageId: "parameterTriviaArgumentError", node });
123+
}
88124
return;
89125
}
90126

91127
const argRangeStart = node.range[0];
92128
const commentRangeEnd = comment.range[1];
93-
const signature = getSignature();
94-
if (signature) {
95-
const expectedName = signature.parameters[i]?.escapedName;
96-
if (expectedName) {
97-
const got = comment.value.trim();
98-
const want = ts.unescapeLeadingUnderscores(expectedName);
99-
if (got !== want) {
100-
context.report({
101-
messageId: "parameterTriviaArgumentNameError",
102-
data: { got, want },
103-
node: comment,
104-
fix: (fixer) => {
105-
return fixer.replaceText(comment, `/*${expectedName}*/`);
106-
},
107-
});
108-
return;
109-
}
129+
const expectedName = getExpectedName();
130+
if (expectedName) {
131+
let got = comment.value.trim();
132+
if (got[0] === "*") {
133+
// Accept JSDoc style comments
134+
got = got.slice(1);
135+
}
136+
137+
if (got !== expectedName) {
138+
context.report({
139+
messageId: "parameterTriviaArgumentNameError",
140+
data: { got, want: expectedName },
141+
node: comment,
142+
fix: (fixer) => {
143+
return fixer.replaceText(comment, `/*${expectedName}*/`);
144+
},
145+
});
146+
return;
110147
}
111148
}
112149

@@ -131,22 +168,15 @@ module.exports = createRule({
131168
return;
132169
}
133170

134-
/** @type {ts.Signature | undefined} */
135-
let signature;
136-
const getSignature = () => {
137-
if (signature) {
138-
return signature;
139-
}
140-
171+
const getSignature = memoize(() => {
141172
if (context.parserServices?.hasFullTypeInformation) {
142173
const parserServices = ESLintUtils.getParserServices(context);
143174
const checker = parserServices.program.getTypeChecker();
144175
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
145-
return signature = checker.getResolvedSignature(tsNode);
176+
return checker.getResolvedSignature(tsNode);
146177
}
147-
148178
return undefined;
149-
};
179+
});
150180

151181
for (let i = 0; i < node.arguments.length; i++) {
152182
const arg = node.arguments[i];

0 commit comments

Comments
 (0)