| 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)
|
|
|