From 60bb45563503685da679d5ec55fc8c96317becc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Tue, 8 Nov 2022 08:16:03 +0100 Subject: [PATCH] `prefer-at`: Support private field (#1929) Co-authored-by: fisker Cheung --- rules/utils/is-same-reference.js | 23 ++++++++++++++++----- test/no-array-push-push.mjs | 13 +++++++++--- test/prefer-at.mjs | 3 +++ test/snapshots/prefer-at.mjs.md | 32 ++++++++++++++++++++++++++++++ test/snapshots/prefer-at.mjs.snap | Bin 4029 -> 4182 bytes 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/rules/utils/is-same-reference.js b/rules/utils/is-same-reference.js index 112c807912..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. @@ -128,7 +128,8 @@ function isSameReference(left, right) { return true; } - case 'Identifier': { + case 'Identifier': + case 'PrivateIdentifier': { return left.name === right.name; } @@ -143,11 +144,23 @@ function isSameReference(left, right) { case 'MemberExpression': { const nameA = getStaticPropertyName(left); - // X.y = x["y"] + // `x.y = x["y"]` + if (typeof 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/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, + }, ], }); diff --git a/test/prefer-at.mjs b/test/prefer-at.mjs index bdb67c54e2..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];', @@ -38,6 +39,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..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); diff --git a/test/snapshots/prefer-at.mjs.snap b/test/snapshots/prefer-at.mjs.snap index cfcec10ed51262ef53539724d9a6138243ccc377..269bd260b41e3fc8b1f717aca3d218939db25603 100644 GIT binary patch literal 4182 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 literal 4029 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