in bindings/scripts/idl_definitions.py [0:0]
def __init__(self, node):
self.attributes = []
self.constants = []
self.constructors = []
self.custom_constructors = []
self.extended_attributes = {}
self.operations = []
self.parent = None
self.serializer = None
self.stringifier = None
self.iterable = None
self.has_indexed_elements = False
self.has_named_property_getter = False
self.maplike = None
self.setlike = None
self.original_interface = None
self.partial_interfaces = []
self.is_callback = bool(node.GetProperty('CALLBACK'))
self.is_partial = bool(node.GetProperty('PARTIAL'))
self.name = node.GetName()
self.idl_type = IdlType(self.name)
has_indexed_property_getter = False
has_integer_typed_length = False
def is_blacklisted_attribute_type(idl_type):
return idl_type.is_callback_function or \
idl_type.is_dictionary or \
idl_type.is_record_type or \
idl_type.is_sequence_type
children = node.GetChildren()
for child in children:
child_class = child.GetClass()
if child_class == 'Attribute':
attr = IdlAttribute(child)
if is_blacklisted_attribute_type(attr.idl_type):
raise ValueError('Type "%s" cannot be used as an attribute.' % attr.idl_type)
if attr.idl_type.is_integer_type and attr.name == 'length':
has_integer_typed_length = True
self.attributes.append(attr)
elif child_class == 'Const':
self.constants.append(IdlConstant(child))
elif child_class == 'ExtAttributes':
extended_attributes = ext_attributes_node_to_extended_attributes(child)
self.constructors, self.custom_constructors = (
extended_attributes_to_constructors(extended_attributes))
clear_constructor_attributes(extended_attributes)
self.extended_attributes = extended_attributes
elif child_class == 'Operation':
op = IdlOperation(child)
if 'getter' in op.specials:
if str(op.arguments[0].idl_type) == 'unsigned long':
has_indexed_property_getter = True
elif str(op.arguments[0].idl_type) == 'DOMString':
self.has_named_property_getter = True
self.operations.append(op)
elif child_class == 'Inherit':
self.parent = child.GetName()
elif child_class == 'Serializer':
self.serializer = IdlSerializer(child)
self.process_serializer()
elif child_class == 'Stringifier':
self.stringifier = IdlStringifier(child)
self.process_stringifier()
elif child_class == 'Iterable':
self.iterable = IdlIterable(child)
elif child_class == 'Maplike':
self.maplike = IdlMaplike(child)
elif child_class == 'Setlike':
self.setlike = IdlSetlike(child)
else:
raise ValueError('Unrecognized node class: %s' % child_class)
if len([_f for _f in [self.iterable, self.maplike, self.setlike] if _f]) > 1:
raise ValueError('Interface can only have one of iterable<>, maplike<> and setlike<>.')
# TODO(rakuco): This validation logic should be in v8_interface according to bashi@.
# At the moment, doing so does not work because several IDL files are partial Window
# interface definitions, and interface_dependency_resolver.py doesn't seem to have any logic
# to prevent these partial interfaces from resetting has_named_property to False.
if 'LegacyUnenumerableNamedProperties' in self.extended_attributes and \
not self.has_named_property_getter:
raise ValueError('[LegacyUnenumerableNamedProperties] can be used only in interfaces '
'that support named properties.')
if has_integer_typed_length and has_indexed_property_getter:
self.has_indexed_elements = True
else:
if self.iterable is not None and self.iterable.key_type is None:
raise ValueError('Value iterators (iterable<V>) must be accompanied by an indexed '
'property getter and an integer-typed length attribute.')