Fix default descriptor setting for class properties with decorators (#7429)

(legacy decorators)
This commit is contained in:
Yeonghoon Park 2018-08-17 17:49:03 +09:00 committed by Nicolò Ribaudo
parent ffa8e6cbae
commit c75a00bd56
6 changed files with 48 additions and 5 deletions

View File

@ -978,9 +978,7 @@ helpers.applyDecoratedDescriptor = helper("7.0.0-beta.0")`
}); });
desc.enumerable = !!desc.enumerable; desc.enumerable = !!desc.enumerable;
desc.configurable = !!desc.configurable; desc.configurable = !!desc.configurable;
if ('value' in desc || desc.initializer){ desc.writable = !!desc.writable;
desc.writable = true;
}
desc = decorators.slice().reverse().reduce(function(desc, decorator){ desc = decorators.slice().reverse().reduce(function(desc, decorator){
return decorator(target, property, desc) || desc; return decorator(target, property, desc) || desc;

View File

@ -168,10 +168,18 @@ function applyTargetDecorators(path, state, decoratedProps) {
decorators.map(dec => t.cloneNode(dec.expression)), decorators.map(dec => t.cloneNode(dec.expression)),
), ),
t.objectExpression([ t.objectExpression([
t.objectProperty(
t.identifier("configurable"),
t.booleanLiteral(true),
),
t.objectProperty( t.objectProperty(
t.identifier("enumerable"), t.identifier("enumerable"),
t.booleanLiteral(true), t.booleanLiteral(true),
), ),
t.objectProperty(
t.identifier("writable"),
t.booleanLiteral(true),
),
t.objectProperty(t.identifier("initializer"), initializer), t.objectProperty(t.identifier("initializer"), initializer),
]), ]),
]), ]),

View File

@ -16,6 +16,16 @@ function dec(target, name, descriptor) {
}); });
} }
function plainDec(target, name, descriptor) {
expect(target).toBeTruthy();
expect(typeof name).toBe("string");
expect(typeof descriptor).toBe("object");
target.decoratedProps = (target.decoratedProps || []).concat([name]);
return descriptor;
}
class Example { class Example {
@dec @dec
enumconfwrite = 1; enumconfwrite = 1;
@ -40,6 +50,9 @@ class Example {
@dec @dec
_ = 8; _ = 8;
@plainDec
plain = 9;
} }
const inst = new Example(); const inst = new Example();
@ -54,6 +67,7 @@ expect(inst.decoratedProps).toEqual([
"conf", "conf",
"write", "write",
"_", "_",
"plain",
]); ]);
const descs = Object.getOwnPropertyDescriptors(inst); const descs = Object.getOwnPropertyDescriptors(inst);
@ -97,3 +111,8 @@ expect(descs._.enumerable).toBe(false);
expect(descs._.writable).toBe(false); expect(descs._.writable).toBe(false);
expect(descs._.configurable).toBe(false); expect(descs._.configurable).toBe(false);
expect(inst._).toBe("__8__"); expect(inst._).toBe("__8__");
expect(descs.plain.enumerable).toBeTruthy();
expect(descs.plain.writable).toBeTruthy();
expect(descs.plain.configurable).toBeTruthy();
expect(inst.plain).toBe(9);

View File

@ -1,5 +1,11 @@
function dec(target, name, descriptor) { function dec(target, name, descriptor) {
expect(target).toBeTruthy();
expect(typeof name).toBe("string");
expect(typeof descriptor).toBe("object");
target.decoratedProps = (target.decoratedProps || []).concat([name]);
return descriptor;
} }
class Example { class Example {
@ -7,5 +13,17 @@ class Example {
} }
let inst = new Example(); let inst = new Example();
expect(Example.prototype).toHaveProperty("decoratedProps");
expect(inst.decoratedProps).toEqual([
"prop",
]);
expect(inst).toHaveProperty("prop"); expect(inst).toHaveProperty("prop");
expect(inst.prop).toBeUndefined(); expect(inst.prop).toBeUndefined();
const descs = Object.getOwnPropertyDescriptors(inst);
expect(descs.prop.enumerable).toBeTruthy();
expect(descs.prop.writable).toBeTruthy();
expect(descs.prop.configurable).toBeTruthy();

View File

@ -1,6 +1,6 @@
var _class, _class2; var _class, _class2;
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; desc.writable = !!desc.writable; desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; }
let A = (_class2 = class A { let A = (_class2 = class A {
foo() {} foo() {}

View File

@ -1,6 +1,6 @@
var _class2; var _class2;
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; desc.writable = !!desc.writable; desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; }
let _class = (_class2 = class { let _class = (_class2 = class {
bar() {} bar() {}