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) {} +};