OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 """Module to manage IDL files.""" | 6 """Module to manage IDL files.""" |
7 | 7 |
8 import copy | 8 import copy |
9 import pickle | 9 import pickle |
10 import logging | 10 import logging |
(...skipping 26 matching lines...) Expand all Loading... |
37 be created. | 37 be created. |
38 """ | 38 """ |
39 self._root_dir = root_dir | 39 self._root_dir = root_dir |
40 if not os.path.exists(root_dir): | 40 if not os.path.exists(root_dir): |
41 _logger.debug('creating root directory %s' % root_dir) | 41 _logger.debug('creating root directory %s' % root_dir) |
42 os.makedirs(root_dir) | 42 os.makedirs(root_dir) |
43 self._all_interfaces = {} | 43 self._all_interfaces = {} |
44 self._interfaces_to_delete = [] | 44 self._interfaces_to_delete = [] |
45 self._enums = {} | 45 self._enums = {} |
46 self._all_dictionaries = {} | 46 self._all_dictionaries = {} |
| 47 # TODO(terry): Hack to remember all typedef unions. |
| 48 self._all_type_defs = {} |
47 | 49 |
48 def Clone(self): | 50 def Clone(self): |
49 new_database = Database(self._root_dir) | 51 new_database = Database(self._root_dir) |
50 new_database._all_interfaces = copy.deepcopy(self._all_interfaces) | 52 new_database._all_interfaces = copy.deepcopy(self._all_interfaces) |
51 new_database._interfaces_to_delete = copy.deepcopy( | 53 new_database._interfaces_to_delete = copy.deepcopy( |
52 self._interfaces_to_delete) | 54 self._interfaces_to_delete) |
53 new_database._enums = copy.deepcopy(self._enums) | 55 new_database._enums = copy.deepcopy(self._enums) |
54 new_database._all_dictionaries = copy.deepcopy(self._all_dictionaries) | 56 new_database._all_dictionaries = copy.deepcopy(self._all_dictionaries) |
| 57 new_database._all_type_defs = copy.deepcopy(self._all_type_defs) |
55 | 58 |
56 return new_database | 59 return new_database |
57 | 60 |
58 def Delete(self): | 61 def Delete(self): |
59 """Deletes the database by deleting its directory""" | 62 """Deletes the database by deleting its directory""" |
60 if os.path.exists(self._root_dir): | 63 if os.path.exists(self._root_dir): |
61 shutil.rmtree(self._root_dir) | 64 shutil.rmtree(self._root_dir) |
62 # reset in-memory constructs | 65 # reset in-memory constructs |
63 self._all_interfaces = {} | 66 self._all_interfaces = {} |
64 | 67 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 raise RuntimeError('Dictionary %s already exists' % dictionary_name) | 278 raise RuntimeError('Dictionary %s already exists' % dictionary_name) |
276 self._all_dictionaries[dictionary_name] = dictionary | 279 self._all_dictionaries[dictionary_name] = dictionary |
277 | 280 |
278 def GetDictionaries(self): | 281 def GetDictionaries(self): |
279 """Returns a list of all loaded dictionaries.""" | 282 """Returns a list of all loaded dictionaries.""" |
280 res = [] | 283 res = [] |
281 for _, dictionary in sorted(self._all_dictionaries.items()): | 284 for _, dictionary in sorted(self._all_dictionaries.items()): |
282 res.append(dictionary) | 285 res.append(dictionary) |
283 return res | 286 return res |
284 | 287 |
| 288 def HasTypeDef(self, type_def_name): |
| 289 """Returns True if the typedef is in memory""" |
| 290 return type_def_name in self._all_type_defs |
| 291 |
| 292 def GetTypeDef(self, type_def_name): |
| 293 """Returns an IDLTypeDef corresponding to the type_def_name |
| 294 from memory. |
| 295 |
| 296 Args: |
| 297 type_def_name -- the name of the typedef. |
| 298 """ |
| 299 if type_def_name not in self._all_type_defs: |
| 300 raise RuntimeError('Typedef %s is not loaded' % type_def_name) |
| 301 return self._all_type_defs[type_def_name] |
| 302 |
| 303 def AddTypeDef(self, type_def): |
| 304 """Add only a typedef that a unions they map to any (no type).""" |
| 305 type_def_name = type_def.id |
| 306 if type_def_name in self._all_type_defs: |
| 307 raise RuntimeError('Typedef %s already exists' % type_def_name) |
| 308 self._all_type_defs[type_def_name] = type_def |
| 309 print ' Added typedef %s' % type_def_name |
| 310 |
285 def TransitiveSecondaryParents(self, interface, propagate_event_target): | 311 def TransitiveSecondaryParents(self, interface, propagate_event_target): |
286 """Returns a list of all non-primary parents. | 312 """Returns a list of all non-primary parents. |
287 | 313 |
288 The list contains the interface objects for interfaces defined in the | 314 The list contains the interface objects for interfaces defined in the |
289 database, and the name for undefined interfaces. | 315 database, and the name for undefined interfaces. |
290 """ | 316 """ |
291 def walk(parents): | 317 def walk(parents): |
292 for parent in parents: | 318 for parent in parents: |
293 parent_name = parent.type.id | 319 parent_name = parent.type.id |
294 if IsDartCollectionType(parent_name): | 320 if IsDartCollectionType(parent_name): |
295 result.append(parent_name) | 321 result.append(parent_name) |
296 continue | 322 continue |
297 if self.HasInterface(parent_name): | 323 if self.HasInterface(parent_name): |
298 parent_interface = self.GetInterface(parent_name) | 324 parent_interface = self.GetInterface(parent_name) |
299 result.append(parent_interface) | 325 result.append(parent_interface) |
300 walk(parent_interface.parents) | 326 walk(parent_interface.parents) |
301 | 327 |
302 result = [] | 328 result = [] |
303 if interface.parents: | 329 if interface.parents: |
304 parent = interface.parents[0] | 330 parent = interface.parents[0] |
305 if (IsPureInterface(parent.type.id) or | 331 if (IsPureInterface(parent.type.id) or |
306 (propagate_event_target and parent.type.id == 'EventTarget')): | 332 (propagate_event_target and parent.type.id == 'EventTarget')): |
307 walk(interface.parents) | 333 walk(interface.parents) |
308 else: | 334 else: |
309 walk(interface.parents[1:]) | 335 walk(interface.parents[1:]) |
310 return result | 336 return result |
311 | 337 |
OLD | NEW |