diff --git a/packages/babel-traverse/src/path/conversion.ts b/packages/babel-traverse/src/path/conversion.ts index a1bdbf891a92..3aed8568f6d1 100644 --- a/packages/babel-traverse/src/path/conversion.ts +++ b/packages/babel-traverse/src/path/conversion.ts @@ -485,7 +485,12 @@ function standardizeSuperProperty(superProp) { computedKey ? identifier(computedKey.name) : superProp.node.property, superProp.node.computed, ), - binaryExpression("+", identifier(tmp.name), numericLiteral(1)), + binaryExpression( + // map `++` to `+`, and `--` to `-` + superProp.parentPath.node.operator[0] as "+" | "-", + identifier(tmp.name), + numericLiteral(1), + ), ), ]; diff --git a/packages/babel-traverse/test/arrow-transform.js b/packages/babel-traverse/test/arrow-transform.js index 3343a0a14adc..268c73ce04be 100644 --- a/packages/babel-traverse/test/arrow-transform.js +++ b/packages/babel-traverse/test/arrow-transform.js @@ -518,7 +518,7 @@ describe("arrow function conversion", () => { ); }); - it("should convert super.prop prefix update", () => { + it("should convert `++super.prop` prefix update", () => { assertConversion( ` () => { @@ -542,7 +542,31 @@ describe("arrow function conversion", () => { ); }); - it("should convert super[prop] prefix update", () => { + it("should convert `--super.prop` prefix update", () => { + assertConversion( + ` + () => { + --super.foo; + }; + --super.foo; + () => --super.foo; + `, + ` + var _superprop_getFoo = () => super.foo, + _superprop_setFoo = _value => super.foo = _value; + + (function () { + var _tmp; + + _tmp = _superprop_getFoo(), _superprop_setFoo(_tmp - 1); + }); + --super.foo; + () => --super.foo; + `, + ); + }); + + it("should convert `++super[prop]` prefix update", () => { assertConversion( ` () => { @@ -566,7 +590,31 @@ describe("arrow function conversion", () => { ); }); - it("should convert super.prop suffix update", () => { + it("should convert `--super[prop]` prefix update", () => { + assertConversion( + ` + () => { + --super[foo]; + }; + --super[foo]; + () => --super[foo]; + `, + ` + var _superprop_get = _prop2 => super[_prop2], + _superprop_set = (_prop3, _value) => super[_prop3] = _value; + + (function () { + var _tmp, _prop; + + _tmp = _superprop_get(_prop = foo), _superprop_set(_prop, _tmp - 1); + }); + --super[foo]; + () => --super[foo]; + `, + ); + }); + + it("should convert `super.prop++` suffix update", () => { assertConversion( ` () => { @@ -590,7 +638,31 @@ describe("arrow function conversion", () => { ); }); - it("should convert super[prop] suffix update", () => { + it("should convert `super.prop--` suffix update", () => { + assertConversion( + ` + () => { + super.foo--; + }; + super.foo--; + () => super.foo--; + `, + ` + var _superprop_getFoo = () => super.foo, + _superprop_setFoo = _value => super.foo = _value; + + (function () { + var _tmp; + + _tmp = _superprop_getFoo(), _superprop_setFoo(_tmp - 1), _tmp; + }); + super.foo--; + () => super.foo--; + `, + ); + }); + + it("should convert `super[prop]++` suffix update", () => { assertConversion( ` () => { @@ -614,6 +686,30 @@ describe("arrow function conversion", () => { ); }); + it("should convert `super[prop]--` suffix update", () => { + assertConversion( + ` + () => { + super[foo]--; + }; + super[foo]--; + () => super[foo]--; + `, + ` + var _superprop_get = _prop2 => super[_prop2], + _superprop_set = (_prop3, _value) => super[_prop3] = _value; + + (function () { + var _tmp, _prop; + + _tmp = _superprop_get(_prop = foo), _superprop_set(_prop, _tmp - 1), _tmp; + }); + super[foo]--; + () => super[foo]--; + `, + ); + }); + it("should convert super.prop() calls without params", () => { assertConversion( `