Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Unified Diff: Source/bindings/scripts/code_generator_v8.py

Issue 953123003: IDL: Put generated union type containers in separate files (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | Source/bindings/scripts/v8_union.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/scripts/code_generator_v8.py
diff --git a/Source/bindings/scripts/code_generator_v8.py b/Source/bindings/scripts/code_generator_v8.py
index 42fb98cfffb7dc58d5df3f95c3ba9be00664eb7a..dfb8bf0606ffa0bf521e4de82b6cab92a8f1f74e 100644
--- a/Source/bindings/scripts/code_generator_v8.py
+++ b/Source/bindings/scripts/code_generator_v8.py
@@ -323,40 +323,103 @@ class CodeGeneratorUnionType(object):
self.target_component = target_component
set_global_type_info(info_provider)
- def generate_code(self):
- union_types = self.info_provider.union_types
- if not union_types:
- return ()
- header_template = self.jinja_env.get_template('union.h')
- cpp_template = self.jinja_env.get_template('union.cpp')
- template_context = v8_union.union_context(
- union_types, self.info_provider.interfaces_info)
+ def _collect_unique_unions(self, union_types):
+ """This method iterates over |union_types| to remove duplicated entries
+ in |union_types| and to collect additional information (e.g. whether we
+ need to generate *OrNull class). Returns a dict which contains the
+ information.
+ """
+ unique_unions = {}
+ for union_type in union_types:
+ cpp_type = union_type.cpp_type
+ if cpp_type not in unique_unions.keys():
+ unique_unions[cpp_type] = {
+ 'union_type': union_type,
+ }
+ if union_type.includes_nullable_type:
+ unique_unions[cpp_type]['needs_ornull_converter'] = True
+ return unique_unions
+
+ def _generate_container_code(self, name, union_type_dict):
+ """Generates a union type container into separate .h/.cpp files.
+ Returns the path and its contents as a tuple.
+ """
+ header_template = self.jinja_env.get_template('union_container.h')
+ cpp_template = self.jinja_env.get_template('union_container.cpp')
+ template_context = v8_union.container_context(
+ union_type_dict['union_type'], self.info_provider.interfaces_info)
template_context['code_generator'] = module_pyname
- capitalized_component = self.target_component.capitalize()
- template_context['header_filename'] = 'bindings/%s/v8/UnionTypes%s.h' % (
- self.target_component, capitalized_component)
- template_context['macro_guard'] = 'UnionType%s_h' % capitalized_component
+ template_context['needs_ornull_converter'] = (
+ union_type_dict.get('needs_ornull_converter'))
+
+ header_text = header_template.render(template_context)
+ cpp_text = cpp_template.render(template_context)
+ header_path = posixpath.join(self.output_dir, '%s.h' % name)
+ cpp_path = posixpath.join(self.output_dir, '%s.cpp' % name)
+ return (
+ (header_path, header_text),
+ (cpp_path, cpp_text),
+ )
+ def _generate_aggregate_header(self, names):
+ """Generates a header file which contains all union type container
+ headers.
+ FIXME: We might want to remove the aggregated header once we directly
+ include necessary header files in Blink side.
+ """
+ capitalized_component = self.target_component.capitalize()
+ context = {
+ 'code_generator': module_pyname,
+ 'header_includes': sorted([
+ 'bindings/%s/v8/%s.h' % (self.target_component, name)
+ for name in names]),
+ 'macro_guard': 'UnionType%s_h' % capitalized_component,
+ }
# Add UnionTypesCore.h as a dependency when we generate modules union types
# because we only generate union type containers which are used by both
# core and modules in UnionTypesCore.h.
# FIXME: This is an ad hoc workaround and we need a general way to
# handle core <-> modules dependency.
if self.target_component == 'modules':
- template_context['header_includes'] = sorted(
- template_context['header_includes'] +
+ context['header_includes'] = sorted(
+ context['header_includes'] +
['bindings/core/v8/UnionTypesCore.h'])
-
- header_text = header_template.render(template_context)
- cpp_text = cpp_template.render(template_context)
+ template = self.jinja_env.get_template('union.h')
+ header_text = template.render(context)
header_path = posixpath.join(self.output_dir,
'UnionTypes%s.h' % capitalized_component)
+ return (header_path, header_text)
+
+ def _generate_aggregate_cpp(self, names):
+ """Generates a cpp file which contains all union type container
+ implementations. We need this aggregated cpp file as the output of
+ a GYP/GN rule.
+ """
+ capitalized_component = self.target_component.capitalize()
+ context = {
+ 'code_generator': module_pyname,
+ 'cpp_files': sorted([
+ 'bindings/%s/v8/%s.cpp' % (self.target_component, name)
+ for name in names]),
+ }
+ template = self.jinja_env.get_template('union.cpp')
+ cpp_text = template.render(context)
cpp_path = posixpath.join(self.output_dir,
'UnionTypes%s.cpp' % capitalized_component)
- return (
- (header_path, header_text),
- (cpp_path, cpp_text),
- )
+ return (cpp_path, cpp_text)
+
+ def generate_code(self):
+ unique_unions = self._collect_unique_unions(
+ self.info_provider.union_types)
+ if not unique_unions:
+ return ()
+ outputs = set()
+ for name, union_type_dict in unique_unions.iteritems():
+ outputs.update(self._generate_container_code(name, union_type_dict))
+
+ outputs.add(self._generate_aggregate_header(unique_unions.keys()))
+ outputs.add(self._generate_aggregate_cpp(unique_unions.keys()))
+ return outputs
def initialize_jinja_env(cache_dir):
« no previous file with comments | « no previous file | Source/bindings/scripts/v8_union.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698