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 b10e7c541a12358aea15804eb98f37bf64a09426..09cf853dc13f4ea9aa255005c37effb49d586f64 100755 |
--- a/build/android/gyp/java_cpp_enum.py |
+++ b/build/android/gyp/java_cpp_enum.py |
@@ -124,6 +124,12 @@ class HeaderParser(object): |
enum_end_re = re.compile(r'^\s*}\s*;\.*$') |
generator_directive_re = re.compile( |
r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]+)$') |
+ multi_line_generator_directive_start_re = re.compile( |
+ r'^\s*//\s+GENERATED_JAVA_(\w+)\s*:\s*([\.\w]*)\\$') |
+ multi_line_directive_continuation_re = re.compile( |
+ r'^\s*//\s+([\.\w]+)\\$') |
+ multi_line_directive_end_re = re.compile( |
+ r'^\s*//\s+([\.\w]*)$') |
optional_class_or_struct_re = r'(class|struct)?' |
enum_name_re = r'(\w+)' |
@@ -131,12 +137,18 @@ class HeaderParser(object): |
enum_start_re = re.compile(r'^\s*enum\s+' + optional_class_or_struct_re + |
'\s*' + enum_name_re + '\s*' + optional_fixed_type_re + '\s*{\s*$') |
- def __init__(self, lines): |
+ def __init__(self, lines, path=None): |
self._lines = lines |
+ self._path = path |
self._enum_definitions = [] |
self._in_enum = False |
self._current_definition = None |
self._generator_directives = DirectiveSet() |
+ self._multi_line_generator_directive = None |
+ |
+ def _ApplyGeneratorDirectives(self): |
+ self._generator_directives.UpdateDefinition(self._current_definition) |
+ self._generator_directives = DirectiveSet() |
def ParseDefinitions(self): |
for line in self._lines: |
@@ -144,7 +156,9 @@ class HeaderParser(object): |
return self._enum_definitions |
def _ParseLine(self, line): |
- if not self._in_enum: |
+ if self._multi_line_generator_directive: |
+ self._ParseMultiLineDirectiveLine(line) |
+ elif not self._in_enum: |
self._ParseRegularLine(line) |
else: |
self._ParseEnumLine(line) |
@@ -153,7 +167,8 @@ class HeaderParser(object): |
if HeaderParser.single_line_comment_re.match(line): |
return |
if HeaderParser.multi_line_comment_start_re.match(line): |
- raise Exception('Multi-line comments in enums are not supported.') |
+ raise Exception('Multi-line comments in enums are not supported in ' + |
+ self._path) |
enum_end = HeaderParser.enum_end_re.match(line) |
enum_entry = HeaderParser.enum_line_re.match(line) |
if enum_end: |
@@ -166,25 +181,46 @@ class HeaderParser(object): |
enum_value = enum_entry.groups()[2] |
self._current_definition.AppendEntry(enum_key, enum_value) |
- def _ApplyGeneratorDirectives(self): |
- self._generator_directives.UpdateDefinition(self._current_definition) |
- self._generator_directives = DirectiveSet() |
+ def _ParseMultiLineDirectiveLine(self, line): |
+ multi_line_directive_continuation = ( |
+ HeaderParser.multi_line_directive_continuation_re.match(line)) |
+ multi_line_directive_end = ( |
+ HeaderParser.multi_line_directive_end_re.match(line)) |
+ |
+ if multi_line_directive_continuation: |
+ value_cont = multi_line_directive_continuation.groups()[0] |
+ self._multi_line_generator_directive[1].append(value_cont) |
+ elif multi_line_directive_end: |
+ directive_name = self._multi_line_generator_directive[0] |
+ directive_value = "".join(self._multi_line_generator_directive[1]) |
+ directive_value += multi_line_directive_end.groups()[0] |
+ self._multi_line_generator_directive = None |
+ self._generator_directives.Update(directive_name, directive_value) |
+ else: |
+ raise Exception('Malformed multi-line directive declaration in ' + |
+ self._path) |
def _ParseRegularLine(self, line): |
enum_start = HeaderParser.enum_start_re.match(line) |
generator_directive = HeaderParser.generator_directive_re.match(line) |
- if enum_start: |
+ multi_line_generator_directive_start = ( |
+ HeaderParser.multi_line_generator_directive_start_re.match(line)) |
+ |
+ if generator_directive: |
+ directive_name = generator_directive.groups()[0] |
+ directive_value = generator_directive.groups()[1] |
+ self._generator_directives.Update(directive_name, directive_value) |
+ elif multi_line_generator_directive_start: |
+ directive_name = multi_line_generator_directive_start.groups()[0] |
+ directive_value = multi_line_generator_directive_start.groups()[1] |
+ self._multi_line_generator_directive = (directive_name, [directive_value]) |
+ elif enum_start: |
if self._generator_directives.empty: |
return |
self._current_definition = EnumDefinition( |
original_enum_name=enum_start.groups()[1], |
fixed_type=enum_start.groups()[3]) |
self._in_enum = True |
- elif generator_directive: |
- directive_name = generator_directive.groups()[0] |
- directive_value = generator_directive.groups()[1] |
- self._generator_directives.Update(directive_name, directive_value) |
- |
def GetScriptName(): |
script_components = os.path.abspath(sys.argv[0]).split(os.path.sep) |
@@ -209,7 +245,7 @@ def DoGenerate(options, source_paths): |
def DoParseHeaderFile(path): |
with open(path) as f: |
- return HeaderParser(f.readlines()).ParseDefinitions() |
+ return HeaderParser(f.readlines(), path).ParseDefinitions() |
def GenerateOutput(source_path, enum_definition): |