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): |