mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
auto merge of #2237 : Ms2ger/servo/union-fromjsvalconvertible, r=jdm
With bonus codegen tests.
This commit is contained in:
commit
9f742a9462
3 changed files with 98 additions and 19 deletions
|
@ -576,21 +576,13 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
|
||||||
"holderType")
|
"holderType")
|
||||||
|
|
||||||
declType = CGGeneric(type.name)
|
declType = CGGeneric(type.name)
|
||||||
value = CGGeneric("value")
|
|
||||||
if type.nullable():
|
if type.nullable():
|
||||||
declType = CGWrapper(declType, pre="Option<", post=" >")
|
declType = CGWrapper(declType, pre="Option<", post=" >")
|
||||||
value = CGWrapper(value, pre="Some(", post=")")
|
|
||||||
|
|
||||||
templateBody = CGGeneric("match %s::from_value(cx, ${val}) {\n"
|
templateBody = CGGeneric("match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
|
||||||
|
" Ok(value) => value,\n"
|
||||||
" Err(()) => { %s },\n"
|
" Err(()) => { %s },\n"
|
||||||
" Ok(value) => %s,\n"
|
"}" % exceptionCode)
|
||||||
"}" % (type.name, exceptionCode, value.define()))
|
|
||||||
|
|
||||||
if type.nullable():
|
|
||||||
templateBody = CGIfElseWrapper(
|
|
||||||
"(${val}).is_null_or_undefined()",
|
|
||||||
CGGeneric("None"),
|
|
||||||
templateBody)
|
|
||||||
|
|
||||||
templateBody = handleDefaultNull(templateBody.define(),
|
templateBody = handleDefaultNull(templateBody.define(),
|
||||||
"None")
|
"None")
|
||||||
|
@ -2847,7 +2839,7 @@ class CGUnionConversionStruct(CGThing):
|
||||||
self.type = type
|
self.type = type
|
||||||
self.descriptorProvider = descriptorProvider
|
self.descriptorProvider = descriptorProvider
|
||||||
|
|
||||||
def from_value_method(self):
|
def from_jsval(self):
|
||||||
memberTypes = self.type.flatMemberTypes
|
memberTypes = self.type.flatMemberTypes
|
||||||
names = []
|
names = []
|
||||||
conversions = []
|
conversions = []
|
||||||
|
@ -2941,9 +2933,13 @@ class CGUnionConversionStruct(CGThing):
|
||||||
conversions.append(CGGeneric(
|
conversions.append(CGGeneric(
|
||||||
"throw_not_in_union(cx, \"%s\");\n"
|
"throw_not_in_union(cx, \"%s\");\n"
|
||||||
"Err(())" % ", ".join(names)))
|
"Err(())" % ", ".join(names)))
|
||||||
return CGWrapper(
|
method = CGWrapper(
|
||||||
CGIndenter(CGList(conversions, "\n\n")),
|
CGIndenter(CGList(conversions, "\n\n")),
|
||||||
pre="pub fn from_value(cx: *JSContext, value: JSVal) -> Result<%s, ()> {\n" % self.type,
|
pre="fn from_jsval(cx: *JSContext, value: JSVal, _option: ()) -> Result<%s, ()> {\n" % self.type,
|
||||||
|
post="\n}")
|
||||||
|
return CGWrapper(
|
||||||
|
CGIndenter(method),
|
||||||
|
pre="impl FromJSValConvertible<()> for %s {\n" % self.type,
|
||||||
post="\n}")
|
post="\n}")
|
||||||
|
|
||||||
def try_method(self, t):
|
def try_method(self, t):
|
||||||
|
@ -2953,16 +2949,21 @@ class CGUnionConversionStruct(CGThing):
|
||||||
|
|
||||||
return CGWrapper(
|
return CGWrapper(
|
||||||
CGIndenter(jsConversion, 4),
|
CGIndenter(jsConversion, 4),
|
||||||
pre="pub fn TryConvertTo%s(cx: *JSContext, value: JSVal) -> %s {\n" % (t.name, returnType),
|
pre="fn TryConvertTo%s(cx: *JSContext, value: JSVal) -> %s {\n" % (t.name, returnType),
|
||||||
post="\n}")
|
post="\n}")
|
||||||
|
|
||||||
def define(self):
|
def define(self):
|
||||||
methods = [self.from_value_method()]
|
from_jsval = self.from_jsval()
|
||||||
methods.extend(self.try_method(t) for t in self.type.flatMemberTypes)
|
methods = CGIndenter(CGList([
|
||||||
|
self.try_method(t) for t in self.type.flatMemberTypes
|
||||||
|
], "\n\n"))
|
||||||
return """
|
return """
|
||||||
|
%s
|
||||||
|
|
||||||
impl %s {
|
impl %s {
|
||||||
%s
|
%s
|
||||||
}""" % (self.type, CGIndenter(CGList(methods, "\n\n")).define())
|
}
|
||||||
|
""" % (from_jsval.define(), self.type, methods.define())
|
||||||
|
|
||||||
|
|
||||||
class ClassItem:
|
class ClassItem:
|
||||||
|
|
|
@ -3,10 +3,11 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use dom::bindings::js::JS;
|
use dom::bindings::js::JS;
|
||||||
use dom::bindings::utils::{Reflector, Reflectable};
|
|
||||||
use dom::bindings::codegen::TestBindingBinding;
|
use dom::bindings::codegen::TestBindingBinding;
|
||||||
|
use dom::bindings::codegen::UnionTypes::HTMLElementOrLong;
|
||||||
use self::TestBindingBinding::TestEnum;
|
use self::TestBindingBinding::TestEnum;
|
||||||
use self::TestBindingBinding::TestEnumValues::_empty;
|
use self::TestBindingBinding::TestEnumValues::_empty;
|
||||||
|
use dom::bindings::utils::{Reflector, Reflectable};
|
||||||
use dom::blob::Blob;
|
use dom::blob::Blob;
|
||||||
use dom::window::Window;
|
use dom::window::Window;
|
||||||
use servo_util::str::DOMString;
|
use servo_util::str::DOMString;
|
||||||
|
@ -80,6 +81,40 @@ impl TestBinding {
|
||||||
pub fn GetInterfaceAttributeNullable(&self) -> Option<JS<Blob>> { Some(Blob::new(&self.window)) }
|
pub fn GetInterfaceAttributeNullable(&self) -> Option<JS<Blob>> { Some(Blob::new(&self.window)) }
|
||||||
pub fn SetInterfaceAttributeNullable(&self, _: Option<JS<Blob>>) {}
|
pub fn SetInterfaceAttributeNullable(&self, _: Option<JS<Blob>>) {}
|
||||||
|
|
||||||
|
pub fn PassBoolean(&self, _: bool) {}
|
||||||
|
pub fn PassByte(&self, _: i8) {}
|
||||||
|
pub fn PassOctet(&self, _: u8) {}
|
||||||
|
pub fn PassShort(&self, _: i16) {}
|
||||||
|
pub fn PassUnsignedShort(&self, _: u16) {}
|
||||||
|
pub fn PassLong(&self, _: i32) {}
|
||||||
|
pub fn PassUnsignedLong(&self, _: u32) {}
|
||||||
|
pub fn PassLongLong(&self, _: i64) {}
|
||||||
|
pub fn PassUnsignedLongLong(&self, _: u64) {}
|
||||||
|
pub fn PassFloat(&self, _: f32) {}
|
||||||
|
pub fn PassDouble(&self, _: f64) {}
|
||||||
|
pub fn PassString(&self, _: DOMString) {}
|
||||||
|
pub fn PassEnum(&self, _: TestEnum) {}
|
||||||
|
pub fn PassInterface(&self, _: &JS<Blob>) {}
|
||||||
|
pub fn PassUnion(&self, _: HTMLElementOrLong) {}
|
||||||
|
pub fn PassAny(&self, _: *JSContext, _: JSVal) {}
|
||||||
|
|
||||||
|
pub fn PassNullableBoolean(&self, _: Option<bool>) {}
|
||||||
|
pub fn PassNullableByte(&self, _: Option<i8>) {}
|
||||||
|
pub fn PassNullableOctet(&self, _: Option<u8>) {}
|
||||||
|
pub fn PassNullableShort(&self, _: Option<i16>) {}
|
||||||
|
pub fn PassNullableUnsignedShort(&self, _: Option<u16>) {}
|
||||||
|
pub fn PassNullableLong(&self, _: Option<i32>) {}
|
||||||
|
pub fn PassNullableUnsignedLong(&self, _: Option<u32>) {}
|
||||||
|
pub fn PassNullableLongLong(&self, _: Option<i64>) {}
|
||||||
|
pub fn PassNullableUnsignedLongLong(&self, _: Option<u64>) {}
|
||||||
|
pub fn PassNullableFloat(&self, _: Option<f32>) {}
|
||||||
|
pub fn PassNullableDouble(&self, _: Option<f64>) {}
|
||||||
|
pub fn PassNullableString(&self, _: Option<DOMString>) {}
|
||||||
|
// pub fn PassNullableEnum(&self, _: Option<TestEnum>) {}
|
||||||
|
pub fn PassNullableInterface(&self, _: Option<JS<Blob>>) {}
|
||||||
|
pub fn PassNullableUnion(&self, _: Option<HTMLElementOrLong>) {}
|
||||||
|
pub fn PassNullableAny(&self, _: *JSContext, _: Option<JSVal>) {}
|
||||||
|
|
||||||
pub fn PassOptionalBoolean(&self, _: Option<bool>) {}
|
pub fn PassOptionalBoolean(&self, _: Option<bool>) {}
|
||||||
pub fn PassOptionalByte(&self, _: Option<i8>) {}
|
pub fn PassOptionalByte(&self, _: Option<i8>) {}
|
||||||
pub fn PassOptionalOctet(&self, _: Option<u8>) {}
|
pub fn PassOptionalOctet(&self, _: Option<u8>) {}
|
||||||
|
@ -94,6 +129,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalString(&self, _: Option<DOMString>) {}
|
pub fn PassOptionalString(&self, _: Option<DOMString>) {}
|
||||||
// pub fn PassOptionalEnum(&self, _: Option<TestEnum>) {}
|
// pub fn PassOptionalEnum(&self, _: Option<TestEnum>) {}
|
||||||
pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {}
|
pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {}
|
||||||
|
// pub fn PassOptionalUnion(&self, _: Option<HTMLElementOrLong>) {}
|
||||||
pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {}
|
pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {}
|
||||||
|
|
||||||
pub fn PassOptionalNullableBoolean(&self, _: Option<Option<bool>>) {}
|
pub fn PassOptionalNullableBoolean(&self, _: Option<Option<bool>>) {}
|
||||||
|
@ -110,6 +146,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {}
|
pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {}
|
||||||
// pub fn PassOptionalNullableEnum(&self, _: Option<Option<TestEnum>>) {}
|
// pub fn PassOptionalNullableEnum(&self, _: Option<Option<TestEnum>>) {}
|
||||||
// pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {}
|
// pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {}
|
||||||
|
// pub fn PassOptionalNullableUnion(&self, _: Option<Option<HTMLElementOrLong>>) {}
|
||||||
|
|
||||||
pub fn PassOptionalBooleanWithDefault(&self, _: bool) {}
|
pub fn PassOptionalBooleanWithDefault(&self, _: bool) {}
|
||||||
pub fn PassOptionalByteWithDefault(&self, _: i8) {}
|
pub fn PassOptionalByteWithDefault(&self, _: i8) {}
|
||||||
|
@ -137,6 +174,7 @@ impl TestBinding {
|
||||||
pub fn PassOptionalNullableStringWithDefault(&self, _: Option<DOMString>) {}
|
pub fn PassOptionalNullableStringWithDefault(&self, _: Option<DOMString>) {}
|
||||||
// pub fn PassOptionalNullableEnumWithDefault(&self, _: Option<TestEnum>) {}
|
// pub fn PassOptionalNullableEnumWithDefault(&self, _: Option<TestEnum>) {}
|
||||||
pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option<JS<Blob>>) {}
|
pub fn PassOptionalNullableInterfaceWithDefault(&self, _: Option<JS<Blob>>) {}
|
||||||
|
pub fn PassOptionalNullableUnionWithDefault(&self, _: Option<HTMLElementOrLong>) {}
|
||||||
pub fn PassOptionalAnyWithDefault(&self, _: *JSContext, _: JSVal) {}
|
pub fn PassOptionalAnyWithDefault(&self, _: *JSContext, _: JSVal) {}
|
||||||
|
|
||||||
pub fn PassOptionalNullableBooleanWithNonNullDefault(&self, _: Option<bool>) {}
|
pub fn PassOptionalNullableBooleanWithNonNullDefault(&self, _: Option<bool>) {}
|
||||||
|
|
|
@ -68,6 +68,7 @@ interface TestBinding {
|
||||||
attribute DOMString stringAttribute;
|
attribute DOMString stringAttribute;
|
||||||
attribute TestEnum enumAttribute;
|
attribute TestEnum enumAttribute;
|
||||||
attribute Blob interfaceAttribute;
|
attribute Blob interfaceAttribute;
|
||||||
|
// attribute (HTMLElement or long) unionAttribute;
|
||||||
attribute any anyAttribute;
|
attribute any anyAttribute;
|
||||||
|
|
||||||
attribute boolean? booleanAttributeNullable;
|
attribute boolean? booleanAttributeNullable;
|
||||||
|
@ -84,6 +85,40 @@ interface TestBinding {
|
||||||
attribute DOMString? stringAttributeNullable;
|
attribute DOMString? stringAttributeNullable;
|
||||||
readonly attribute TestEnum? enumAttributeNullable;
|
readonly attribute TestEnum? enumAttributeNullable;
|
||||||
attribute Blob? interfaceAttributeNullable;
|
attribute Blob? interfaceAttributeNullable;
|
||||||
|
// attribute (HTMLElement or long)? unionAttributeNullable;
|
||||||
|
|
||||||
|
void passBoolean(boolean arg);
|
||||||
|
void passByte(byte arg);
|
||||||
|
void passOctet(octet arg);
|
||||||
|
void passShort(short arg);
|
||||||
|
void passUnsignedShort(unsigned short arg);
|
||||||
|
void passLong(long arg);
|
||||||
|
void passUnsignedLong(unsigned long arg);
|
||||||
|
void passLongLong(long long arg);
|
||||||
|
void passUnsignedLongLong(unsigned long long arg);
|
||||||
|
void passFloat(float arg);
|
||||||
|
void passDouble(double arg);
|
||||||
|
void passString(DOMString arg);
|
||||||
|
void passEnum(TestEnum arg);
|
||||||
|
void passInterface(Blob arg);
|
||||||
|
void passUnion((HTMLElement or long) arg);
|
||||||
|
void passAny(any arg);
|
||||||
|
|
||||||
|
void passNullableBoolean(boolean? arg);
|
||||||
|
void passNullableByte(byte? arg);
|
||||||
|
void passNullableOctet(octet? arg);
|
||||||
|
void passNullableShort(short? arg);
|
||||||
|
void passNullableUnsignedShort(unsigned short? arg);
|
||||||
|
void passNullableLong(long? arg);
|
||||||
|
void passNullableUnsignedLong(unsigned long? arg);
|
||||||
|
void passNullableLongLong(long long? arg);
|
||||||
|
void passNullableUnsignedLongLong(unsigned long long? arg);
|
||||||
|
void passNullableFloat(float? arg);
|
||||||
|
void passNullableDouble(double? arg);
|
||||||
|
void passNullableString(DOMString? arg);
|
||||||
|
// void passNullableEnum(TestEnum? arg);
|
||||||
|
void passNullableInterface(Blob? arg);
|
||||||
|
void passNullableUnion((HTMLElement or long)? arg);
|
||||||
|
|
||||||
void passOptionalBoolean(optional boolean arg);
|
void passOptionalBoolean(optional boolean arg);
|
||||||
void passOptionalByte(optional byte arg);
|
void passOptionalByte(optional byte arg);
|
||||||
|
@ -99,6 +134,7 @@ interface TestBinding {
|
||||||
void passOptionalString(optional DOMString arg);
|
void passOptionalString(optional DOMString arg);
|
||||||
// void passOptionalEnum(optional TestEnum arg);
|
// void passOptionalEnum(optional TestEnum arg);
|
||||||
void passOptionalInterface(optional Blob arg);
|
void passOptionalInterface(optional Blob arg);
|
||||||
|
// void passOptionalUnion(optional (HTMLElement or long) arg);
|
||||||
void passOptionalAny(optional any arg);
|
void passOptionalAny(optional any arg);
|
||||||
|
|
||||||
void passOptionalNullableBoolean(optional boolean? arg);
|
void passOptionalNullableBoolean(optional boolean? arg);
|
||||||
|
@ -115,6 +151,7 @@ interface TestBinding {
|
||||||
void passOptionalNullableString(optional DOMString? arg);
|
void passOptionalNullableString(optional DOMString? arg);
|
||||||
// void passOptionalNullableEnum(optional TestEnum? arg);
|
// void passOptionalNullableEnum(optional TestEnum? arg);
|
||||||
// void passOptionalNullableInterface(optional Blob? arg);
|
// void passOptionalNullableInterface(optional Blob? arg);
|
||||||
|
// void passOptionalNullableUnion(optional (HTMLElement or long)? arg);
|
||||||
|
|
||||||
void passOptionalBooleanWithDefault(optional boolean arg = false);
|
void passOptionalBooleanWithDefault(optional boolean arg = false);
|
||||||
void passOptionalByteWithDefault(optional byte arg = 0);
|
void passOptionalByteWithDefault(optional byte arg = 0);
|
||||||
|
@ -127,6 +164,7 @@ interface TestBinding {
|
||||||
void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
|
void passOptionalUnsignedLongLongWithDefault(optional unsigned long long arg = 17);
|
||||||
void passOptionalStringWithDefault(optional DOMString arg = "");
|
void passOptionalStringWithDefault(optional DOMString arg = "");
|
||||||
void passOptionalEnumWithDefault(optional TestEnum arg = "foo");
|
void passOptionalEnumWithDefault(optional TestEnum arg = "foo");
|
||||||
|
// void passOptionalUnionWithDefault(optional (HTMLElement or long) arg = 9);
|
||||||
|
|
||||||
void passOptionalNullableBooleanWithDefault(optional boolean? arg = null);
|
void passOptionalNullableBooleanWithDefault(optional boolean? arg = null);
|
||||||
void passOptionalNullableByteWithDefault(optional byte? arg = null);
|
void passOptionalNullableByteWithDefault(optional byte? arg = null);
|
||||||
|
@ -140,6 +178,7 @@ interface TestBinding {
|
||||||
void passOptionalNullableStringWithDefault(optional DOMString? arg = null);
|
void passOptionalNullableStringWithDefault(optional DOMString? arg = null);
|
||||||
// void passOptionalNullableEnumWithDefault(optional TestEnum? arg = null);
|
// void passOptionalNullableEnumWithDefault(optional TestEnum? arg = null);
|
||||||
void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null);
|
void passOptionalNullableInterfaceWithDefault(optional Blob? arg = null);
|
||||||
|
void passOptionalNullableUnionWithDefault(optional (HTMLElement or long)? arg = null);
|
||||||
void passOptionalAnyWithDefault(optional any arg = null);
|
void passOptionalAnyWithDefault(optional any arg = null);
|
||||||
|
|
||||||
void passOptionalNullableBooleanWithNonNullDefault(optional boolean? arg = false);
|
void passOptionalNullableBooleanWithNonNullDefault(optional boolean? arg = false);
|
||||||
|
@ -155,4 +194,5 @@ interface TestBinding {
|
||||||
// void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0);
|
// void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0);
|
||||||
void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = "");
|
void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = "");
|
||||||
// void passOptionalNullableEnumWithNonNullDefault(optional TestEnum? arg = "foo");
|
// void passOptionalNullableEnumWithNonNullDefault(optional TestEnum? arg = "foo");
|
||||||
|
// void passOptionalNullableUnionWithNonNullDefault(optional (HTMLElement or long)? arg = 7);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue