From 69b4661af617bf3e51a6e274914c50126d760a0f Mon Sep 17 00:00:00 2001 From: Sergei Lutov Date: Thu, 30 Oct 2025 13:38:51 +0100 Subject: [PATCH 1/3] fix: add range offset for insertion suggestion --- eslint-plugin-prettier.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/eslint-plugin-prettier.js b/eslint-plugin-prettier.js index 0ef19af9..e09227ae 100644 --- a/eslint-plugin-prettier.js +++ b/eslint-plugin-prettier.js @@ -103,22 +103,28 @@ function getLocFromIndex(sourceCode, index) { */ function reportDifference(context, difference) { const { operation, offset, deleteText = '', insertText = '' } = difference; + // Provided that new characters need to be added, we create a fake one + // indent so that the editor can suggest corrections within + // the specified range. + const insertSuggestionOffset = Math.min(insertText.length, 1); /** @type {AST.Range} */ const range = [offset, offset + deleteText.length]; + const [start, end] = range; // `context.getSourceCode()` was deprecated in ESLint v8.40.0 and replaced // with the `sourceCode` property. // TODO: Only use property when our eslint peerDependency is >=8.40.0. const sourceCode = context.sourceCode ?? context.getSourceCode(); - const [start, end] = range.map(index => getLocFromIndex(sourceCode, index)); - context.report({ messageId: operation, data: { deleteText: showInvisibles(deleteText), insertText: showInvisibles(insertText), }, - loc: { start, end }, + loc: { + start: getLocFromIndex(sourceCode, start), + end: getLocFromIndex(sourceCode, end + insertSuggestionOffset), + }, fix: fixer => fixer.replaceTextRange(range, insertText), }); } From 4c93d1b64093feedcdc97ea0fbf99d7e06b1284c Mon Sep 17 00:00:00 2001 From: Sergei Lutov Date: Thu, 30 Oct 2025 14:31:37 +0100 Subject: [PATCH 2/3] fix: refactor diff function --- eslint-plugin-prettier.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/eslint-plugin-prettier.js b/eslint-plugin-prettier.js index e09227ae..df3d20f1 100644 --- a/eslint-plugin-prettier.js +++ b/eslint-plugin-prettier.js @@ -103,13 +103,13 @@ function getLocFromIndex(sourceCode, index) { */ function reportDifference(context, difference) { const { operation, offset, deleteText = '', insertText = '' } = difference; - // Provided that new characters need to be added, we create a fake one - // indent so that the editor can suggest corrections within - // the specified range. - const insertSuggestionOffset = Math.min(insertText.length, 1); /** @type {AST.Range} */ - const range = [offset, offset + deleteText.length]; - const [start, end] = range; + const [highlightStart, highlightEnd] = [ + offset, + offset + deleteText.length + Math.min(insertText.length, 1), + ]; + /** @type {AST.Range} */ + const replaceRange = [offset, offset + deleteText.length]; // `context.getSourceCode()` was deprecated in ESLint v8.40.0 and replaced // with the `sourceCode` property. // TODO: Only use property when our eslint peerDependency is >=8.40.0. @@ -122,10 +122,10 @@ function reportDifference(context, difference) { insertText: showInvisibles(insertText), }, loc: { - start: getLocFromIndex(sourceCode, start), - end: getLocFromIndex(sourceCode, end + insertSuggestionOffset), + start: getLocFromIndex(sourceCode, highlightStart), + end: getLocFromIndex(sourceCode, highlightEnd), }, - fix: fixer => fixer.replaceTextRange(range, insertText), + fix: fixer => fixer.replaceTextRange(replaceRange, insertText), }); } From 9ec8fa34e7faac9b4f1122b8f4eaa701bcb7b915 Mon Sep 17 00:00:00 2001 From: Sergei Lutov Date: Thu, 30 Oct 2025 14:35:48 +0100 Subject: [PATCH 3/3] fix: refactor diff function --- eslint-plugin-prettier.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint-plugin-prettier.js b/eslint-plugin-prettier.js index df3d20f1..e2ba2104 100644 --- a/eslint-plugin-prettier.js +++ b/eslint-plugin-prettier.js @@ -106,7 +106,7 @@ function reportDifference(context, difference) { /** @type {AST.Range} */ const [highlightStart, highlightEnd] = [ offset, - offset + deleteText.length + Math.min(insertText.length, 1), + offset + (deleteText.length || Math.min(insertText.length, 1)), ]; /** @type {AST.Range} */ const replaceRange = [offset, offset + deleteText.length];