| 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 |