| 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 # | 47 DEPENDENCY_EXTENDED_ATTRIBUTES = frozenset([ |
| 48 # Paired with the extended attribute name is its value type; needed to be able | 48 'Conditional', |
| 49 # to correctly merge interface-level occurrences with ones that may | 49 'PerContextEnabled', |
| 50 # be present on the method/attribute/constant. | 50 'RuntimeEnabled', |
| 51 DEPENDENCY_EXTENDED_ATTRIBUTES = { | 51 'TypeChecking', |
| 52 'Conditional': 'string', | 52 ]) |
| 53 'PerContextEnabled': 'string', | |
| 54 'RuntimeEnabled': 'string', | |
| 55 'TypeChecking': 'list', | |
| 56 } | |
| 57 | 53 |
| 58 | 54 |
| 59 class InterfaceDependencyResolver(object): | 55 class InterfaceDependencyResolver(object): |
| 60 def __init__(self, interfaces_info, reader): | 56 def __init__(self, interfaces_info, reader): |
| 61 """Initialize dependency resolver. | 57 """Initialize dependency resolver. |
| 62 | 58 |
| 63 Args: | 59 Args: |
| 64 interfaces_info: | 60 interfaces_info: |
| 65 dict of interfaces information, from compute_dependencies.py | 61 dict of interfaces information, from compute_dependencies.py |
| 66 reader: | 62 reader: |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 * applying certain extended attributes from the dependency interface | 237 * applying certain extended attributes from the dependency interface |
| 242 to its members | 238 to its members |
| 243 * storing the C++ class of the implementation in an internal | 239 * storing the C++ class of the implementation in an internal |
| 244 extended attribute of each member, [PartialInterfaceImplementedAs] | 240 extended attribute of each member, [PartialInterfaceImplementedAs] |
| 245 | 241 |
| 246 No return: modifies dependency_interface in place. | 242 No return: modifies dependency_interface in place. |
| 247 """ | 243 """ |
| 248 merged_extended_attributes = dict( | 244 merged_extended_attributes = dict( |
| 249 (key, value) | 245 (key, value) |
| 250 for key, value in dependency_interface.extended_attributes.iteritems() | 246 for key, value in dependency_interface.extended_attributes.iteritems() |
| 251 if key in DEPENDENCY_EXTENDED_ATTRIBUTES.keys()) | 247 if key in DEPENDENCY_EXTENDED_ATTRIBUTES) |
| 252 | 248 |
| 253 # A partial interface's members are implemented as static member functions | 249 # A partial interface's members are implemented as static member functions |
| 254 # in a separate C++ class. This class name is stored in | 250 # in a separate C++ class. This class name is stored in |
| 255 # [PartialInterfaceImplementedAs] which defaults to the basename of | 251 # [PartialInterfaceImplementedAs] which defaults to the basename of |
| 256 # dependency IDL file. | 252 # dependency IDL file. |
| 257 # This class name can be overridden by [ImplementedAs] on the partial | 253 # This class name can be overridden by [ImplementedAs] on the partial |
| 258 # interface definition. | 254 # interface definition. |
| 259 # | 255 # |
| 260 # Note that implemented interfaces do *not* need [ImplementedAs], since | 256 # Note that implemented interfaces do *not* need [ImplementedAs], since |
| 261 # they are implemented on the C++ object |impl| itself, just like members of | 257 # they are implemented on the C++ object |impl| itself, just like members of |
| (...skipping 11 matching lines...) Expand all Loading... |
| 273 # for Blink class name and function name (or constant name), respectively. | 269 # for Blink class name and function name (or constant name), respectively. |
| 274 # Thus we do not want to copy this from the interface to the member, but | 270 # Thus we do not want to copy this from the interface to the member, but |
| 275 # instead extract it and handle it separately. | 271 # instead extract it and handle it separately. |
| 276 if (dependency_interface.is_partial or | 272 if (dependency_interface.is_partial or |
| 277 'LegacyTreatAsPartialInterface' in dependency_interface.extended_attribu
tes): | 273 'LegacyTreatAsPartialInterface' in dependency_interface.extended_attribu
tes): |
| 278 merged_extended_attributes['PartialInterfaceImplementedAs'] = ( | 274 merged_extended_attributes['PartialInterfaceImplementedAs'] = ( |
| 279 dependency_interface.extended_attributes.get( | 275 dependency_interface.extended_attributes.get( |
| 280 'ImplementedAs', dependency_interface_basename)) | 276 'ImplementedAs', dependency_interface_basename)) |
| 281 | 277 |
| 282 def update_attributes(attributes, extras): | 278 def update_attributes(attributes, extras): |
| 283 def to_list(x): | |
| 284 if type(x) is list: | |
| 285 return x | |
| 286 else: | |
| 287 return [x] | |
| 288 | |
| 289 for key, value in extras.items(): | 279 for key, value in extras.items(): |
| 290 if key in attributes: | 280 if key not 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] = to_list(attributes[key]) + to_list(value) | |
| 296 else: | |
| 297 attributes[key] = value | 281 attributes[key] = value |
| 298 | 282 |
| 299 for attribute in dependency_interface.attributes: | 283 for attribute in dependency_interface.attributes: |
| 300 update_attributes(attribute.extended_attributes, merged_extended_attribu
tes) | 284 update_attributes(attribute.extended_attributes, merged_extended_attribu
tes) |
| 301 for constant in dependency_interface.constants: | 285 for constant in dependency_interface.constants: |
| 302 update_attributes(constant.extended_attributes, merged_extended_attribut
es) | 286 update_attributes(constant.extended_attributes, merged_extended_attribut
es) |
| 303 for operation in dependency_interface.operations: | 287 for operation in dependency_interface.operations: |
| 304 update_attributes(operation.extended_attributes, merged_extended_attribu
tes) | 288 update_attributes(operation.extended_attributes, merged_extended_attribu
tes) |
| OLD | NEW |