auto merge of #2558 : Ms2ger/servo/mod-unions, r=jdm

This will allow multiple unions to contain the same type.
This commit is contained in:
bors-servo 2014-06-03 12:58:23 -04:00
commit d448e97c6a
4 changed files with 29 additions and 19 deletions

View file

@ -555,7 +555,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
raise TypeError("Can't handle unions as members, we have a "
"holderType")
declType = CGGeneric(type.name)
declType = CGGeneric(type.name + "::" + type.name)
if type.nullable():
declType = CGWrapper(declType, pre="Option<", post=" >")
@ -1657,6 +1657,20 @@ def UnionTypes(descriptors, dictionaries, callbacks, config):
Returns a CGList containing CGUnionStructs for every union.
"""
imports = [
'dom::bindings::utils::unwrap_jsmanaged',
'dom::bindings::codegen::PrototypeList',
'dom::bindings::conversions::FromJSValConvertible',
'dom::bindings::conversions::ToJSValConvertible',
'dom::bindings::conversions::Default',
'dom::bindings::error::throw_not_in_union',
'dom::bindings::js::JS',
'dom::types::*',
'js::jsapi::JSContext',
'js::jsval::JSVal',
'servo_util::str::DOMString',
]
# Now find all the things we'll need as arguments and return values because
# we need to wrap or unwrap them.
unionStructs = dict()
@ -1668,7 +1682,12 @@ def UnionTypes(descriptors, dictionaries, callbacks, config):
name = str(t)
if not name in unionStructs:
provider = descriptor or config.getDescriptorProvider()
unionStructs[name] = CGList([CGUnionStruct(t, provider), CGUnionConversionStruct(t, provider)])
unionStructs[name] = CGNamespace(name,
CGImports(CGList([
CGUnionStruct(t, provider),
CGUnionConversionStruct(t, provider)
]), [], imports),
public=True)
return CGList(SortedDictValues(unionStructs), "\n\n")
@ -4531,7 +4550,7 @@ class CGNativeMember(ClassMethod):
if type.isUnion():
if type.nullable():
type = type.inner
return str(type), False, True
return str(type) + "::" + str(type), False, True
if type.isGeckoInterface() and not type.isCallbackInterface():
iface = type.unroll().inner
@ -5315,20 +5334,6 @@ class GlobalGenRoots():
config.getCallbacks(),
config)
curr = CGImports(curr, [], [
'dom::bindings::utils::unwrap_jsmanaged',
'dom::bindings::codegen::PrototypeList',
'dom::bindings::conversions::FromJSValConvertible',
'dom::bindings::conversions::ToJSValConvertible',
'dom::bindings::conversions::Default',
'dom::bindings::error::throw_not_in_union',
'dom::bindings::js::JS',
'dom::types::*',
'js::jsapi::JSContext',
'js::jsval::JSVal',
'servo_util::str::DOMString',
])
# Add the auto-generated comment.
curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT)

View file

@ -4,7 +4,8 @@
use dom::bindings::codegen::Bindings::HTMLSelectElementBinding;
use dom::bindings::codegen::InheritTypes::HTMLSelectElementDerived;
use dom::bindings::codegen::UnionTypes::{HTMLElementOrLong, HTMLOptionElementOrHTMLOptGroupElement};
use dom::bindings::codegen::UnionTypes::HTMLElementOrLong::HTMLElementOrLong;
use dom::bindings::codegen::UnionTypes::HTMLOptionElementOrHTMLOptGroupElement::HTMLOptionElementOrHTMLOptGroupElement;
use dom::bindings::js::{JSRef, Temporary};
use dom::document::Document;
use dom::element::HTMLSelectElementTypeId;

View file

@ -5,7 +5,9 @@
use dom::bindings::js::{JS, JSRef, Temporary};
use dom::bindings::codegen::Bindings::TestBindingBinding::TestEnum;
use dom::bindings::codegen::Bindings::TestBindingBinding::TestEnumValues::_empty;
use dom::bindings::codegen::UnionTypes::{HTMLElementOrLong, EventOrString};
use dom::bindings::codegen::UnionTypes::BlobOrString::BlobOrString;
use dom::bindings::codegen::UnionTypes::EventOrString::EventOrString;
use dom::bindings::codegen::UnionTypes::HTMLElementOrLong::HTMLElementOrLong;
use dom::bindings::str::ByteString;
use dom::bindings::utils::{Reflector, Reflectable};
use dom::blob::Blob;
@ -139,6 +141,7 @@ pub trait TestBindingMethods {
fn PassInterface(&self, _: &JSRef<Blob>) {}
fn PassUnion(&self, _: HTMLElementOrLong) {}
fn PassUnion2(&self, _: EventOrString) {}
fn PassUnion3(&self, _: BlobOrString) {}
fn PassAny(&self, _: *mut JSContext, _: JSVal) {}
fn PassNullableBoolean(&self, _: Option<bool>) {}

View file

@ -138,6 +138,7 @@ interface TestBinding {
void passInterface(Blob arg);
void passUnion((HTMLElement or long) arg);
void passUnion2((Event or DOMString) data);
void passUnion3((Blob or DOMString) data);
void passAny(any arg);
void passNullableBoolean(boolean? arg);