Chromium Code Reviews| 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..91f06ef7141cda41e40eb4d251aad53f04cd3db6 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,14 @@ 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 ParseDefinitions(self): |
| for line in self._lines: |
| @@ -153,7 +161,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: |
| @@ -173,18 +182,42 @@ class HeaderParser(object): |
| def _ParseRegularLine(self, line): |
| enum_start = HeaderParser.enum_start_re.match(line) |
|
jbudorick
2015/01/09 16:39:17
nit: you don't need to run these three regexes if
mkosiba (inactive)
2015/01/09 17:09:57
Done.
|
| 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 self._multi_line_generator_directive: |
| + 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) |
| + elif 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 +242,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): |