OLD | NEW |
---|---|
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 26 matching lines...) Expand all Loading... | |
37 """ | 37 """ |
38 | 38 |
39 import os.path | 39 import os.path |
40 from utilities import idl_filename_to_component, is_valid_component_dependency | 40 from utilities import idl_filename_to_component, is_valid_component_dependency |
41 | 41 |
42 # The following extended attributes can be applied to a dependency interface, | 42 # The following extended attributes can be applied to a dependency interface, |
43 # and are then applied to the individual members when merging. | 43 # and are then applied to the individual members when merging. |
44 # Note that this moves the extended attribute from the interface to the member, | 44 # Note that this moves the extended attribute from the interface to the member, |
45 # which changes the semantics and yields different code than the same extended | 45 # which changes the semantics and yields different code than the same extended |
46 # attribute on the main interface. | 46 # attribute on the main interface. |
47 DEPENDENCY_EXTENDED_ATTRIBUTES = set([ | 47 # |
48 'Conditional', | 48 # Paired with the extended attribute name is its value type; needed to be able |
49 'PerContextEnabled', | 49 # to correctly merge interface-level occurrences with ones that may |
50 'RuntimeEnabled', | 50 # be present on the method/attribute/constant. |
51 ]) | 51 DEPENDENCY_EXTENDED_ATTRIBUTES = { |
52 'Conditional': 'string', | |
53 'PerContextEnabled': 'string', | |
54 'RuntimeEnabled': 'string', | |
55 'TypeChecking': 'list', | |
56 } | |
52 | 57 |
53 | 58 |
54 class InterfaceDependencyResolver(object): | 59 class InterfaceDependencyResolver(object): |
55 def __init__(self, interfaces_info, reader): | 60 def __init__(self, interfaces_info, reader): |
56 """Initialize dependency resolver. | 61 """Initialize dependency resolver. |
57 | 62 |
58 Args: | 63 Args: |
59 interfaces_info: | 64 interfaces_info: |
60 dict of interfaces information, from compute_dependencies.py | 65 dict of interfaces information, from compute_dependencies.py |
61 reader: | 66 reader: |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
236 * applying certain extended attributes from the dependency interface | 241 * applying certain extended attributes from the dependency interface |
237 to its members | 242 to its members |
238 * storing the C++ class of the implementation in an internal | 243 * storing the C++ class of the implementation in an internal |
239 extended attribute of each member, [PartialInterfaceImplementedAs] | 244 extended attribute of each member, [PartialInterfaceImplementedAs] |
240 | 245 |
241 No return: modifies dependency_interface in place. | 246 No return: modifies dependency_interface in place. |
242 """ | 247 """ |
243 merged_extended_attributes = dict( | 248 merged_extended_attributes = dict( |
244 (key, value) | 249 (key, value) |
245 for key, value in dependency_interface.extended_attributes.iteritems() | 250 for key, value in dependency_interface.extended_attributes.iteritems() |
246 if key in DEPENDENCY_EXTENDED_ATTRIBUTES) | 251 if key in DEPENDENCY_EXTENDED_ATTRIBUTES.keys()) |
247 | 252 |
248 # A partial interface's members are implemented as static member functions | 253 # A partial interface's members are implemented as static member functions |
249 # in a separate C++ class. This class name is stored in | 254 # in a separate C++ class. This class name is stored in |
250 # [PartialInterfaceImplementedAs] which defaults to the basename of | 255 # [PartialInterfaceImplementedAs] which defaults to the basename of |
251 # dependency IDL file. | 256 # dependency IDL file. |
252 # This class name can be overridden by [ImplementedAs] on the partial | 257 # This class name can be overridden by [ImplementedAs] on the partial |
253 # interface definition. | 258 # interface definition. |
254 # | 259 # |
255 # Note that implemented interfaces do *not* need [ImplementedAs], since | 260 # Note that implemented interfaces do *not* need [ImplementedAs], since |
256 # they are implemented on the C++ object |impl| itself, just like members of | 261 # they are implemented on the C++ object |impl| itself, just like members of |
(...skipping 10 matching lines...) Expand all Loading... | |
267 # and members: | 272 # and members: |
268 # for Blink class name and function name (or constant name), respectively. | 273 # for Blink class name and function name (or constant name), respectively. |
269 # Thus we do not want to copy this from the interface to the member, but | 274 # Thus we do not want to copy this from the interface to the member, but |
270 # instead extract it and handle it separately. | 275 # instead extract it and handle it separately. |
271 if (dependency_interface.is_partial or | 276 if (dependency_interface.is_partial or |
272 'LegacyTreatAsPartialInterface' in dependency_interface.extended_attribu tes): | 277 'LegacyTreatAsPartialInterface' in dependency_interface.extended_attribu tes): |
273 merged_extended_attributes['PartialInterfaceImplementedAs'] = ( | 278 merged_extended_attributes['PartialInterfaceImplementedAs'] = ( |
274 dependency_interface.extended_attributes.get( | 279 dependency_interface.extended_attributes.get( |
275 'ImplementedAs', dependency_interface_basename)) | 280 'ImplementedAs', dependency_interface_basename)) |
276 | 281 |
282 def update_attributes(attributes, extras): | |
283 def toList(x): | |
bashi
2015/02/23 01:54:11
nit: toList() -> to_list()
sof
2015/02/23 06:08:55
thanks, done.
| |
284 if type(x) is list: | |
285 return x | |
286 else: | |
287 return [x] | |
288 | |
289 for key, value in extras.items(): | |
290 if key in attributes: | |
291 # Interface-level extended attributes do not take precedence | |
292 # over same attribute at the method/attribute/const-level. | |
293 # If the attribute value is a list, the two are combined. | |
294 if DEPENDENCY_EXTENDED_ATTRIBUTES[key] == 'list': | |
295 attributes[key] = toList(attributes[key]) + toList(value) | |
296 else: | |
297 attributes[key] = value | |
298 | |
277 for attribute in dependency_interface.attributes: | 299 for attribute in dependency_interface.attributes: |
278 attribute.extended_attributes.update(merged_extended_attributes) | 300 update_attributes(attribute.extended_attributes, merged_extended_attribu tes) |
279 for constant in dependency_interface.constants: | 301 for constant in dependency_interface.constants: |
280 constant.extended_attributes.update(merged_extended_attributes) | 302 update_attributes(constant.extended_attributes, merged_extended_attribut es) |
281 for operation in dependency_interface.operations: | 303 for operation in dependency_interface.operations: |
282 operation.extended_attributes.update(merged_extended_attributes) | 304 update_attributes(operation.extended_attributes, merged_extended_attribu tes) |
OLD | NEW |