| Index: build/android/gyp/java_cpp_enum.py
|
| diff --git a/build/android/gyp/java_cpp_enum.py b/build/android/gyp/java_cpp_enum.py
|
| index 6a1d5c1e4c39fa54a1c1b2550356a162c2dcb173..8ae5f36becf0d374ed1d741b61f6192eb81fe3b4 100755
|
| --- a/build/android/gyp/java_cpp_enum.py
|
| +++ b/build/android/gyp/java_cpp_enum.py
|
| @@ -14,17 +14,23 @@ import sys
|
| from util import build_utils
|
|
|
| class EnumDefinition(object):
|
| - def __init__(self, class_name=None, class_package=None, entries=None):
|
| - self.class_name = class_name
|
| - self.class_package = class_package
|
| + def __init__(self, original_enum_name=None, class_name_override=None,
|
| + enum_package=None, entries=None):
|
| + self.original_enum_name = original_enum_name
|
| + self.class_name_override = class_name_override
|
| + self.enum_package = enum_package
|
| self.entries = collections.OrderedDict(entries or [])
|
| - self.prefix_to_strip = ''
|
| + self.prefix_to_strip = None
|
|
|
| def AppendEntry(self, key, value):
|
| if key in self.entries:
|
| raise Exception('Multiple definitions of key %s found.' % key)
|
| self.entries[key] = value
|
|
|
| + @property
|
| + def class_name(self):
|
| + return self.class_name_override or self.original_enum_name
|
| +
|
| def Finalize(self):
|
| self._Validate()
|
| self._AssignEntryIndices()
|
| @@ -32,7 +38,7 @@ class EnumDefinition(object):
|
|
|
| def _Validate(self):
|
| assert self.class_name
|
| - assert self.class_package
|
| + assert self.enum_package
|
| assert self.entries
|
|
|
| def _AssignEntryIndices(self):
|
| @@ -54,23 +60,59 @@ class EnumDefinition(object):
|
|
|
|
|
| def _StripPrefix(self):
|
| - if not self.prefix_to_strip:
|
| - prefix_to_strip = re.sub('(?!^)([A-Z]+)', r'_\1', self.class_name).upper()
|
| + prefix_to_strip = self.prefix_to_strip
|
| + if not prefix_to_strip:
|
| + prefix_to_strip = self.original_enum_name
|
| + prefix_to_strip = re.sub('(?!^)([A-Z]+)', r'_\1', prefix_to_strip).upper()
|
| prefix_to_strip += '_'
|
| if not all([w.startswith(prefix_to_strip) for w in self.entries.keys()]):
|
| prefix_to_strip = ''
|
| - else:
|
| - prefix_to_strip = self.prefix_to_strip
|
| - entries = ((k.replace(prefix_to_strip, '', 1), v) for (k, v) in
|
| - self.entries.iteritems())
|
| - self.entries = collections.OrderedDict(entries)
|
| +
|
| + entries = collections.OrderedDict()
|
| + for (k, v) in self.entries.iteritems():
|
| + stripped_key = k.replace(prefix_to_strip, '', 1)
|
| + if isinstance(v, basestring):
|
| + stripped_value = v.replace(prefix_to_strip, '', 1)
|
| + else:
|
| + stripped_value = v
|
| + entries[stripped_key] = stripped_value
|
| +
|
| + self.entries = entries
|
| +
|
| +class DirectiveSet(object):
|
| + class_name_override_key = 'CLASS_NAME_OVERRIDE'
|
| + enum_package_key = 'ENUM_PACKAGE'
|
| + prefix_to_strip_key = 'PREFIX_TO_STRIP'
|
| +
|
| + known_keys = [class_name_override_key, enum_package_key, prefix_to_strip_key]
|
| +
|
| + def __init__(self):
|
| + self._directives = {}
|
| +
|
| + def Update(self, key, value):
|
| + if key not in DirectiveSet.known_keys:
|
| + raise Exception("Unknown directive: " + key)
|
| + self._directives[key] = value
|
| +
|
| + @property
|
| + def empty(self):
|
| + return len(self._directives) == 0
|
| +
|
| + def UpdateDefinition(self, definition):
|
| + definition.class_name_override = self._directives.get(
|
| + DirectiveSet.class_name_override_key, '')
|
| + definition.enum_package = self._directives.get(
|
| + DirectiveSet.enum_package_key)
|
| + definition.prefix_to_strip = self._directives.get(
|
| + DirectiveSet.prefix_to_strip_key)
|
| +
|
|
|
| class HeaderParser(object):
|
| single_line_comment_re = re.compile(r'\s*//')
|
| multi_line_comment_start_re = re.compile(r'\s*/\*')
|
| enum_start_re = re.compile(r'^\s*enum\s+(\w+)\s+{\s*$')
|
| enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
|
| - enum_end_re = re.compile(r'^\s*}\s*;\s*$')
|
| + enum_end_re = re.compile(r'^\s*}\s*;\.*$')
|
| generator_directive_re = re.compile(
|
| r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]+)$')
|
|
|
| @@ -79,7 +121,7 @@ class HeaderParser(object):
|
| self._enum_definitions = []
|
| self._in_enum = False
|
| self._current_definition = None
|
| - self._generator_directives = {}
|
| + self._generator_directives = DirectiveSet()
|
|
|
| def ParseDefinitions(self):
|
| for line in self._lines:
|
| @@ -109,31 +151,23 @@ class HeaderParser(object):
|
| enum_value = enum_entry.groups()[2]
|
| self._current_definition.AppendEntry(enum_key, enum_value)
|
|
|
| - def _GetCurrentEnumPackageName(self):
|
| - return self._generator_directives.get('ENUM_PACKAGE')
|
| -
|
| - def _GetCurrentEnumPrefixToStrip(self):
|
| - return self._generator_directives.get('PREFIX_TO_STRIP', '')
|
| -
|
| def _ApplyGeneratorDirectives(self):
|
| - current_definition = self._current_definition
|
| - current_definition.class_package = self._GetCurrentEnumPackageName()
|
| - current_definition.prefix_to_strip = self._GetCurrentEnumPrefixToStrip()
|
| - self._generator_directives = {}
|
| + self._generator_directives.UpdateDefinition(self._current_definition)
|
| + self._generator_directives = DirectiveSet()
|
|
|
| def _ParseRegularLine(self, line):
|
| enum_start = HeaderParser.enum_start_re.match(line)
|
| generator_directive = HeaderParser.generator_directive_re.match(line)
|
| if enum_start:
|
| - if not self._GetCurrentEnumPackageName():
|
| + if self._generator_directives.empty:
|
| return
|
| - self._current_definition = EnumDefinition()
|
| - self._current_definition.class_name = enum_start.groups()[0]
|
| + self._current_definition = EnumDefinition(
|
| + original_enum_name=enum_start.groups()[0])
|
| self._in_enum = True
|
| elif generator_directive:
|
| directive_name = generator_directive.groups()[0]
|
| directive_value = generator_directive.groups()[1]
|
| - self._generator_directives[directive_name] = directive_value
|
| + self._generator_directives.Update(directive_name, directive_value)
|
|
|
|
|
| def GetScriptName():
|
| @@ -147,7 +181,7 @@ def DoGenerate(options, source_paths):
|
| for source_path in source_paths:
|
| enum_definitions = DoParseHeaderFile(source_path)
|
| for enum_definition in enum_definitions:
|
| - package_path = enum_definition.class_package.replace('.', os.path.sep)
|
| + package_path = enum_definition.enum_package.replace('.', os.path.sep)
|
| file_name = enum_definition.class_name + '.java'
|
| output_path = os.path.join(options.output_dir, package_path, file_name)
|
| output_paths.append(output_path)
|
| @@ -193,7 +227,7 @@ ${ENUM_ENTRIES}
|
| values = {
|
| 'CLASS_NAME': enum_definition.class_name,
|
| 'ENUM_ENTRIES': enum_entries_string,
|
| - 'PACKAGE': enum_definition.class_package,
|
| + 'PACKAGE': enum_definition.enum_package,
|
| 'SCRIPT_NAME': GetScriptName(),
|
| 'SOURCE_PATH': source_path,
|
| }
|
|
|