diff --git a/eslint-plugin-prettier.js b/eslint-plugin-prettier.js index fd7e453c..5916b5cd 100644 --- a/eslint-plugin-prettier.js +++ b/eslint-plugin-prettier.js @@ -32,71 +32,26 @@ let prettier; // ------------------------------------------------------------------------------ /** - * Reports an "Insert ..." issue where text must be inserted. - * @param {RuleContext} context - The ESLint rule context. - * @param {number} offset - The source offset where to insert text. - * @param {string} text - The text to be inserted. + * Reports a difference. + * @param {import('eslint').Rule.RuleContext} context - The ESLint rule context. + * @param {import('prettier-linter-helpers').Difference} difference - The difference object. * @returns {void} */ -function reportInsert(context, offset, text) { - const pos = context.getSourceCode().getLocFromIndex(offset); - const range = [offset, offset]; - context.report({ - message: 'Insert `{{ code }}`', - data: { code: showInvisibles(text) }, - loc: { start: pos, end: pos }, - fix(fixer) { - return fixer.insertTextAfterRange(range, text); - } - }); -} - -/** - * Reports a "Delete ..." issue where text must be deleted. - * @param {RuleContext} context - The ESLint rule context. - * @param {number} offset - The source offset where to delete text. - * @param {string} text - The text to be deleted. - * @returns {void} - */ -function reportDelete(context, offset, text) { - const start = context.getSourceCode().getLocFromIndex(offset); - const end = context.getSourceCode().getLocFromIndex(offset + text.length); - const range = [offset, offset + text.length]; - context.report({ - message: 'Delete `{{ code }}`', - data: { code: showInvisibles(text) }, - loc: { start, end }, - fix(fixer) { - return fixer.removeRange(range); - } - }); -} - -/** - * Reports a "Replace ... with ..." issue where text must be replaced. - * @param {RuleContext} context - The ESLint rule context. - * @param {number} offset - The source offset where to replace deleted text - with inserted text. - * @param {string} deleteText - The text to be deleted. - * @param {string} insertText - The text to be inserted. - * @returns {void} - */ -function reportReplace(context, offset, deleteText, insertText) { - const start = context.getSourceCode().getLocFromIndex(offset); - const end = context - .getSourceCode() - .getLocFromIndex(offset + deleteText.length); +function reportDifference(context, difference) { + const { operation, offset, deleteText = '', insertText = '' } = difference; const range = [offset, offset + deleteText.length]; + const [start, end] = range.map(index => + context.getSourceCode().getLocFromIndex(index) + ); + context.report({ - message: 'Replace `{{ deleteCode }}` with `{{ insertCode }}`', + messageId: operation, data: { - deleteCode: showInvisibles(deleteText), - insertCode: showInvisibles(insertText) + deleteText: showInvisibles(deleteText), + insertText: showInvisibles(insertText) }, loc: { start, end }, - fix(fixer) { - return fixer.replaceTextRange(range, insertText); - } + fix: fixer => fixer.replaceTextRange(range, insertText) }); } @@ -143,7 +98,12 @@ module.exports = { }, additionalProperties: true } - ] + ], + messages: { + [INSERT]: 'Insert `{{ insertText }}`', + [DELETE]: 'Delete `{{ deleteText }}`', + [REPLACE]: 'Replace `{{ deleteText }}` with `{{ insertText }}`' + } }, create(context) { const usePrettierrc = @@ -263,32 +223,9 @@ module.exports = { if (source !== prettierSource) { const differences = generateDifferences(source, prettierSource); - differences.forEach(difference => { - switch (difference.operation) { - case INSERT: - reportInsert( - context, - difference.offset, - difference.insertText - ); - break; - case DELETE: - reportDelete( - context, - difference.offset, - difference.deleteText - ); - break; - case REPLACE: - reportReplace( - context, - difference.offset, - difference.deleteText, - difference.insertText - ); - break; - } - }); + for (const difference of differences) { + reportDifference(context, difference); + } } } };