in packages/flow-dev-tools/src/comment/add-commentsRunner.js [69:134]
async function addComments(args: Args, errors: Array<FlowError>) {
const seen = new Set();
let filenameToLineToLocsMap: Map<
string,
Map<number, Suppression>,
> = new Map();
// Filter out errors without a main location
let errorCount = 0;
for (const error of errors) {
const loc = mainSourceLocOfError(error);
const error_codes = error.error_codes;
if (loc != null && loc.source != null) {
const source = loc.source;
const lineToLocsMap = filenameToLineToLocsMap.get(source) || new Map();
const isError = error.kind !== 'lint';
let lints = new Set();
if (error.kind === 'lint') {
// \u0060 is `. using the escape to avoid a syntax highlighting bug in vscode-language-babel
const match = /\(\u0060([^\u0060]+)\u0060\)$/.exec(
error.message[0].descr,
);
if (match) {
lints.add(match[1]);
}
}
function joinSuppression(
prevValue: ?Suppression,
newValue: Suppression,
): Suppression {
if (!prevValue) {
return newValue;
}
return {
loc: newValue.loc,
isError: newValue.isError || prevValue.isError,
lints: new Set([...newValue.lints, ...prevValue.lints]),
error_codes: [...newValue.error_codes, ...prevValue.error_codes],
};
}
const prevValue: ?Suppression = lineToLocsMap.get(loc.start.line);
const value = joinSuppression(prevValue, {
loc,
isError,
lints,
error_codes,
});
lineToLocsMap.set(loc.start.line, value);
filenameToLineToLocsMap.set(source, lineToLocsMap);
errorCount++;
}
}
const promises = [];
for (const [source, lineToLocsMap] of filenameToLineToLocsMap.entries()) {
promises.push(
addCommentsToSource(args, source, Array.from(lineToLocsMap.values())),
);
}
const counts = await Promise.all(promises);
const commentCount = counts.reduce((c1, c2) => c1 + c2, 0);
console.log(
'Added %d comments to suppress %d errors',
commentCount,
errorCount,
);
}