Alex Crichton b9dc937d73 Refactor WebIDL code generation
This commit refactors WebIDL code generation to walk over the fields of
`FirstPassRecord` instead of walking the AST again. This helps remove
redundancies like checking `is_chrome_only` as well as revisiting partial
interfaces and such. This should make it more clear that the first pass's job is
to walk the AST and collect all relevant information, while the codegen pass is
purely about appending items to a `Program`.

Additionally this refactoring will also soon be used to prepare different data
structures for operation overloadings, avoiding the need to walk those ASTs
twice.
2018-08-30 12:54:54 -07:00

149 lines
2.4 KiB
JavaScript

global.Method = class Method {
constructor(value) {
this.value = value;
}
myCmp(other) {
return this.value === other.value;
}
};
global.Property = class Property {
constructor(value) {
this._value = value;
}
get value() {
return this._value;
}
set value(value) {
this._value = value;
}
};
global.NamedConstructor = class NamedConstructor {
constructor() {
this._value = 0;
}
get value(){
return this._value;
}
};
global.NamedConstructorBar = class NamedConstructorBar extends NamedConstructor {
constructor(_value) {
super();
this._value = _value;
}
};
global.StaticMethod = class StaticMethod {
static swap(value) {
const res = StaticMethod.value;
StaticMethod.value = value;
return res;
}
};
StaticMethod.value = 0;
global.StaticProperty = class StaticProperty {
static get value(){
return StaticProperty._value;
}
static set value(value) {
StaticProperty._value = value;
}
};
StaticProperty._value = 0;
global.UndefinedMethod = class UndefinedMethod {
constructor() {}
ok_method() {
return true;
}
};
global.NullableMethod = class NullableMethod {
constructor() {}
opt(a) {
if (a == undefined) {
return undefined;
} else {
return a + 1;
}
}
};
global.Unforgeable = class Unforgeable {
constructor() {
this.uno = 1;
}
get dos() {
return 2;
}
};
global.m = () => 123;
global.Indexing = function () {
return new Proxy({}, {
get(obj, prop) {
return obj.hasOwnProperty(prop) ? obj[prop] : -1;
},
set(obj, prop, value) {
obj[prop] = value;
},
deleteProperty(obj, prop) {
delete obj[prop];
},
});
};
global.OptionalAndUnionArguments = class OptionalAndUnionArguments {
constructor() {}
m(a, b = true, c = 123, d = 456) {
return [typeof a, a, typeof b, b, typeof c, c, typeof d, d].join(', ');
}
};
global.PartialInterface = class PartialInterface {
get un() {
return 1;
}
deux() {
return 2;
}
get trois() {
return 3;
}
quatre() {
return 4;
}
};
global.MixinFoo = class MixinFoo {
constructor(bar) {
this._bar = bar | MixinFoo.defaultBar;
}
static get defaultBar() {
return MixinFoo._defaultBar;
}
static set defaultBar(defaultBar) {
MixinFoo._defaultBar = defaultBar;
}
get bar() {
return this._bar;
}
addToBar(other) {
this._bar += other;
}
};
global.Overloads = class {
foo() {}
};