diff --git a/rules/prefer-at.js b/rules/prefer-at.js index 033d6214be..2ad31949dd 100644 --- a/rules/prefer-at.js +++ b/rules/prefer-at.js @@ -179,6 +179,25 @@ function create(context) { yield removeLengthNode(lengthNode, fixer, sourceCode); } + // Only remove space for `foo[foo.length - 1]` + if ( + indexNode.type === 'BinaryExpression' + && indexNode.operator === '-' + && indexNode.left === lengthNode + && indexNode.right.type === 'Literal' + && /^\d+$/.test(indexNode.right.raw) + ) { + const numberNode = indexNode.right; + const tokenBefore = sourceCode.getTokenBefore(numberNode); + if ( + tokenBefore.type === 'Punctuator' + && tokenBefore.value === '-' + && /^\s+$/.test(sourceCode.text.slice(tokenBefore.range[1], numberNode.range[0])) + ) { + yield fixer.removeRange([tokenBefore.range[1], numberNode.range[0]]); + } + } + const openingBracketToken = sourceCode.getTokenBefore(indexNode, isOpeningBracketToken); yield fixer.replaceText(openingBracketToken, '.at('); diff --git a/test/prefer-at.mjs b/test/prefer-at.mjs index e3c5aeec9f..bdb67c54e2 100644 --- a/test/prefer-at.mjs +++ b/test/prefer-at.mjs @@ -21,6 +21,10 @@ test.snapshot({ ], invalid: [ 'array[array.length - 1];', + 'array[array.length -1];', + 'array[array.length - /* comment */ 1];', + 'array[array.length - 1.];', + 'array[array.length - 0b1];', 'array[array.length - 9];', 'array[0][array[0].length - 1];', 'array[(( array.length )) - 1];', diff --git a/test/snapshots/prefer-at.mjs.md b/test/snapshots/prefer-at.mjs.md index f3874a079c..9e911d93b5 100644 --- a/test/snapshots/prefer-at.mjs.md +++ b/test/snapshots/prefer-at.mjs.md @@ -10,7 +10,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | array.at(- 1);␊ + 1 | array.at(-1);␊ ` > Error 1/1 @@ -21,12 +21,76 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #2 + 1 | array[array.length -1]; + +> Output + + `␊ + 1 | array.at(-1);␊ + ` + +> Error 1/1 + + `␊ + > 1 | array[array.length -1];␊ + | ^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + +## Invalid #3 + 1 | array[array.length - /* comment */ 1]; + +> Output + + `␊ + 1 | array.at(- /* comment */ 1);␊ + ` + +> Error 1/1 + + `␊ + > 1 | array[array.length - /* comment */ 1];␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + +## Invalid #4 + 1 | array[array.length - 1.]; + +> Output + + `␊ + 1 | array.at(- 1.);␊ + ` + +> Error 1/1 + + `␊ + > 1 | array[array.length - 1.];␊ + | ^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + +## Invalid #5 + 1 | array[array.length - 0b1]; + +> Output + + `␊ + 1 | array.at(- 0b1);␊ + ` + +> Error 1/1 + + `␊ + > 1 | array[array.length - 0b1];␊ + | ^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + +## Invalid #6 1 | array[array.length - 9]; > Output `␊ - 1 | array.at(- 9);␊ + 1 | array.at(-9);␊ ` > Error 1/1 @@ -36,13 +100,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #3 +## Invalid #7 1 | array[0][array[0].length - 1]; > Output `␊ - 1 | array[0].at(- 1);␊ + 1 | array[0].at(-1);␊ ` > Error 1/1 @@ -52,13 +116,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #4 +## Invalid #8 1 | array[(( array.length )) - 1]; > Output `␊ - 1 | array.at(- 1);␊ + 1 | array.at(-1);␊ ` > Error 1/1 @@ -68,7 +132,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #5 +## Invalid #9 1 | array[array.length - (( 1 ))]; > Output @@ -84,13 +148,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #6 +## Invalid #10 1 | array[(( array.length - 1 ))]; > Output `␊ - 1 | array.at((( - 1 )));␊ + 1 | array.at((( -1 )));␊ ` > Error 1/1 @@ -100,13 +164,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #7 +## Invalid #11 1 | (( array ))[array.length - 1]; > Output `␊ - 1 | (( array )).at(- 1);␊ + 1 | (( array )).at(-1);␊ ` > Error 1/1 @@ -116,13 +180,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #8 +## Invalid #12 1 | (( array[array.length - 1] )); > Output `␊ - 1 | (( array.at(- 1) ));␊ + 1 | (( array.at(-1) ));␊ ` > Error 1/1 @@ -132,13 +196,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #9 +## Invalid #13 1 | array[array.length - 1].pop().shift()[0]; > Output `␊ - 1 | array.at(- 1).pop().shift()[0];␊ + 1 | array.at(-1).pop().shift()[0];␊ ` > Error 1/1 @@ -148,13 +212,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #10 +## Invalid #14 1 | a = array[array.length - 1] > Output `␊ - 1 | a = array.at(- 1)␊ + 1 | a = array.at(-1)␊ ` > Error 1/1 @@ -164,13 +228,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #11 +## Invalid #15 1 | const a = array[array.length - 1] > Output `␊ - 1 | const a = array.at(- 1)␊ + 1 | const a = array.at(-1)␊ ` > Error 1/1 @@ -180,13 +244,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #12 +## Invalid #16 1 | const {a = array[array.length - 1]} = {} > Output `␊ - 1 | const {a = array.at(- 1)} = {}␊ + 1 | const {a = array.at(-1)} = {}␊ ` > Error 1/1 @@ -196,13 +260,13 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #13 +## Invalid #17 1 | typeof array[array.length - 1] > Output `␊ - 1 | typeof array.at(- 1)␊ + 1 | typeof array.at(-1)␊ ` > Error 1/1 @@ -212,7 +276,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` -## Invalid #14 +## Invalid #18 1 | function foo() {return arguments[arguments.length - 1]} > Error 1/1 @@ -1108,7 +1172,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | array.at(- 1)␊ + 1 | array.at(-1)␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-at.mjs.snap b/test/snapshots/prefer-at.mjs.snap index e983257b6c..cfcec10ed5 100644 Binary files a/test/snapshots/prefer-at.mjs.snap and b/test/snapshots/prefer-at.mjs.snap differ