From 1c457bb7984fec31179548015e800432bb800e31 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 19 Sep 2022 12:40:54 +0800 Subject: [PATCH] `prefer-at`: Improve fix (#1901) --- rules/prefer-at.js | 19 +++++ test/prefer-at.mjs | 4 ++ test/snapshots/prefer-at.mjs.md | 114 +++++++++++++++++++++++------- test/snapshots/prefer-at.mjs.snap | Bin 3865 -> 4029 bytes 4 files changed, 112 insertions(+), 25 deletions(-) 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 e983257b6c0c2de6af869beea0f4cf846ab0f189..cfcec10ed51262ef53539724d9a6138243ccc377 100644 GIT binary patch literal 4029 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 literal 3865 zcmV+!59aVeRzV^Lqd}vptbI}R9}VKSJ&6p zm4eoVq83GM)w*v*MBJ)WvDSU9b$xekZb&AXAy5+ip!xg_`EzFG%(>^DbMBd&OG`ph1uDh@AfN+32C;{qj--}UCR zux>~8%{X~#<+QQ_0 z8h>-}PSLK%3kk$VVw{3#@<5TQ*y`p=UiObF4Bfq!gV?f0066z>joPwt!=k6f8NYrJ zda@aT*jE@+?4iW0F}c}WNAZLYzif5->Z0=mV%K8$z5{@3LBfJ{yH>t%zY*={kkD@w z2eEMu0Jvw|D>{94W&U~f?h5Vq3mOrKor}S341j0jj1>=1tYM^%aFA5QyE55$Oo^AMTdEYaoxCJ?CpIEeLh20%Lea#-&6^5S`d4Pvl9NJb!b5Jovf z!rA^O{k8-ilHZ!Qzw*KVQaOli=>kCF^#Z$}odQ#PuDH0^zW>fE1Y!d)HbIQP@MvsO zXBX{~;7==C9$)W8AoeVV#1#O=x<%6uPjAovalz}ax6EJAnuFMtZ2?GIer;zVH|qYv zjmhKo??@97h&_rC?FPVv=F5BZIDOk^-}t6R}eFep)M9!3{0C@~{CyWjDle>;mWx0I&J(+R|iF@A%{UYq^M zfB)`N3B<6!x4+vhi9l?-4mzxX$dRY?dNMl9Jvh-Vl;64NQv$KSVW>I+u;`9vaB!mi z&_*-dnt3~w7ug{;591g{gf{?R9uM)U-1z9E+vZckjJ!Ql3B+nJ01tqrZCt(Q{qb4m ziNki4XQPKl5r_@JknrJrj~zC;Ft_0TFG1IL9C!9gBM>_e7vMx+k_>vpeb?%;pPk>lE@L^?5L zCV|*=jK>hUAw%1@{%j{V(M#lseI3B(G0bqMqW;5(lOV_bW!3vDA5gzxyNtdu}( z9L7~jqQHl^@o+z1S?bWyBX)jMJH&bjbO^^-0g>N+U(y}NjB5w@?!CQA9yxFjThXl!_j~*FsAG1e1n1fiAKLC3p3oHHQ$!Vzxv$#w4`x#z2ctbxH9WmgV)+MIJwbcY-12MKjywWN{%Fm1%^It*w zo^$&?59J_M)dv7O;D9POjy-5j_;R>CNfG%8$>UM~Bx?I+9#J%uVkqDc}cBpNLbN%OH{9~xdX#o(E+UUA09>h#sB$V8bIX-u(tg-x_;YcRR7 zg64MC7(A3_MiDe(43i65+m3EbnvzVarkSWJ*2ybm%0z7v36Ejdm(9{fs>g}p2gAvd zl?k$p7!zfQzW|fV1^JTtIV`rm*S)RTY8Z_m6UTPZOOT=TF=KYEDlzi`GmCH594&*M z=;Fc{y_zO|m0>)lP)uAUZ=|V3zpATib>OhL7Ej_!s$~*|BGZ?Q)&C(?rKCa$iB^{2 zOKN0Nl`?@(hW3O9C#F%J^zU#)D?~Xc3r%I~C`Y`o6gYH=pT}?bgXWJVpwB|x%G04>zw(`4}b$=n$Fp)E~^NND1eeNA!zeLUFIMtYJGbajhP zArhEgG?ghPP-3xX3ZzLAb(oe1rwu0XaKNeKM+!3{A{dt=jET^6 zw4>1p+nbCzX7P2+9pG(-FKhxdNASJVjOWR0Ji6uJp(>H67G`TG2GiZOl_oFY&!I&l zm0YfYK{=ER2%#Gvf8hh8FIzlf8-m&z{%u;C%?c8_1!&ffHMTxXX+vN(>!%A85ot;( zbxCRj#9W-dZ%iOVsX4g9m6Gwhr!2wHY_lAQQ`iD=cbi9HS1v<8DTtcAbh$|^?IfL+M$d3;-B#*S zwG2_E$OIi27yjjM4>#pE0|*|#x)^@*k+Rh5d0Pn&Pu5LW*ruj=U=bK7rXO&;PIJ;Afp z<2zrbb|thSuPWvkY)hYw(-_zAXy**;32Yg@>X28=BcE9TJifZ($h1Xg&3ed#<|r06 zolK!+x!PxR7b~2b1 zK-KPKFx@9*)!AgWF7jhp#xd4tdRbeqi|R7zpE9q|^?QV>o9gv*tzLC!)y`_eJ|GLT zni4e5!ZzAJZLOs1Z0gVf49m8`wD}fbzCinjOEJUxz4{Dem}50cGz}`l9_4w_tj++;Z1W`WeKA;!9JN~0-Vl{{&yOv_ti-&PIPNbliraiMqbc!|3D>Zxvy z{5Cz8x=V@q9a_tp515lv0Q-iUdS^ky+-HcyM2_A7a=c}RvN$XqC#hxHG__K{X4P-O z*6>-kMH+jW6<4yB3(REZ=9;aat68B;r&2o#kv1>W>o7$snWqTb^r)Xx!_=oNH`ik6 zdzlz|YF6Bj;!@Lva}5ic22#pcb3-P}gGAHzmcgX;)6vcRxF*ZvjA|<;w3ph_BH0Q> zQysRub;oh`&1|%=&?A=8BZooSR?Xl#%!*qqkJkkOtkqHdoEPYhs{IWo`=iec^A)?L z9uo5;snc)m?z8n1+QzNz_RtYnoa(?({K$Y8|^GS9*~uWErO buKJ7ii#Q9u$QsiANm%8~mJxl-qY{-7j