From e4532452d69dbb5ceea9f8f9b5d23c719452cf97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Sun, 9 Oct 2022 13:16:13 +0200 Subject: [PATCH 1/6] `prefer-at`: Support private field. --- rules/utils/is-same-reference.js | 3 ++- test/prefer-at.mjs | 2 ++ test/snapshots/prefer-at.mjs.md | 16 ++++++++++++++++ test/snapshots/prefer-at.mjs.snap | Bin 4029 -> 4108 bytes 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/rules/utils/is-same-reference.js b/rules/utils/is-same-reference.js index 112c807912..310deafeb2 100644 --- a/rules/utils/is-same-reference.js +++ b/rules/utils/is-same-reference.js @@ -128,7 +128,8 @@ function isSameReference(left, right) { return true; } - case 'Identifier': { + case 'Identifier': + case 'PrivateIdentifier': { return left.name === right.name; } diff --git a/test/prefer-at.mjs b/test/prefer-at.mjs index bdb67c54e2..8c7af425e9 100644 --- a/test/prefer-at.mjs +++ b/test/prefer-at.mjs @@ -38,6 +38,8 @@ test.snapshot({ 'const {a = array[array.length - 1]} = {}', 'typeof array[array.length - 1]', 'function foo() {return arguments[arguments.length - 1]}', + 'class Foo {bar; baz() {return this.bar[this.bar.length - 1]}}', + 'class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}}', ], }); diff --git a/test/snapshots/prefer-at.mjs.md b/test/snapshots/prefer-at.mjs.md index 9e911d93b5..e7221f9e99 100644 --- a/test/snapshots/prefer-at.mjs.md +++ b/test/snapshots/prefer-at.mjs.md @@ -1397,3 +1397,19 @@ Generated by [AVA](https://avajs.dev). Suggestion 1/1: Use \`.at(…)\`.␊ 1 | foo.at(bar.length - 1)␊ ` + +## Invalid #19 + 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}} + +> Output + + `␊ + 1 | class Foo {bar; baz() {return this.bar.at(-1)}}␊ + ` + +> Error 1/1 + + `␊ + > 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}}␊ + | ^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` diff --git a/test/snapshots/prefer-at.mjs.snap b/test/snapshots/prefer-at.mjs.snap index cfcec10ed51262ef53539724d9a6138243ccc377..e3dfe68db3dd54271231ae93bf99f60487e69bd7 100644 GIT binary patch literal 4108 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 KMkK|IPyhhmgZg{` literal 4029 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 From 2a9e359ba55fde6eb3f64cb4b246f350a284df95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Sun, 9 Oct 2022 16:01:10 +0200 Subject: [PATCH 2/6] FIXUP! `prefer-at`: Support private field. --- rules/utils/is-same-reference.js | 5 ++++- test/snapshots/prefer-at.mjs.md | 16 ++++++++++++++++ test/snapshots/prefer-at.mjs.snap | Bin 4108 -> 4182 bytes 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/rules/utils/is-same-reference.js b/rules/utils/is-same-reference.js index 310deafeb2..b3ac200400 100644 --- a/rules/utils/is-same-reference.js +++ b/rules/utils/is-same-reference.js @@ -60,7 +60,10 @@ function getStaticPropertyName(node) { } if (property) { - if (property.type === 'Identifier' && !node.computed) { + if ( + (property.type === 'Identifier' || property.type === 'PrivateIdentifier') + && !node.computed + ) { return property.name; } diff --git a/test/snapshots/prefer-at.mjs.md b/test/snapshots/prefer-at.mjs.md index e7221f9e99..34c004cd63 100644 --- a/test/snapshots/prefer-at.mjs.md +++ b/test/snapshots/prefer-at.mjs.md @@ -1413,3 +1413,19 @@ Generated by [AVA](https://avajs.dev). > 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}}␊ | ^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` + +## Invalid #20 + 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}} + +> Output + + `␊ + 1 | class Foo {#bar; baz() {return this.#bar.at(-1)}}␊ + ` + +> Error 1/1 + + `␊ + > 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}}␊ + | ^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` diff --git a/test/snapshots/prefer-at.mjs.snap b/test/snapshots/prefer-at.mjs.snap index e3dfe68db3dd54271231ae93bf99f60487e69bd7..269bd260b41e3fc8b1f717aca3d218939db25603 100644 GIT binary patch literal 4182 zcmV-c5UKA$RzVK}^;00000000B! zTM1lKM;f0DqBdx~Q7FO_P!k~`QBV%SqNuG0imdAqBZiOw8WK!`g05#P9@TAS?N;lx zt5#j{SP!bzqOM1+TD4WNuxi)ZEv{Ep>Q#@r^ClCLm%Nw6Cea@@zy6E)XWqPd-+c33 zGw)+Q07C!_xHqfpt&0AN$3Yc^!S&Yj0R2foe;UT8XYSn}n|8OpHfVU%fYT7OGYJMj z)Z)Feemi(2*CJ+*(v_!_HHMhYC%8$sDD86nQF7Pghu-=6n^iNu-3~F^#K(m95ME15 z?ZrD(!CzavEwoqAOaa8~4uY6^05q!6AQn3+G(w>!XeK^TDj- zH51YZRv~oW*k{e7$H}WQLwgRaJbr5l#OxOYDQE^_j`S(6%J{_4R@y}to^bgl53@7; z0EnlwIn%@y!)5Z4Q9-|kwBTWOTO$Cvr^J8#a7R^QV@=H`hfnXD3o%capX`g-y}zy!hDwG5@A6dEet@n>J4S7-IGTK|ymQ zrVHh(joi|C$^HlMB*bjJmL^O`7Ya6z%I%bqy#Zo&HG!}d0Aqey^6rp_ zx_RYCZx-+QXZNl=6YCFvqWog-)+G_c|5lnj*8gdJ}$AhC|G@4K!gbf@a;Kna5^^2|ru#Y~{B33tI6od*ux@ zbIX>V9{=a!b~mT?+_CG=Q<5QO`9UVkM3~TQS@-T|Z$=zCcPrr7mR|QDX3Gi6+5#}G z$@OUdrq!w;g6M0Po|cY>n5`rj5)8mQBhO#l)UI#9$dy(9jYxkz1Y)+Bpjim|+u>)! z)*lWiCMX)kcKSB*HpFZ^!7hY(&CcxnCHH}L>BL5JuH72nkB8YB3fYELXXb3l*+2Ee zfS}7UrxvPxFe_?jLJq-Ag!!{1N6u8=Saf|SRW;)BKXeeYO+rn04`Ke3^7k`U6G!Fo zX2yMYM2GAY&2A=$3_~-vVag-L-V>BMaK!rH?|yy6!>lqK{j%r%Yh&l;9KWz!*5EHk zyFP}PolC%P55NaS>xOoFYiFt~YT4edyZ^NsVm6Xs2i@YG^o6}o4*aFH>{1J5zIr0W z>_q}a2ec~JF1#Ckc;7c!aPTj?UhA3zF}sqWV@Ci=)OkJb4@(Y?&kjlyM(v&oF{>cB zgYcKD^?bu8Ty6Amt0ghQMx#G~m<<$|upD90Plo>S*}enoy%W^5qkq+IAIw$~JR&d% z0rlf?^=>M4q|o?!3BhsHUDlO zaD7m@-{KA1FP!XMA7b_yL6Hc6HA!>BehnU?+&{GV+x_!%=HHiMs zj~CeUjB--myAZSE2(BWmPZ${1>hEXnmiXRkSw8p!KE!NzlnD_M0R9nCGd!@zy2LgT zamt>5eOm!B`v-zby2bVgc=hMQLTyEZ4j~!y8~b3kh17&tf`tgBVTW>l@+~2+lBJS3gy!%CKX9UUb z1wzdJfnaD10DG%f=kzGuEleMp=_}ta>(9gNeS`x!w}qp_%DQ~m{6_GuQDyxgW<$D~ zunOV8x$C2nKJ^=YF(5UqNPL9$R*1bqP}&WEgQ;cJ(dyiS{H$60CHptDg_u1-kP?gh zTJeSN=N3Gxe>81Yg+zU{7-BY$;10r~JB;wV1u+{LXF|JpB#Xi^ ztq&aJ(P>-rzh*+r zwoEpm6ye&GklC8d*N;5P?sc$a_>f*a%$D{9;QHgI=N1_>+M=4D+wLrG&aa!F(E&W9(Hss{0jg(L*5TgGj@G1296J`AwO@FAtdX-wGr^bjCM#1Ij zYlUMd-30XAn4_Z9xq5?vegkndzpurI^nbdHBOmFUZbT8H~9)EhUYT z##2KLDyy-H(PP+30sTfqKtCvcR%_Am;>a~hjly7{`sj4j@awIi|K>Ue7YQ-m#6ebIqZFJ;etrZP7lSwiq5{aDg5FSt@#?4#W4Nz(` zJS`cXMwg{9P0UzSC%Ohp`1S73V{hZF>gNJ_6#Xf#EU zREGHtkJwp`?O@GQe`lN##2UpfeQUTg)e7b+QL>^5*uOl zvQ`_rHO-|O*r8Gie0Qf_RVucR}Wn+>7CsL$1Ai!2rjrmP zZa`Biq9lcV`mjcg>;Z|*+^6FX!)$^R!jk*iM=CFKSrHM?^Jac_hVVk!g~yZ}x>P5X zK8M&|6@i(anxX4$?A8M%$+T<5SP?Q)TZ=F=r8W-4!;$cBH!v{TtPdtrsZ*;B$e<-s zF$qisAwNV=aY9zDu>1UW<#?Iez$FC*QvwX>XIM)gxq|`76ZAG2vpxk{C4EbJ24sAb zV9ZTIBh3Uw6&Q0h2JBb{X;p~9zsT7fLMTg4!TiH)Kaor?aa-ix0>%wV$|3ZY1El@& z^N)h5M_i*ZclA8OS>(oWSgjz};Ful0tdPN0C72Go#YeI4a|r3AP=aRM%WF>H;ywpbI+MNNn8{aZ!CAZ%ZTl!T zLs?s}NBYiP>M?Kl*0yq?&f`(T@BDDcBr?PTbiLl7)ag}@4~W2sBR`WQ=F{k$;Og9pq)~;<9OS$r&SJCg_$MuGNWIx~P>GkM5 zCew2lie5-u7R<20j=lIaMwt6NzT687&4qx{VVdl0SHZ2pwP#3mvaMLBpzo7yP72Qk z4CzjGAYO90ivg%-6J`-wPOc`*wQaqfFuP-QAF`L3%m)D-+1k2UaH@SWhi27s*w2Ys zr5jquJzjcez*C`v-JWR-OFrM9VK`#!Gk1p%#GRvC3OkNnyk(8KQeppuo|0w_ySkRjydK5%b`~KbXh4xXOvxLeE*1~z+Cxdy`l%;sa$JW1Z0o2N zk=D(1X;)a@;3UYXjV@%h|6+JESDl%|M8Z3MjPrDIEb$UA=5&;ky$L1LkXTxKYZJna zMRJ4Vq>MO*Ga#><%LG3WLu%o6>PAI%qF=|w+R!P=&KSWtz)@Au=3wi`YikvpyLQ(2SL*fnH^^SYI7$?SjueYrZSE+k@W6ukKe69=0KZWH02J&z!2kdN literal 4108 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 KMkK|IPyhhmgZg{` From e95cec108a722d735073130df5dc1144c4e9ffe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Tue, 1 Nov 2022 18:37:06 +0100 Subject: [PATCH 3/6] WIP! `prefer-at`: Support private field. --- rules/utils/is-same-reference.js | 23 ++++++++++++++++------- test/prefer-at.mjs | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/rules/utils/is-same-reference.js b/rules/utils/is-same-reference.js index b3ac200400..f1ee8dbfa9 100644 --- a/rules/utils/is-same-reference.js +++ b/rules/utils/is-same-reference.js @@ -60,10 +60,7 @@ function getStaticPropertyName(node) { } if (property) { - if ( - (property.type === 'Identifier' || property.type === 'PrivateIdentifier') - && !node.computed - ) { + if (property.type === 'Identifier' && !node.computed) { return property.name; } @@ -147,11 +144,23 @@ function isSameReference(left, right) { case 'MemberExpression': { const nameA = getStaticPropertyName(left); - // X.y = x["y"] + // X.y = X["y"] + if (nameA !== 'undefined') { + return ( + isSameReference(left.object, right.object) + && nameA === getStaticPropertyName(right) + ); + } + + /* + * X[0] = X[0] + * X[y] = X[y] + * X.y = X.y + */ return ( - typeof nameA !== 'undefined' + left.computed === right.computed && isSameReference(left.object, right.object) - && nameA === getStaticPropertyName(right) + && isSameReference(left.property, right.property) ); } diff --git a/test/prefer-at.mjs b/test/prefer-at.mjs index 8c7af425e9..15253fca34 100644 --- a/test/prefer-at.mjs +++ b/test/prefer-at.mjs @@ -18,6 +18,7 @@ test.snapshot({ '++ array[array.length - 1]', 'array[array.length - 1] --', 'delete array[array.length - 1]', + 'class Foo {bar; #bar; baz() {return this.#bar[this.bar.length - 1]}}', ], invalid: [ 'array[array.length - 1];', From da77e232bf2adf911c12369c575ce71be274ff9f Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 7 Nov 2022 14:39:31 +0800 Subject: [PATCH 4/6] Fix --- rules/utils/is-same-reference.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rules/utils/is-same-reference.js b/rules/utils/is-same-reference.js index f1ee8dbfa9..6f388a5372 100644 --- a/rules/utils/is-same-reference.js +++ b/rules/utils/is-same-reference.js @@ -1,7 +1,7 @@ 'use strict'; const {getStaticValue} = require('eslint-utils'); -// Copied from https://github.com/eslint/eslint/blob/c3e9accce2f61b04ab699fd37c90703305281aa3/lib/rules/utils/ast-utils.js#L379 +// Copied from https://github.com/eslint/eslint/blob/94ba68d76a6940f68ff82eea7332c6505f93df76/lib/rules/utils/ast-utils.js#L392 /** Gets the property name of a given node. @@ -144,8 +144,8 @@ function isSameReference(left, right) { case 'MemberExpression': { const nameA = getStaticPropertyName(left); - // X.y = X["y"] - if (nameA !== 'undefined') { + // `x.y = x["y"]` + if (typeof nameA !== 'undefined') { return ( isSameReference(left.object, right.object) && nameA === getStaticPropertyName(right) @@ -153,10 +153,10 @@ function isSameReference(left, right) { } /* - * X[0] = X[0] - * X[y] = X[y] - * X.y = X.y - */ + `x[0] = x[0]` + `x[y] = x[y]` + `x.y = x.y` + */ return ( left.computed === right.computed && isSameReference(left.object, right.object) From 82cd9fd5611504d3efd7445d4c537006204071de Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 7 Nov 2022 15:03:46 +0800 Subject: [PATCH 5/6] Apply changes --- test/no-array-push-push.mjs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/no-array-push-push.mjs b/test/no-array-push-push.mjs index 572c2e07c4..2f923bdd31 100644 --- a/test/no-array-push-push.mjs +++ b/test/no-array-push-push.mjs @@ -209,9 +209,6 @@ test.snapshot({ test({ valid: [ outdent` - a[x].push(1); - a[x].push(2); - '1'.someMagicPropertyReturnsAnArray.push(1); (1).someMagicPropertyReturnsAnArray.push(2); @@ -284,5 +281,15 @@ test({ `, errors: 9, }, + { + code: outdent` + a[x].push(1); + a[x].push(2); + `, + output: outdent` + a[x].push(1, 2); + `, + errors: 1, + }, ], }); From 12577911f1fd8351c5e0a86f41f742e3ea6a36de Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 7 Nov 2022 15:10:54 +0800 Subject: [PATCH 6/6] Update snapshot --- test/snapshots/prefer-at.mjs.md | 64 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/test/snapshots/prefer-at.mjs.md b/test/snapshots/prefer-at.mjs.md index 34c004cd63..64bf551ab8 100644 --- a/test/snapshots/prefer-at.mjs.md +++ b/test/snapshots/prefer-at.mjs.md @@ -286,6 +286,38 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ ` +## Invalid #19 + 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}} + +> Output + + `␊ + 1 | class Foo {bar; baz() {return this.bar.at(-1)}}␊ + ` + +> Error 1/1 + + `␊ + > 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}}␊ + | ^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + +## Invalid #20 + 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}} + +> Output + + `␊ + 1 | class Foo {#bar; baz() {return this.#bar.at(-1)}}␊ + ` + +> Error 1/1 + + `␊ + > 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}}␊ + | ^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ + ` + ## Invalid #1 1 | string.charAt(string.length - 1); @@ -1397,35 +1429,3 @@ Generated by [AVA](https://avajs.dev). Suggestion 1/1: Use \`.at(…)\`.␊ 1 | foo.at(bar.length - 1)␊ ` - -## Invalid #19 - 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}} - -> Output - - `␊ - 1 | class Foo {bar; baz() {return this.bar.at(-1)}}␊ - ` - -> Error 1/1 - - `␊ - > 1 | class Foo {bar; baz() {return this.bar[this.bar.length - 1]}}␊ - | ^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ - ` - -## Invalid #20 - 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}} - -> Output - - `␊ - 1 | class Foo {#bar; baz() {return this.#bar.at(-1)}}␊ - ` - -> Error 1/1 - - `␊ - > 1 | class Foo {#bar; baz() {return this.#bar[this.#bar.length - 1]}}␊ - | ^^^^^^^^^^^^^^^^^^^^ Prefer \`.at(…)\` over \`[….length - index]\`.␊ - `