Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2463)

Unified Diff: build/android/gyp/java_cpp_enum.py

Issue 841173006: Add multi-line directives in the C++->Java enum generator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/android/gyp/java_cpp_enum_tests.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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):
« no previous file with comments | « no previous file | build/android/gyp/java_cpp_enum_tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698