| OLD | NEW | 
|    1 #!/usr/bin/python |    1 #!/usr/bin/python | 
|    2 # |    2 # | 
|    3 # Copyright (C) 2013 Google Inc. All rights reserved. |    3 # Copyright (C) 2013 Google Inc. All rights reserved. | 
|    4 # |    4 # | 
|    5 # Redistribution and use in source and binary forms, with or without |    5 # Redistribution and use in source and binary forms, with or without | 
|    6 # modification, are permitted provided that the following conditions are |    6 # modification, are permitted provided that the following conditions are | 
|    7 # met: |    7 # met: | 
|    8 # |    8 # | 
|    9 #     * Redistributions of source code must retain the above copyright |    9 #     * Redistributions of source code must retain the above copyright | 
|   10 # notice, this list of conditions and the following disclaimer. |   10 # notice, this list of conditions and the following disclaimer. | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  125     Needed for merging partial_interface_files across components. |  125     Needed for merging partial_interface_files across components. | 
|  126     """ |  126     """ | 
|  127     for key, value in other.iteritems(): |  127     for key, value in other.iteritems(): | 
|  128         if key not in existing: |  128         if key not in existing: | 
|  129             existing[key] = value |  129             existing[key] = value | 
|  130             continue |  130             continue | 
|  131         existing_value = existing[key] |  131         existing_value = existing[key] | 
|  132         for inner_key, inner_value in value.iteritems(): |  132         for inner_key, inner_value in value.iteritems(): | 
|  133             existing_value[inner_key].extend(inner_value) |  133             existing_value[inner_key].extend(inner_value) | 
|  134  |  134  | 
 |  135  | 
|  135 ################################################################################ |  136 ################################################################################ | 
|  136 # Computations |  137 # Computations | 
|  137 ################################################################################ |  138 ################################################################################ | 
|  138  |  139  | 
 |  140 def read_interfaces_info(interfaces_info_individual_filenames): | 
 |  141     # Read in individual info from files | 
 |  142     for interfaces_info_individual_filename in interfaces_info_individual_filena
     mes: | 
 |  143         with open(interfaces_info_individual_filename) as interfaces_info_indivi
     dual_file: | 
 |  144             yield pickle.load(interfaces_info_individual_file) | 
 |  145  | 
|  139  |  146  | 
|  140 def compute_inheritance_info(interface_name): |  147 def compute_inheritance_info(interface_name): | 
|  141     """Compute inheritance information, namely ancestors and inherited extended 
     attributes.""" |  148     """Compute inheritance information, namely ancestors and inherited extended 
     attributes.""" | 
|  142     def generate_ancestors(interface_name): |  149     def generate_ancestors(interface_name): | 
|  143         while interface_name in parent_interfaces: |  150         while interface_name in parent_interfaces: | 
|  144             interface_name = parent_interfaces[interface_name] |  151             interface_name = parent_interfaces[interface_name] | 
|  145             yield interface_name |  152             yield interface_name | 
|  146  |  153  | 
|  147     ancestors = list(generate_ancestors(interface_name)) |  154     ancestors = list(generate_ancestors(interface_name)) | 
|  148     inherited_extended_attributes = inherited_extended_attributes_by_interface[i
     nterface_name] |  155     inherited_extended_attributes = inherited_extended_attributes_by_interface[i
     nterface_name] | 
|  149     for ancestor in ancestors: |  156     for ancestor in ancestors: | 
|  150         # Ancestors may not be present, notably if an ancestor is a generated |  157         # Ancestors may not be present, notably if an ancestor is a generated | 
|  151         # IDL file and we are running this script from run-bindings-tests, |  158         # IDL file and we are running this script from run-bindings-tests, | 
|  152         # where we don't generate these files. |  159         # where we don't generate these files. | 
|  153         ancestor_extended_attributes = inherited_extended_attributes_by_interfac
     e.get(ancestor, {}) |  160         ancestor_extended_attributes = inherited_extended_attributes_by_interfac
     e.get(ancestor, {}) | 
|  154         inherited_extended_attributes.update(ancestor_extended_attributes) |  161         inherited_extended_attributes.update(ancestor_extended_attributes) | 
|  155  |  162  | 
|  156     interfaces_info[interface_name].update({ |  163     interfaces_info[interface_name].update({ | 
|  157         'ancestors': ancestors, |  164         'ancestors': ancestors, | 
|  158         'inherited_extended_attributes': inherited_extended_attributes, |  165         'inherited_extended_attributes': inherited_extended_attributes, | 
|  159     }) |  166     }) | 
|  160  |  167  | 
|  161  |  168  | 
|  162 def compute_interfaces_info_overall(interfaces_info_individual_filenames): |  169 def compute_interfaces_info_overall(info_individuals): | 
|  163     """Compute information about IDL files. |  170     """Compute information about IDL files. | 
|  164  |  171  | 
|  165     Information is stored in global interfaces_info. |  172     Information is stored in global interfaces_info. | 
|  166     """ |  173     """ | 
|  167     # Read in individual info from files |  174     for info in info_individuals: | 
|  168     for interfaces_info_individual_filename in interfaces_info_individual_filena
     mes: |  175         # No overlap between interface names, so ok to use dict.update | 
|  169         with open(interfaces_info_individual_filename) as interfaces_info_indivi
     dual_file: |  176         interfaces_info.update(info['interfaces_info']) | 
|  170             info = pickle.load(interfaces_info_individual_file) |  177         # Interfaces in one component may have partial interfaces in | 
|  171             # No overlap between interface names, so ok to use dict.update |  178         # another component. This is ok (not a layering violation), since | 
|  172             interfaces_info.update(info['interfaces_info']) |  179         # partial interfaces are used to *extend* interfaces. | 
|  173             # Interfaces in one component may have partial interfaces in |  180         # We thus need to update or append if already present | 
|  174             # another component. This is ok (not a layering violation), since |  181         dict_of_dicts_of_lists_update_or_append( | 
|  175             # partial interfaces are used to *extend* interfaces. |  182                 partial_interface_files, info['partial_interface_files']) | 
|  176             # We thus need to update or append if already present |  | 
|  177             dict_of_dicts_of_lists_update_or_append( |  | 
|  178                     partial_interface_files, info['partial_interface_files']) |  | 
|  179  |  183  | 
|  180     # Record inheritance information individually |  184     # Record inheritance information individually | 
|  181     for interface_name, interface_info in interfaces_info.iteritems(): |  185     for interface_name, interface_info in interfaces_info.iteritems(): | 
|  182         extended_attributes = interface_info['extended_attributes'] |  186         extended_attributes = interface_info['extended_attributes'] | 
|  183         inherited_extended_attributes_by_interface[interface_name] = dict( |  187         inherited_extended_attributes_by_interface[interface_name] = dict( | 
|  184                 (key, value) |  188                 (key, value) | 
|  185                 for key, value in extended_attributes.iteritems() |  189                 for key, value in extended_attributes.iteritems() | 
|  186                 if key in INHERITED_EXTENDED_ATTRIBUTES) |  190                 if key in INHERITED_EXTENDED_ATTRIBUTES) | 
|  187         parent = interface_info['parent'] |  191         parent = interface_info['parent'] | 
|  188         if parent: |  192         if parent: | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  248         del interface_info['is_legacy_treat_as_partial_interface'] |  252         del interface_info['is_legacy_treat_as_partial_interface'] | 
|  249         del interface_info['parent'] |  253         del interface_info['parent'] | 
|  250  |  254  | 
|  251  |  255  | 
|  252 ################################################################################ |  256 ################################################################################ | 
|  253  |  257  | 
|  254 def main(): |  258 def main(): | 
|  255     options, args = parse_options() |  259     options, args = parse_options() | 
|  256     # args = Input1, Input2, ..., Output |  260     # args = Input1, Input2, ..., Output | 
|  257     interfaces_info_filename = args.pop() |  261     interfaces_info_filename = args.pop() | 
 |  262     info_individuals = read_interfaces_info(args) | 
|  258  |  263  | 
|  259     compute_interfaces_info_overall(args) |  264     compute_interfaces_info_overall(info_individuals) | 
|  260     write_pickle_file(interfaces_info_filename, |  265     write_pickle_file(interfaces_info_filename, | 
|  261                       interfaces_info, |  266                       interfaces_info, | 
|  262                       options.write_file_only_if_changed) |  267                       options.write_file_only_if_changed) | 
|  263  |  268  | 
|  264  |  269  | 
|  265 if __name__ == '__main__': |  270 if __name__ == '__main__': | 
|  266     sys.exit(main()) |  271     sys.exit(main()) | 
| OLD | NEW |