OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, 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 """This module generates Dart APIs from the IDL database.""" | 6 """This module generates Dart APIs from the IDL database.""" |
7 | 7 |
8 import emitter | 8 import emitter |
9 import idlnode | 9 import idlnode |
10 import logging | 10 import logging |
11 import multiemitter | 11 import multiemitter |
12 import os | 12 import os |
13 import re | 13 import re |
14 import shutil | 14 import shutil |
15 from generator import * | 15 from generator import * |
16 from systembase import * | 16 from systembase import * |
17 from systemfrog import * | 17 from systemfrog import * |
18 from systemhtml import * | 18 from systemhtml import * |
19 from systeminterface import * | 19 from systeminterface import * |
20 from systemnative import * | 20 from systemnative import * |
21 from systemwrapping import * | 21 from systemwrapping import * |
| 22 from templateloader import TemplateLoader |
22 | 23 |
23 _logger = logging.getLogger('dartgenerator') | 24 _logger = logging.getLogger('dartgenerator') |
24 | 25 |
25 def MergeNodes(node, other): | 26 def MergeNodes(node, other): |
26 node.operations.extend(other.operations) | 27 node.operations.extend(other.operations) |
27 for attribute in other.attributes: | 28 for attribute in other.attributes: |
28 if not node.has_attribute(attribute): | 29 if not node.has_attribute(attribute): |
29 node.attributes.append(attribute) | 30 node.attributes.append(attribute) |
30 | 31 |
31 node.constants.extend(other.constants) | 32 node.constants.extend(other.constants) |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 frog_system = FrogSystem( | 276 frog_system = FrogSystem( |
276 TemplateLoader(self._template_dir, ['dom/frog', 'dom', '']), | 277 TemplateLoader(self._template_dir, ['dom/frog', 'dom', '']), |
277 self._database, self._emitters, self._output_dir) | 278 self._database, self._emitters, self._output_dir) |
278 | 279 |
279 frog_system._interface_system = interface_system | 280 frog_system._interface_system = interface_system |
280 self._systems.append(frog_system) | 281 self._systems.append(frog_system) |
281 | 282 |
282 if 'htmlfrog' in systems: | 283 if 'htmlfrog' in systems: |
283 html_system = HtmlFrogSystem( | 284 html_system = HtmlFrogSystem( |
284 TemplateLoader(self._template_dir, | 285 TemplateLoader(self._template_dir, |
285 ['html/frog', 'html/impl', 'html', '']), | 286 ['html/frog', 'html/impl', 'html', ''], |
| 287 {'DARTIUM': False, 'FROG': True}), |
286 self._database, self._emitters, self._output_dir, self) | 288 self._database, self._emitters, self._output_dir, self) |
287 | 289 |
288 html_system._interface_system = html_interface_system | 290 html_system._interface_system = html_interface_system |
289 self._systems.append(html_system) | 291 self._systems.append(html_system) |
290 | 292 |
291 if 'htmldartium' in systems: | 293 if 'htmldartium' in systems: |
292 html_system = HtmlDartiumSystem( | 294 html_system = HtmlDartiumSystem( |
293 TemplateLoader(self._template_dir, | 295 TemplateLoader(self._template_dir, |
294 ['html/dartium', 'html/impl', 'html', '']), | 296 ['html/dartium', 'html/impl', 'html', ''], |
| 297 {'DARTIUM': True, 'FROG': False}), |
295 self._database, self._emitters, self._output_dir, self) | 298 self._database, self._emitters, self._output_dir, self) |
296 | 299 |
297 html_system._interface_system = html_interface_system | 300 html_system._interface_system = html_interface_system |
298 self._systems.append(html_system) | 301 self._systems.append(html_system) |
299 | 302 |
300 # Collect interfaces | 303 # Collect interfaces |
301 interfaces = [] | 304 interfaces = [] |
302 for interface in database.GetInterfaces(): | 305 for interface in database.GetInterfaces(): |
303 if not MatchSourceFilter(source_filter, interface): | 306 if not MatchSourceFilter(source_filter, interface): |
304 # Skip this interface since it's not present in the required source | 307 # Skip this interface since it's not present in the required source |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 setters = {} | 539 setters = {} |
537 for attr in attributes: | 540 for attr in attributes: |
538 if attr.is_fc_getter: | 541 if attr.is_fc_getter: |
539 getters[attr.id] = attr | 542 getters[attr.id] = attr |
540 elif attr.is_fc_setter and 'Replaceable' not in attr.ext_attrs: | 543 elif attr.is_fc_setter and 'Replaceable' not in attr.ext_attrs: |
541 setters[attr.id] = attr | 544 setters[attr.id] = attr |
542 return [(getters.get(id), setters.get(id)) for id in names] | 545 return [(getters.get(id), setters.get(id)) for id in names] |
543 | 546 |
544 # ------------------------------------------------------------------------------ | 547 # ------------------------------------------------------------------------------ |
545 | 548 |
546 class TemplateLoader(object): | |
547 """Loads template files from a path.""" | |
548 | |
549 def __init__(self, root, subpaths): | |
550 """Initializes loader. | |
551 | |
552 Args: | |
553 root - a string, the directory under which the templates are stored. | |
554 subpaths - a list of strings, subpaths of root in search order. | |
555 """ | |
556 self._root = root | |
557 self._subpaths = subpaths | |
558 self._cache = {} | |
559 | |
560 def TryLoad(self, name): | |
561 """Returns content of template file as a string, or None of not found.""" | |
562 if name in self._cache: | |
563 return self._cache[name] | |
564 | |
565 for subpath in self._subpaths: | |
566 template_file = os.path.join(self._root, subpath, name) | |
567 if os.path.exists(template_file): | |
568 template = ''.join(open(template_file).readlines()) | |
569 self._cache[name] = template | |
570 return template | |
571 | |
572 return None | |
573 | |
574 def Load(self, name): | |
575 """Returns contents of template file as a string, or raises an exception.""" | |
576 template = self.TryLoad(name) | |
577 if template is not None: # Can be empty string | |
578 return template | |
579 raise Exception("Could not find template '%s' on %s / %s" % ( | |
580 name, self._root, self._subpaths)) | |
581 | |
582 # ------------------------------------------------------------------------------ | |
583 | |
584 class DummyImplementationSystem(System): | 549 class DummyImplementationSystem(System): |
585 """Generates a dummy implementation for use by the editor analysis. | 550 """Generates a dummy implementation for use by the editor analysis. |
586 | 551 |
587 All the code comes from hand-written library files. | 552 All the code comes from hand-written library files. |
588 """ | 553 """ |
589 | 554 |
590 def __init__(self, templates, database, emitters, output_dir): | 555 def __init__(self, templates, database, emitters, output_dir): |
591 super(DummyImplementationSystem, self).__init__( | 556 super(DummyImplementationSystem, self).__init__( |
592 templates, database, emitters, output_dir) | 557 templates, database, emitters, output_dir) |
593 factory_providers_file = os.path.join(self._output_dir, 'src', 'dummy', | 558 factory_providers_file = os.path.join(self._output_dir, 'src', 'dummy', |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 pass | 625 pass |
661 | 626 |
662 def AddTypedArrayConstructors(self, element_type): | 627 def AddTypedArrayConstructors(self, element_type): |
663 pass | 628 pass |
664 | 629 |
665 def AddOperation(self, info): | 630 def AddOperation(self, info): |
666 pass | 631 pass |
667 | 632 |
668 def AddEventAttributes(self, event_attrs): | 633 def AddEventAttributes(self, event_attrs): |
669 pass | 634 pass |
OLD | NEW |