Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(2835)

Unified Diff: core/scripts/name_macros.py

Issue 9889044: IDL roll to multivm 1266 (Closed) Base URL: https://dart.googlecode.com/svn/third_party/WebCore
Patch Set: Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: core/scripts/name_macros.py
diff --git a/core/scripts/name_macros.py b/core/scripts/name_macros.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7928c381af5ea201ae28693c581defa1710ead4
--- /dev/null
+++ b/core/scripts/name_macros.py
@@ -0,0 +1,159 @@
+# Copyright (C) 2013 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os.path
+import re
+
+import in_generator
+from in_generator import Maker
+import license
+
+
+HEADER_TEMPLATE = """%(license)s
+
+#ifndef %(class_name)sHeaders_h
+#define %(class_name)sHeaders_h
+
+%(includes)s
+
+#endif // %(class_name)sHeaders_h
+"""
+
+
+INTERFACES_HEADER_TEMPLATE = """%(license)s
+
+#ifndef %(class_name)sInterfaces_h
+#define %(class_name)sInterfaces_h
+
+%(declare_conditional_macros)s
+
+#define %(macro_style_name)s_INTERFACES_FOR_EACH(macro) \\
+ \\
+%(unconditional_macros)s
+ \\
+%(conditional_macros)s
+
+#endif // %(class_name)sInterfaces_h
+"""
+
+
+def _to_macro_style(name):
+ s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
+ return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).upper()
+
+
+def _name_for_entry(entry):
+ if entry['interfaceName']:
+ return entry['interfaceName']
+ return os.path.basename(entry['name'])
+
+class Writer(in_generator.Writer):
+ def __init__(self, in_file_path, enabled_conditions):
+ super(Writer, self).__init__(in_file_path, enabled_conditions)
+ self.class_name = self.in_file.parameters['namespace'].strip('"')
+ self._entries_by_conditional = {}
+ self._unconditional_entries = []
+ self._sort_entries_by_conditional()
+
+ def _sort_entries_by_conditional(self):
+ unconditional_names = set()
+ for entry in self.in_file.name_dictionaries:
+ conditional = entry['conditional']
+ if not conditional:
+ name = _name_for_entry(entry)
+ if name in unconditional_names:
+ continue
+ unconditional_names.add(name)
+ self._unconditional_entries.append(entry)
+ continue
+ for entry in self.in_file.name_dictionaries:
+ name = _name_for_entry(entry)
+ if name in unconditional_names:
+ continue
+ conditional = entry['conditional']
+ if not conditional in self._entries_by_conditional:
+ self._entries_by_conditional[conditional] = []
+ self._entries_by_conditional[conditional].append(entry)
+
+ def _headers_header_include(self, entry):
+ path = entry['name']
+ name = _name_for_entry(entry)
+ if entry['interfaceName']:
+ path = entry['interfaceName'] # FIXME: This seems wrong
+ include = '#include "%(path)s.h"\n#include "V8%(name)s.h"' % {
+ 'path': path,
+ 'name': name,
+ }
+ return self.wrap_with_condition(include, entry['conditional'])
+
+ def generate_headers_header(self):
+ return HEADER_TEMPLATE % {
+ 'license': license.license_for_generated_cpp(),
+ 'class_name': self.class_name,
+ 'includes': '\n'.join(map(self._headers_header_include, self.in_file.name_dictionaries)),
+ }
+
+ def _declare_one_conditional_macro(self, conditional, entries):
+ macro_name = '%(macro_style_name)s_INTERFACES_FOR_EACH_%(conditional)s' % {
+ 'macro_style_name': _to_macro_style(self.class_name),
+ 'conditional': conditional,
+ }
+ return self.wrap_with_condition("""#define %(macro_name)s(macro) \\
+%(declarations)s
+
+#else
+#define %(macro_name)s(macro)""" % {
+ 'macro_name': macro_name,
+ 'declarations': '\n'.join(sorted(set([
+ ' macro(%(name)s) \\' % {'name': _name_for_entry(entry)}
+ for entry in entries]))),
+ }, conditional)
+
+ def _declare_conditional_macros(self):
+ return '\n'.join([
+ self._declare_one_conditional_macro(conditional, entries)
+ for conditional, entries in self._entries_by_conditional.items()])
+
+ def _unconditional_macro(self, entry):
+ return ' macro(%(name)s) \\' % {'name': _name_for_entry(entry)}
+
+ def _conditional_macros(self, conditional):
+ return ' %(macro_style_name)s_INTERFACES_FOR_EACH_%(conditional)s(macro) \\' % {
+ 'macro_style_name': _to_macro_style(self.class_name),
+ 'conditional': conditional,
+ }
+
+ def generate_interfaces_header(self):
+ return INTERFACES_HEADER_TEMPLATE % {
+ 'license': license.license_for_generated_cpp(),
+ 'class_name': self.class_name,
+ 'macro_style_name': _to_macro_style(self.class_name),
+ 'declare_conditional_macros': self._declare_conditional_macros(),
+ 'unconditional_macros': '\n'.join(sorted(set(map(self._unconditional_macro, self._unconditional_entries)))),
+ 'conditional_macros': '\n'.join(map(self._conditional_macros, self._entries_by_conditional.keys())),
+ }

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b