From 3227279d95f60a92fe03229a21d7c262cb14e0f2 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 1 Mar 2016 15:46:31 -0800 Subject: [PATCH 1/2] Fix accessors being seen as duplicates of each other If an object has a getter and setter of the same name, then they shouldn't be treated as duplicate properties. --- .../src/index.js | 40 +++++++++++++++++-- .../getters-and-setters/actual.js | 10 +++++ .../getters-and-setters/expected.js | 10 +++++ 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js create mode 100644 packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js index be9fab7851..df7b32cee0 100644 --- a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js @@ -14,13 +14,45 @@ export default function() { const { node } = path; const plainProps = node.properties.filter((prop) => !t.isSpreadProperty(prop) && !prop.computed); - const alreadySeenNames = Object.create(null); + // A property is a duplicate key if: + // * the property is a data property, and is preceeded by a data, + // getter, or setter property of the same name. + // * the property is a getter property, and is preceeded by a data or + // getter property of the same name. + // * the property is a setter property, and is preceeded by a data or + // setter property of the same name. + + const alreadySeenData = Object.create(null); + const alreadySeenGetters = Object.create(null); + const alreadySeenSetters = Object.create(null); for (let prop of plainProps) { const name = getName(prop.key); - if (!alreadySeenNames[name]) { - alreadySeenNames[name] = true; - } else { + let isDuplicate = false; + switch (prop.kind) { + case "get": + if (alreadySeenData[name] || alreadySeenGetters[name]) { + isDuplicate = true; + } else { + alreadySeenGetters[name] = true; + } + break; + case "set": + if (alreadySeenData[name] || alreadySeenSetters[name]) { + isDuplicate = true; + } else { + alreadySeenSetters[name] = true; + } + break; + default: + if (alreadySeenData[name] || alreadySeenGetters[name] || alreadySeenSetters[name]) { + isDuplicate = true; + } else { + alreadySeenData[name] = true; + } + } + + if (isDuplicate) { // Rely on the computed properties transform to split the property // assignment out of the object literal. prop.computed = true; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js new file mode 100644 index 0000000000..b67c507f76 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js @@ -0,0 +1,10 @@ +var x = { + get a() {}, + set a(x) {}, + get a() {}, + set a(x) {}, + a: 3, + b: 4, + get b() {}, + set b(x) {} +}; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js new file mode 100644 index 0000000000..02f77e94e2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js @@ -0,0 +1,10 @@ +var x = { + get a() {}, + set a(x) {}, + get ["a"]() {}, + set ["a"](x) {}, + ["a"]: 3, + b: 4, + get ["b"]() {}, + set ["b"](x) {} +}; From 63af3d1366845e9d9e504792d25c41c57f5dac0d Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 1 Mar 2016 17:13:20 -0800 Subject: [PATCH 2/2] Fix issue where we didn't record seeing a property sometimes. --- .../src/index.js | 9 +++------ .../duplicate-keys/getters-and-setters/actual.js | 8 +++++++- .../duplicate-keys/getters-and-setters/expected.js | 8 +++++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js index df7b32cee0..551e27a4ec 100644 --- a/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/src/index.js @@ -33,23 +33,20 @@ export default function() { case "get": if (alreadySeenData[name] || alreadySeenGetters[name]) { isDuplicate = true; - } else { - alreadySeenGetters[name] = true; } + alreadySeenGetters[name] = true; break; case "set": if (alreadySeenData[name] || alreadySeenSetters[name]) { isDuplicate = true; - } else { - alreadySeenSetters[name] = true; } + alreadySeenSetters[name] = true; break; default: if (alreadySeenData[name] || alreadySeenGetters[name] || alreadySeenSetters[name]) { isDuplicate = true; - } else { - alreadySeenData[name] = true; } + alreadySeenData[name] = true; } if (isDuplicate) { diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js index b67c507f76..fe9df3aa0e 100644 --- a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/actual.js @@ -6,5 +6,11 @@ var x = { a: 3, b: 4, get b() {}, - set b(x) {} + set b(x) {}, + get c() {}, + c: 5, + set c(x) {}, + set d(x) {}, + d: 6, + get d() {} }; diff --git a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js index 02f77e94e2..9c5ae8b475 100644 --- a/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js +++ b/packages/babel-plugin-transform-es2015-duplicate-keys/test/fixtures/duplicate-keys/getters-and-setters/expected.js @@ -6,5 +6,11 @@ var x = { ["a"]: 3, b: 4, get ["b"]() {}, - set ["b"](x) {} + set ["b"](x) {}, + get c() {}, + ["c"]: 5, + set ["c"](x) {}, + set d(x) {}, + ["d"]: 6, + get ["d"]() {} };