diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/bindings/scripts/unstable/idl_definitions_builder.py')
-rw-r--r-- | chromium/third_party/WebKit/Source/bindings/scripts/unstable/idl_definitions_builder.py | 511 |
1 files changed, 0 insertions, 511 deletions
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/unstable/idl_definitions_builder.py b/chromium/third_party/WebKit/Source/bindings/scripts/unstable/idl_definitions_builder.py deleted file mode 100644 index 720c014de24..00000000000 --- a/chromium/third_party/WebKit/Source/bindings/scripts/unstable/idl_definitions_builder.py +++ /dev/null @@ -1,511 +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, IdlUnionType - -SPECIAL_KEYWORD_LIST = ['GETTER', 'SETTER', 'DELETER'] -STANDARD_TYPEDEFS = { - # http://www.w3.org/TR/WebIDL/#common-DOMTimeStamp - 'DOMTimeStamp': 'unsigned long long', -} - -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 = STANDARD_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_type(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' => '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': - attributes.append(attribute_node_to_idl_attribute(child)) - 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): - idl_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': - idl_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(idl_type=idl_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. - idl_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(idl_type=idl_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, idl_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() - - idl_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': - idl_type = type_node_to_type(child) - # FIXME: Doesn't handle nullable arrays (Foo[]?), and arrays of - # nullable (Foo?[]) are treated as nullable arrays. No actual use. - 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, idl_type=idl_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] - idl_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, idl_type=idl_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, idl_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_type(node): - children = node.GetChildren() - if len(children) != 1: - raise ValueError('Typedef node with %s children, expected 1' % len(children)) - child = children[0] - child_class = child.GetClass() - if child_class != 'Type': - raise ValueError('Unrecognized node class: %s' % child_class) - return type_node_to_type(child) - -# 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: move Constructor logic into separate function, instead of modifying - # extended attributes in-place. - 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 - - 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) - # FIXME: should return named_constructor separately; appended for Perl - 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] - idl_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) - idl_type += '[]' - - return idl_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) |