| Index: Source/bindings/scripts/idl_definitions_builder.py
 | 
| diff --git a/Source/bindings/scripts/idl_definitions_builder.py b/Source/bindings/scripts/idl_definitions_builder.py
 | 
| deleted file mode 100644
 | 
| index 4c83e81ce8a5d7064e6c55a724840fbb3cf5af45..0000000000000000000000000000000000000000
 | 
| --- a/Source/bindings/scripts/idl_definitions_builder.py
 | 
| +++ /dev/null
 | 
| @@ -1,525 +0,0 @@
 | 
| -# Copyright (C) 2013 Google Inc. All rights reserved.
 | 
| -#
 | 
| -# Redistribution and use in source and binary forms, with or without
 | 
| -# modification, are permitted provided that the following conditions are
 | 
| -# met:
 | 
| -#
 | 
| -#     * Redistributions of source code must retain the above copyright
 | 
| -# notice, this list of conditions and the following disclaimer.
 | 
| -#     * Redistributions in binary form must reproduce the above
 | 
| -# copyright notice, this list of conditions and the following disclaimer
 | 
| -# in the documentation and/or other materials provided with the
 | 
| -# distribution.
 | 
| -#     * Neither the name of Google Inc. nor the names of its
 | 
| -# contributors may be used to endorse or promote products derived from
 | 
| -# this software without specific prior written permission.
 | 
| -#
 | 
| -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
| -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
| -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
| -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
| -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
| -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
| -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
| -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
| -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
| -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
| -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
| -
 | 
| -"""Builds an IdlDefinitions object from an AST (produced by blink_idl_parser)."""
 | 
| -
 | 
| -import os
 | 
| -
 | 
| -from idl_definitions import IdlDefinitions, IdlInterface, IdlException, IdlOperation, IdlCallbackFunction, IdlArgument, IdlAttribute, IdlConstant, IdlEnum, IdlTypedef, IdlUnionType
 | 
| -
 | 
| -SPECIAL_KEYWORD_LIST = ['GETTER', 'SETTER', 'DELETER']
 | 
| -
 | 
| -
 | 
| -def build_idl_definitions_from_ast(node):
 | 
| -    if node is None:
 | 
| -        return None
 | 
| -    node_class = node.GetClass()
 | 
| -    if node_class != 'File':
 | 
| -        raise ValueError('Unrecognized node class: %s' % node_class)
 | 
| -    return file_node_to_idl_definitions(node)
 | 
| -
 | 
| -
 | 
| -def file_node_to_idl_definitions(node):
 | 
| -    callback_functions = {}
 | 
| -    enumerations = {}
 | 
| -    exceptions = {}
 | 
| -    interfaces = {}
 | 
| -    typedefs = {}
 | 
| -
 | 
| -    # FIXME: only needed for Perl, remove later
 | 
| -    file_name = os.path.abspath(node.GetName())
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Interface':
 | 
| -            interface = interface_node_to_idl_interface(child)
 | 
| -            interfaces[interface.name] = interface
 | 
| -        elif child_class == 'Exception':
 | 
| -            exception = exception_node_to_idl_exception(child)
 | 
| -            exceptions[exception.name] = exception
 | 
| -        elif child_class == 'Typedef':
 | 
| -            type_name = child.GetName()
 | 
| -            typedefs[type_name] = typedef_node_to_idl_typedef(child)
 | 
| -        elif child_class == 'Enum':
 | 
| -            enumeration = enum_node_to_idl_enum(child)
 | 
| -            enumerations[enumeration.name] = enumeration
 | 
| -        elif child_class == 'Callback':
 | 
| -            callback_function = callback_node_to_idl_callback_function(child)
 | 
| -            callback_functions[callback_function.name] = callback_function
 | 
| -        elif child_class == 'Implements':
 | 
| -            # Implements is handled at the interface merging step
 | 
| -            pass
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlDefinitions(callback_functions=callback_functions, enumerations=enumerations, exceptions=exceptions, file_name=file_name, interfaces=interfaces, typedefs=typedefs)
 | 
| -
 | 
| -# Constructors for Interface definitions and interface members
 | 
| -
 | 
| -
 | 
| -def interface_node_to_idl_interface(node):
 | 
| -    attributes = []
 | 
| -    constants = []
 | 
| -    constructors = None
 | 
| -    custom_constructors = None
 | 
| -    extended_attributes = None
 | 
| -    operations = []
 | 
| -    is_callback = node.GetProperty('CALLBACK') or False
 | 
| -    # FIXME: uppercase 'Partial' in base IDL parser
 | 
| -    is_partial = node.GetProperty('Partial') or False
 | 
| -    name = node.GetName()
 | 
| -    parent = None
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Attribute':
 | 
| -            attribute = attribute_node_to_idl_attribute(child)
 | 
| -            # FIXME: This is a hack to support [CustomConstructor] for
 | 
| -            # window.HTMLImageElement. Remove the hack.
 | 
| -            clear_constructor_attributes(attribute.extended_attributes)
 | 
| -            attributes.append(attribute)
 | 
| -        elif child_class == 'Const':
 | 
| -            constants.append(constant_node_to_idl_constant(child))
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -            constructors, custom_constructors = extended_attributes_to_constructors(extended_attributes)
 | 
| -            clear_constructor_attributes(extended_attributes)
 | 
| -        elif child_class == 'Operation':
 | 
| -            operations.append(operation_node_to_idl_operation(child))
 | 
| -        elif child_class == 'Inherit':
 | 
| -            parent = child.GetName()
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlInterface(name=name, attributes=attributes, constants=constants, constructors=constructors, custom_constructors=custom_constructors, extended_attributes=extended_attributes, operations=operations, is_callback=is_callback, is_partial=is_partial, parent=parent)
 | 
| -
 | 
| -
 | 
| -def attribute_node_to_idl_attribute(node):
 | 
| -    data_type = None
 | 
| -    extended_attributes = {}
 | 
| -    is_nullable = False
 | 
| -    is_read_only = node.GetProperty('READONLY') or False
 | 
| -    is_static = node.GetProperty('STATIC') or False
 | 
| -    name = node.GetName()
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Type':
 | 
| -            data_type = type_node_to_type(child)
 | 
| -            is_nullable = child.GetProperty('NULLABLE') or False
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlAttribute(data_type=data_type, extended_attributes=extended_attributes, is_nullable=is_nullable, is_read_only=is_read_only, is_static=is_static, name=name)
 | 
| -
 | 
| -
 | 
| -def constant_node_to_idl_constant(node):
 | 
| -    name = node.GetName()
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    num_children = len(children)
 | 
| -    if num_children < 2 or num_children > 3:
 | 
| -        raise ValueError('Expected 2 or 3 children, got %s' % num_children)
 | 
| -
 | 
| -    type_node = children[0]
 | 
| -    # ConstType is more limited than Type, so subtree is smaller and we don't
 | 
| -    # use the full type_node_to_type function.
 | 
| -    data_type = type_node_inner_to_type(type_node)
 | 
| -
 | 
| -    value_node = children[1]
 | 
| -    value_node_class = value_node.GetClass()
 | 
| -    if value_node_class != 'Value':
 | 
| -        raise ValueError('Expected Value node, got %s' % value_node_class)
 | 
| -    value = value_node.GetName()
 | 
| -
 | 
| -    extended_attributes = None
 | 
| -    if num_children == 3:
 | 
| -        ext_attributes_node = children[2]
 | 
| -        extended_attributes = ext_attributes_node_to_extended_attributes(ext_attributes_node)
 | 
| -
 | 
| -    return IdlConstant(data_type=data_type, extended_attributes=extended_attributes, name=name, value=value)
 | 
| -
 | 
| -
 | 
| -def operation_node_to_idl_operation(node):
 | 
| -    name = node.GetName()
 | 
| -    # FIXME: AST should use None internally
 | 
| -    if name == '_unnamed_':
 | 
| -        name = None
 | 
| -
 | 
| -    is_static = node.GetProperty('STATIC') or False
 | 
| -    specials = []
 | 
| -    property_dictionary = node.GetProperties()
 | 
| -    for special_keyword in SPECIAL_KEYWORD_LIST:
 | 
| -        if special_keyword in property_dictionary:
 | 
| -            specials.append(special_keyword.lower())
 | 
| -
 | 
| -    extended_attributes = None
 | 
| -    arguments = []
 | 
| -    return_type = None
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Arguments':
 | 
| -            arguments = arguments_node_to_arguments(child)
 | 
| -        elif child_class == 'Type':
 | 
| -            return_type = type_node_to_type(child)
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlOperation(name=name, data_type=return_type, extended_attributes=extended_attributes, is_static=is_static, arguments=arguments, specials=specials)
 | 
| -
 | 
| -
 | 
| -def arguments_node_to_arguments(node):
 | 
| -    # [Constructor] and [CustomConstructor] without arguments (the bare form)
 | 
| -    # have None instead of an arguments node, but have the same meaning as using
 | 
| -    # an empty argument list, [Constructor()], so special-case this.
 | 
| -    # http://www.w3.org/TR/WebIDL/#Constructor
 | 
| -    if node is None:
 | 
| -        return []
 | 
| -    arguments = []
 | 
| -    argument_node_list = node.GetChildren()
 | 
| -    for argument_node in argument_node_list:
 | 
| -        arguments.append(argument_node_to_idl_argument(argument_node))
 | 
| -    return arguments
 | 
| -
 | 
| -
 | 
| -def argument_node_to_idl_argument(node):
 | 
| -    name = node.GetName()
 | 
| -
 | 
| -    data_type = None
 | 
| -    extended_attributes = {}
 | 
| -    # FIXME: Boolean values are inconsistent due to Perl compatibility.
 | 
| -    # Make all default to False once Perl removed.
 | 
| -    is_nullable = False
 | 
| -    is_optional = node.GetProperty('OPTIONAL')
 | 
| -    is_variadic = None
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Type':
 | 
| -            data_type = type_node_to_type(child)
 | 
| -            is_nullable = child.GetProperty('NULLABLE')
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -        elif child_class == 'Argument':
 | 
| -            child_name = child.GetName()
 | 
| -            if child_name != '...':
 | 
| -                raise ValueError('Unrecognized Argument node; expected "...", got "%s"' % child_name)
 | 
| -            is_variadic = child.GetProperty('ELLIPSIS') or False
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlArgument(name=name, data_type=data_type, extended_attributes=extended_attributes, is_nullable=is_nullable, is_optional=is_optional, is_variadic=is_variadic)
 | 
| -
 | 
| -# Constructors for for non-interface definitions
 | 
| -
 | 
| -
 | 
| -def callback_node_to_idl_callback_function(node):
 | 
| -    name = node.GetName()
 | 
| -    children = node.GetChildren()
 | 
| -    num_children = len(children)
 | 
| -    if num_children != 2:
 | 
| -        raise ValueError('Expected 2 children, got %s' % num_children)
 | 
| -
 | 
| -    type_node = children[0]
 | 
| -    data_type = type_node_to_type(type_node)
 | 
| -
 | 
| -    arguments_node = children[1]
 | 
| -    arguments_node_class = arguments_node.GetClass()
 | 
| -    if arguments_node_class != 'Arguments':
 | 
| -        raise ValueError('Expected Value node, got %s' % arguments_node_class)
 | 
| -    arguments = arguments_node_to_arguments(arguments_node)
 | 
| -
 | 
| -    return IdlCallbackFunction(name=name, data_type=data_type, arguments=arguments)
 | 
| -
 | 
| -
 | 
| -def enum_node_to_idl_enum(node):
 | 
| -    name = node.GetName()
 | 
| -    values = []
 | 
| -    for child in node.GetChildren():
 | 
| -        values.append(child.GetName())
 | 
| -    return IdlEnum(name=name, values=values)
 | 
| -
 | 
| -
 | 
| -def exception_operation_node_to_idl_operation(node):
 | 
| -    # Needed to handle one case in DOMException.idl:
 | 
| -    # // Override in a Mozilla compatible format
 | 
| -    # [NotEnumerable] DOMString toString();
 | 
| -    # FIXME: can we remove this? replace with a stringifier?
 | 
| -    extended_attributes = {}
 | 
| -    name = node.GetName()
 | 
| -    children = node.GetChildren()
 | 
| -    if len(children) < 1 or len(children) > 2:
 | 
| -        raise ValueError('ExceptionOperation node with %s children, expected 1 or 2' % len(children))
 | 
| -
 | 
| -    type_node = children[0]
 | 
| -    return_type = type_node_to_type(type_node)
 | 
| -
 | 
| -    if len(children) > 1:
 | 
| -        ext_attributes_node = children[1]
 | 
| -        extended_attributes = ext_attributes_node_to_extended_attributes(ext_attributes_node)
 | 
| -
 | 
| -    return IdlOperation(name=name, data_type=return_type, extended_attributes=extended_attributes)
 | 
| -
 | 
| -
 | 
| -def exception_node_to_idl_exception(node):
 | 
| -    # Exceptions are similar to Interfaces, but simpler
 | 
| -    attributes = []
 | 
| -    constants = []
 | 
| -    extended_attributes = None
 | 
| -    operations = []
 | 
| -    name = node.GetName()
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Attribute':
 | 
| -            attribute = attribute_node_to_idl_attribute(child)
 | 
| -            attributes.append(attribute)
 | 
| -        elif child_class == 'Const':
 | 
| -            constants.append(constant_node_to_idl_constant(child))
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -        elif child_class == 'ExceptionOperation':
 | 
| -            operations.append(exception_operation_node_to_idl_operation(child))
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlException(name=name, attributes=attributes, constants=constants, extended_attributes=extended_attributes, operations=operations)
 | 
| -
 | 
| -
 | 
| -def typedef_node_to_idl_typedef(node):
 | 
| -    data_type = None
 | 
| -    extended_attributes = None
 | 
| -
 | 
| -    children = node.GetChildren()
 | 
| -    for child in children:
 | 
| -        child_class = child.GetClass()
 | 
| -        if child_class == 'Type':
 | 
| -            data_type = type_node_to_type(child)
 | 
| -        elif child_class == 'ExtAttributes':
 | 
| -            extended_attributes = ext_attributes_node_to_extended_attributes(child)
 | 
| -            raise ValueError('Extended attributes in a typedef are untested!')
 | 
| -        else:
 | 
| -            raise ValueError('Unrecognized node class: %s' % child_class)
 | 
| -
 | 
| -    return IdlTypedef(data_type=data_type, extended_attributes=extended_attributes)
 | 
| -
 | 
| -# Extended attributes
 | 
| -
 | 
| -
 | 
| -def ext_attributes_node_to_extended_attributes(node):
 | 
| -    """
 | 
| -    Returns:
 | 
| -      Dictionary of {ExtAttributeName: ExtAttributeValue}.
 | 
| -      Value is usually a string, with three exceptions:
 | 
| -      Constructors: value is a list of Arguments nodes, corresponding to
 | 
| -      possibly signatures of the constructor.
 | 
| -      CustomConstructors: value is a list of Arguments nodes, corresponding to
 | 
| -      possibly signatures of the custom constructor.
 | 
| -      NamedConstructor: value is a Call node, corresponding to the single
 | 
| -      signature of the named constructor.
 | 
| -    """
 | 
| -    # Primarily just make a dictionary from the children.
 | 
| -    # The only complexity is handling various types of constructors:
 | 
| -    # Constructors and Custom Constructors can have duplicate entries due to
 | 
| -    # overloading, and thus are stored in temporary lists.
 | 
| -    # However, Named Constructors cannot be overloaded, and thus do not have
 | 
| -    # a list.
 | 
| -    # FIXME: Add overloading for Named Constructors and remove custom bindings
 | 
| -    # for HTMLImageElement
 | 
| -    constructors = []
 | 
| -    custom_constructors = []
 | 
| -    extended_attributes = {}
 | 
| -
 | 
| -    attribute_list = node.GetChildren()
 | 
| -    for attribute in attribute_list:
 | 
| -        name = attribute.GetName()
 | 
| -        children = attribute.GetChildren()
 | 
| -        if name in ['Constructor', 'CustomConstructor', 'NamedConstructor']:
 | 
| -            child = None
 | 
| -            child_class = None
 | 
| -            if children:
 | 
| -                if len(children) > 1:
 | 
| -                    raise ValueError('ExtAttributes node with %s children, expected at most 1' % len(children))
 | 
| -                child = children[0]
 | 
| -                child_class = child.GetClass()
 | 
| -            if name == 'Constructor':
 | 
| -                if child_class and child_class != 'Arguments':
 | 
| -                    raise ValueError('Constructor only supports Arguments as child, but has child of class: %s' % child_class)
 | 
| -                constructors.append(child)
 | 
| -            elif name == 'CustomConstructor':
 | 
| -                if child_class and child_class != 'Arguments':
 | 
| -                    raise ValueError('Custom Constructor only supports Arguments as child, but has child of class: %s' % child_class)
 | 
| -                custom_constructors.append(child)
 | 
| -            else:  # name == 'NamedConstructor'
 | 
| -                if child_class and child_class != 'Call':
 | 
| -                    raise ValueError('Named Constructor only supports Call as child, but has child of class: %s' % child_class)
 | 
| -                extended_attributes[name] = child
 | 
| -        elif children:
 | 
| -            raise ValueError('Non-constructor ExtAttributes node with children: %s' % name)
 | 
| -        else:
 | 
| -            value = attribute.GetProperty('VALUE')
 | 
| -            extended_attributes[name] = value
 | 
| -
 | 
| -    # Store constructors and custom constructors in special list attributes,
 | 
| -    # which are deleted later. Note plural in key.
 | 
| -    if constructors:
 | 
| -        extended_attributes['Constructors'] = constructors
 | 
| -    if custom_constructors:
 | 
| -        extended_attributes['CustomConstructors'] = custom_constructors
 | 
| -
 | 
| -    return extended_attributes
 | 
| -
 | 
| -
 | 
| -def extended_attributes_to_constructors(extended_attributes):
 | 
| -    """Returns constructors and custom_constructors (lists of IdlOperations).
 | 
| -
 | 
| -    Auxiliary function for interface_node_to_idl_interface.
 | 
| -    """
 | 
| -    constructors = []
 | 
| -    custom_constructors = []
 | 
| -    if 'Constructors' in extended_attributes:
 | 
| -        constructor_list = extended_attributes['Constructors']
 | 
| -        # If not overloaded, have index 0, otherwise index from 1
 | 
| -        overloaded_index = 0 if len(constructor_list) == 1 else 1
 | 
| -        for arguments_node in constructor_list:
 | 
| -            name = 'Constructor'
 | 
| -            arguments = arguments_node_to_arguments(arguments_node)
 | 
| -            constructor = IdlOperation(name=name, extended_attributes=extended_attributes, overloaded_index=overloaded_index, arguments=arguments)
 | 
| -            constructors.append(constructor)
 | 
| -            overloaded_index += 1
 | 
| -
 | 
| -        # Prefix 'CallWith' and 'RaisesException' with 'Constructor'
 | 
| -        # FIXME: Change extended attributes to include prefix explicitly.
 | 
| -        if 'CallWith' in extended_attributes:
 | 
| -            extended_attributes['ConstructorCallWith'] = extended_attributes['CallWith']
 | 
| -            del extended_attributes['CallWith']
 | 
| -        if 'RaisesException' in extended_attributes:
 | 
| -            extended_attributes['ConstructorRaisesException'] = extended_attributes['RaisesException']
 | 
| -            del extended_attributes['RaisesException']
 | 
| -
 | 
| -    if 'CustomConstructors' in extended_attributes:
 | 
| -        custom_constructor_list = extended_attributes['CustomConstructors']
 | 
| -        # If not overloaded, have index 0, otherwise index from 1
 | 
| -        overloaded_index = 0 if len(custom_constructor_list) == 1 else 1
 | 
| -        for arguments_node in custom_constructor_list:
 | 
| -            name = 'CustomConstructor'
 | 
| -            arguments = arguments_node_to_arguments(arguments_node)
 | 
| -            custom_constructor = IdlOperation(name=name, extended_attributes=extended_attributes, overloaded_index=overloaded_index, arguments=arguments)
 | 
| -            custom_constructors.append(custom_constructor)
 | 
| -            overloaded_index += 1
 | 
| -
 | 
| -    if 'NamedConstructor' in extended_attributes:
 | 
| -        name = 'NamedConstructor'
 | 
| -        call_node = extended_attributes['NamedConstructor']
 | 
| -        extended_attributes['NamedConstructor'] = call_node.GetName()
 | 
| -        overloaded_index = None  # named constructors are not overloaded
 | 
| -        children = call_node.GetChildren()
 | 
| -        if len(children) != 1:
 | 
| -            raise ValueError('NamedConstructor node expects 1 child, got %s.' % len(children))
 | 
| -        arguments_node = children[0]
 | 
| -        arguments = arguments_node_to_arguments(arguments_node)
 | 
| -        named_constructor = IdlOperation(name=name, extended_attributes=extended_attributes, overloaded_index=overloaded_index, arguments=arguments)
 | 
| -        constructors.append(named_constructor)
 | 
| -
 | 
| -    return constructors, custom_constructors
 | 
| -
 | 
| -
 | 
| -def clear_constructor_attributes(extended_attributes):
 | 
| -    # Deletes Constructor*s* (plural), sets Constructor (singular)
 | 
| -    if 'Constructors' in extended_attributes:
 | 
| -        del extended_attributes['Constructors']
 | 
| -        extended_attributes['Constructor'] = None
 | 
| -    if 'CustomConstructors' in extended_attributes:
 | 
| -        del extended_attributes['CustomConstructors']
 | 
| -        extended_attributes['CustomConstructor'] = None
 | 
| -
 | 
| -
 | 
| -# Types
 | 
| -
 | 
| -
 | 
| -def type_node_to_type(node):
 | 
| -    children = node.GetChildren()
 | 
| -    if len(children) < 1 or len(children) > 2:
 | 
| -        raise ValueError('Type node expects 1 or 2 children (type + optional array []), got %s (multi-dimensional arrays are not supported).' % len(children))
 | 
| -
 | 
| -    type_node_child = children[0]
 | 
| -    data_type = type_node_inner_to_type(type_node_child)
 | 
| -
 | 
| -    if len(children) == 2:
 | 
| -        array_node = children[1]
 | 
| -        array_node_class = array_node.GetClass()
 | 
| -        if array_node_class != 'Array':
 | 
| -            raise ValueError('Expected Array node as TypeSuffix, got %s node.' % array_node_class)
 | 
| -        data_type += '[]'
 | 
| -
 | 
| -    return data_type
 | 
| -
 | 
| -
 | 
| -def type_node_inner_to_type(node):
 | 
| -    node_class = node.GetClass()
 | 
| -    # Note Type*r*ef, not Typedef, meaning the type is an identifier, thus
 | 
| -    # either a typedef shorthand (but not a Typedef declaration itself) or an
 | 
| -    # interface type. We do not distinguish these, and just use the type name.
 | 
| -    if node_class in ['PrimitiveType', 'Typeref']:
 | 
| -        return node.GetName()
 | 
| -    elif node_class == 'Any':
 | 
| -        return 'any'
 | 
| -    elif node_class == 'Sequence':
 | 
| -        return sequence_node_to_type(node)
 | 
| -    elif node_class == 'UnionType':
 | 
| -        return union_type_node_to_idl_union_type(node)
 | 
| -    raise ValueError('Unrecognized node class: %s' % node_class)
 | 
| -
 | 
| -
 | 
| -def sequence_node_to_type(node):
 | 
| -    children = node.GetChildren()
 | 
| -    if len(children) != 1:
 | 
| -        raise ValueError('Sequence node expects exactly 1 child, got %s' % len(children))
 | 
| -    sequence_child = children[0]
 | 
| -    sequence_child_class = sequence_child.GetClass()
 | 
| -    if sequence_child_class != 'Type':
 | 
| -        raise ValueError('Unrecognized node class: %s' % sequence_child_class)
 | 
| -    sequence_type = type_node_to_type(sequence_child)
 | 
| -    return 'sequence<%s>' % sequence_type
 | 
| -
 | 
| -
 | 
| -def union_type_node_to_idl_union_type(node):
 | 
| -    union_member_types = []
 | 
| -    for member_type_node in node.GetChildren():
 | 
| -        member_type = type_node_to_type(member_type_node)
 | 
| -        union_member_types.append(member_type)
 | 
| -    return IdlUnionType(union_member_types=union_member_types)
 | 
| 
 |