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 """This is the entry point to create Dart APIs from the IDL database.""" | 6 """This is the entry point to create Dart APIs from the IDL database.""" |
7 | 7 |
8 import dartgenerator | 8 import dartgenerator |
9 import database | 9 import database |
10 import logging.config | 10 import logging.config |
(...skipping 10 matching lines...) Expand all Loading... |
21 # TODO(vsm): Maybe Store these renames in the IDLs. | 21 # TODO(vsm): Maybe Store these renames in the IDLs. |
22 'ApplicationCache': 'DOMApplicationCache', | 22 'ApplicationCache': 'DOMApplicationCache', |
23 'BarProp': 'BarInfo', | 23 'BarProp': 'BarInfo', |
24 'DedicatedWorkerGlobalScope': 'DedicatedWorkerContext', | 24 'DedicatedWorkerGlobalScope': 'DedicatedWorkerContext', |
25 'FormData': 'DOMFormData', | 25 'FormData': 'DOMFormData', |
26 'Selection': 'DOMSelection', | 26 'Selection': 'DOMSelection', |
27 'SharedWorkerGlobalScope': 'SharedWorkerContext', | 27 'SharedWorkerGlobalScope': 'SharedWorkerContext', |
28 'Window': 'DOMWindow', | 28 'Window': 'DOMWindow', |
29 'WorkerGlobalScope': 'WorkerContext'} | 29 'WorkerGlobalScope': 'WorkerContext'} |
30 | 30 |
31 _webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) | 31 _html_strip_webkit_prefix_classes = [ |
| 32 'Animation', |
| 33 'AnimationEvent', |
| 34 'AnimationList', |
| 35 'BlobBuilder', |
| 36 'CSSKeyframeRule', |
| 37 'CSSKeyframesRule', |
| 38 'CSSMatrix', |
| 39 'CSSTransformValue', |
| 40 'Flags', |
| 41 'LoseContext', |
| 42 'Point', |
| 43 'TransitionEvent'] |
32 | 44 |
33 def GenerateDOM(systems, output_dir): | 45 def HasAncestor(interface, names_to_match, database): |
34 # TODO(sra): Make this entry point also generate HTML. | 46 for parent in interface.parents: |
| 47 if (parent.type.id in names_to_match or |
| 48 (database.HasInterface(parent.type.id) and |
| 49 HasAncestor(database.GetInterface(parent.type.id), names_to_match, |
| 50 database))): |
| 51 return True |
| 52 return False |
| 53 |
| 54 def _MakeHtmlRenames(common_database): |
| 55 html_renames = {} |
| 56 |
| 57 for interface in common_database.GetInterfaces(): |
| 58 if (interface.id.startswith("HTML") and |
| 59 HasAncestor(interface, ['Element', 'Document'], common_database)): |
| 60 html_renames[interface.id] = interface.id[4:] |
| 61 |
| 62 for subclass in _html_strip_webkit_prefix_classes: |
| 63 html_renames['WebKit' + subclass] = subclass |
| 64 |
| 65 # TODO(jacobr): we almost want to add this commented out line back. |
| 66 # html_renames['HTMLCollection'] = 'ElementList' |
| 67 # html_renames['NodeList'] = 'ElementList' |
| 68 # html_renames['HTMLOptionsCollection'] = 'ElementList' |
| 69 html_renames['DOMWindow'] = 'Window' |
| 70 |
| 71 return html_renames |
| 72 |
| 73 def GenerateDOM(systems, generate_html_systems, output_dir, use_database_cache): |
35 current_dir = os.path.dirname(__file__) | 74 current_dir = os.path.dirname(__file__) |
36 | 75 |
37 generator = dartgenerator.DartGenerator( | 76 generator = dartgenerator.DartGenerator( |
38 auxiliary_dir=os.path.join(current_dir, '..', 'src'), | 77 auxiliary_dir=os.path.join(current_dir, '..', 'src'), |
39 template_dir=os.path.join(current_dir, '..', 'templates'), | 78 template_dir=os.path.join(current_dir, '..', 'templates'), |
40 base_package='') | 79 base_package='') |
41 generator.LoadAuxiliary() | 80 generator.LoadAuxiliary() |
42 | 81 |
43 common_database = database.Database( | 82 common_database = database.Database( |
44 os.path.join(current_dir, '..', 'database')) | 83 os.path.join(current_dir, '..', 'database')) |
45 common_database.Load() | 84 if use_database_cache: |
| 85 common_database.LoadFromCache() |
| 86 else: |
| 87 common_database.Load() |
46 # Remove these types since they are mapped directly to dart. | 88 # Remove these types since they are mapped directly to dart. |
47 common_database.DeleteInterface('DOMStringMap') | 89 common_database.DeleteInterface('DOMStringMap') |
48 common_database.DeleteInterface('DOMStringList') | 90 common_database.DeleteInterface('DOMStringList') |
| 91 |
49 generator.RenameTypes(common_database, { | 92 generator.RenameTypes(common_database, { |
50 # W3C -> Dart renames | 93 # W3C -> Dart renames |
51 'AbstractView': 'Window', | 94 'AbstractView': 'Window', |
52 'Function': 'EventListener', | 95 'Function': 'EventListener', |
53 'DOMStringMap': 'Map<String, String>', | 96 'DOMStringMap': 'Map<String, String>', |
54 'DOMStringList': 'List<String>', | 97 'DOMStringList': 'List<String>', |
55 }) | 98 }, False) |
56 generator.FilterMembersWithUnidentifiedTypes(common_database) | 99 generator.FilterMembersWithUnidentifiedTypes(common_database) |
57 webkit_database = common_database.Clone() | 100 webkit_database = common_database.Clone() |
58 # FIXME: get rid of _original_idl_types map in dartgenerator.py and | 101 # FIXME: get rid of _original_idl_types map in dartgenerator.py and |
59 # call ConvertToDartTypes before cloning. | 102 # call ConvertToDartTypes before cloning. |
60 generator.ConvertToDartTypes(common_database) | 103 generator.ConvertToDartTypes(common_database) |
61 generator.ConvertToDartTypes(webkit_database) | 104 generator.ConvertToDartTypes(webkit_database) |
62 | 105 |
63 generated_output_dir = os.path.join(output_dir, 'generated') | 106 generated_output_dir = os.path.join(output_dir, |
| 107 '../html/generated' if generate_html_systems else 'generated') |
64 if os.path.exists(generated_output_dir): | 108 if os.path.exists(generated_output_dir): |
65 _logger.info('Cleaning output directory %s' % generated_output_dir) | 109 _logger.info('Cleaning output directory %s' % generated_output_dir) |
66 shutil.rmtree(generated_output_dir) | 110 shutil.rmtree(generated_output_dir) |
67 | 111 |
68 | 112 |
69 # Generate Dart interfaces for the WebKit DOM. | 113 # Generate Dart interfaces for the WebKit DOM. |
70 webkit_output_dir = generated_output_dir | 114 webkit_output_dir = generated_output_dir |
71 generator.FilterInterfaces(database = webkit_database, | 115 generator.FilterInterfaces(database = webkit_database, |
72 or_annotations = ['WebKit', 'Dart'], | 116 or_annotations = ['WebKit', 'Dart'], |
73 exclude_displaced = ['WebKit'], | 117 exclude_displaced = ['WebKit'], |
74 exclude_suppressed = ['WebKit', 'Dart']) | 118 exclude_suppressed = ['WebKit', 'Dart']) |
75 generator.RenameTypes(webkit_database, _webkit_renames) | 119 generator.RenameTypes(webkit_database, _webkit_renames, False) |
| 120 |
| 121 if generate_html_systems: |
| 122 html_renames = _MakeHtmlRenames(common_database) |
| 123 generator.RenameTypes(webkit_database, html_renames, True) |
| 124 html_renames_inverse = dict((v,k) for k, v in html_renames.iteritems()) |
| 125 else: |
| 126 html_renames_inverse = {} |
| 127 |
| 128 webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) |
76 | 129 |
77 generator.Generate(database = webkit_database, | 130 generator.Generate(database = webkit_database, |
78 output_dir = webkit_output_dir, | 131 output_dir = webkit_output_dir, |
79 lib_dir = output_dir, | 132 lib_dir = output_dir, |
80 module_source_preference = ['WebKit', 'Dart'], | 133 module_source_preference = ['WebKit', 'Dart'], |
81 source_filter = ['WebKit', 'Dart'], | 134 source_filter = ['WebKit', 'Dart'], |
82 super_database = common_database, | 135 super_database = common_database, |
83 common_prefix = 'common', | 136 common_prefix = 'common', |
84 super_map = _webkit_renames_inverse, | 137 super_map = webkit_renames_inverse, |
| 138 html_map = html_renames_inverse, |
85 systems = systems) | 139 systems = systems) |
86 | 140 |
87 generator.Flush() | 141 generator.Flush() |
88 | 142 |
| 143 if 'frog' in systems: |
| 144 _logger.info('Copy dom_frog to frog/') |
| 145 subprocess.call(['cd .. ; ../tools/copy_dart.py frog dom_frog.dart'], |
| 146 shell=True); |
| 147 |
| 148 if 'htmlfrog' in systems: |
| 149 _logger.info('Copy html_frog to ../html/frog/') |
| 150 subprocess.call(['cd ../../html ; ../tools/copy_dart.py frog html_frog.dart'
], |
| 151 shell=True); |
| 152 |
89 def main(): | 153 def main(): |
90 parser = optparse.OptionParser() | 154 parser = optparse.OptionParser() |
91 parser.add_option('--systems', dest='systems', | 155 parser.add_option('--systems', dest='systems', |
92 action='store', type='string', | 156 action='store', type='string', |
93 default='frog,dummy,wrapping,htmlfrog', | 157 default='frog,dummy,wrapping', |
94 help='Systems to generate (frog, native, dummy, ' | 158 help='Systems to generate (frog, native, dummy, ' |
95 'htmlfrog)') | 159 'htmlfrog, htmldartium)') |
96 parser.add_option('--output-dir', dest='output_dir', | 160 parser.add_option('--output-dir', dest='output_dir', |
97 action='store', type='string', | 161 action='store', type='string', |
98 default=None, | 162 default=None, |
99 help='Directory to put the generated files') | 163 help='Directory to put the generated files') |
| 164 parser.add_option('--use-database-cache', dest='use_database_cache', |
| 165 action='store', |
| 166 default=False, |
| 167 help='''Use the cached database from the previous run to |
| 168 improve startup performance''') |
100 (options, args) = parser.parse_args() | 169 (options, args) = parser.parse_args() |
101 | 170 |
102 current_dir = os.path.dirname(__file__) | 171 current_dir = os.path.dirname(__file__) |
103 output_dir = options.output_dir or os.path.join(current_dir, '..') | |
104 systems = options.systems.split(',') | 172 systems = options.systems.split(',') |
| 173 num_html_systems = ('htmlfrog' in systems) + ('htmldartium' in systems) |
| 174 if num_html_systems > 0 and num_html_systems < len(systems): |
| 175 print 'Cannot generate html and dom bindings at the same time' |
| 176 sys.exit(-1) |
| 177 |
| 178 use_database_cache = options.use_database_cache |
| 179 generate_html_systems = ('htmlfrog' in systems) or ('htmldartium' in systems) |
| 180 output_dir = options.output_dir or ( |
| 181 os.path.join(current_dir, '../../html') if generate_html_systems else |
| 182 os.path.join(current_dir, '..')) |
105 | 183 |
106 logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) | 184 logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) |
107 GenerateDOM(systems, output_dir) | |
108 | 185 |
109 # Copy Frog DOM to frog/dom_frog.dart. | 186 GenerateDOM(systems, generate_html_systems, output_dir, use_database_cache) |
110 if 'frog' in systems: | |
111 _logger.info('Copy dom_frog to frog/') | |
112 subprocess.call(['cd .. ; ../tools/copy_dart.py frog dom_frog.dart'], | |
113 shell=True); | |
114 | 187 |
115 # Copy dummy DOM where dartc build expects it. | 188 # Copy dummy DOM where dartc build expects it. |
116 if 'dummy' in systems: | 189 if 'dummy' in systems: |
117 # TODO(sra): Make other tools pick this up directly, or do a copy_dart into | 190 # TODO(sra): Make other tools pick this up directly, or do a copy_dart into |
118 # a specific directory. | 191 # a specific directory. |
119 source = os.path.join(output_dir, 'dom_dummy.dart') | 192 source = os.path.join(output_dir, 'dom_dummy.dart') |
120 target = os.path.join(output_dir, 'dom.dart') | 193 target = os.path.join(output_dir, 'dom.dart') |
121 shutil.copyfile(source, target) | 194 shutil.copyfile(source, target) |
122 | 195 |
123 if __name__ == '__main__': | 196 if __name__ == '__main__': |
124 sys.exit(main()) | 197 sys.exit(main()) |
OLD | NEW |