Commit 9066edf6 authored by estevenson's avatar estevenson Committed by Commit bot

Allow multi-line enum entries in java_cpp_enum.py.

clang-format wraps long lines, so java_cpp_enum.py should also
handle multi-line enum entries.

Also changed the HeaderParser to ignore empty comments.

BUG=652018

Review-Url: https://codereview.chromium.org/2396533002
Cr-Commit-Position: refs/heads/master@{#422863}
parent 0bf2743d
...@@ -130,7 +130,7 @@ class DirectiveSet(object): ...@@ -130,7 +130,7 @@ class DirectiveSet(object):
class HeaderParser(object): class HeaderParser(object):
single_line_comment_re = re.compile(r'\s*//\s*([^\n]+)') single_line_comment_re = re.compile(r'\s*//\s*([^\n]*)')
multi_line_comment_start_re = re.compile(r'\s*/\*') multi_line_comment_start_re = re.compile(r'\s*/\*')
enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?') enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
enum_end_re = re.compile(r'^\s*}\s*;\.*$') enum_end_re = re.compile(r'^\s*}\s*;\.*$')
...@@ -159,6 +159,7 @@ class HeaderParser(object): ...@@ -159,6 +159,7 @@ class HeaderParser(object):
self._current_comments = [] self._current_comments = []
self._generator_directives = DirectiveSet() self._generator_directives = DirectiveSet()
self._multi_line_generator_directive = None self._multi_line_generator_directive = None
self._current_enum_entry = ''
def _ApplyGeneratorDirectives(self): def _ApplyGeneratorDirectives(self):
self._generator_directives.UpdateDefinition(self._current_definition) self._generator_directives.UpdateDefinition(self._current_definition)
...@@ -178,28 +179,50 @@ class HeaderParser(object): ...@@ -178,28 +179,50 @@ class HeaderParser(object):
self._ParseEnumLine(line) self._ParseEnumLine(line)
def _ParseEnumLine(self, line): def _ParseEnumLine(self, line):
enum_comment = HeaderParser.single_line_comment_re.match(line)
if enum_comment:
self._current_comments.append(enum_comment.groups()[0])
return
if HeaderParser.multi_line_comment_start_re.match(line): if HeaderParser.multi_line_comment_start_re.match(line):
raise Exception('Multi-line comments in enums are not supported in ' + raise Exception('Multi-line comments in enums are not supported in ' +
self._path) self._path)
enum_end = HeaderParser.enum_end_re.match(line)
enum_entry = HeaderParser.enum_line_re.match(line) enum_comment = HeaderParser.single_line_comment_re.match(line)
if enum_end: if enum_comment:
self._ApplyGeneratorDirectives() comment = enum_comment.groups()[0]
self._current_definition.Finalize() if comment:
self._enum_definitions.append(self._current_definition) self._current_comments.append(comment)
self._in_enum = False elif HeaderParser.enum_end_re.match(line):
elif enum_entry: self._FinalizeCurrentEnumEntry()
enum_key = enum_entry.groups()[0] else:
enum_value = enum_entry.groups()[2] self._AddToCurrentEnumEntry(line)
self._current_definition.AppendEntry(enum_key, enum_value) if ',' in line:
if self._current_comments: self._ParseCurrentEnumEntry()
self._current_definition.AppendEntryComment(
enum_key, ' '.join(self._current_comments)) def _ParseCurrentEnumEntry(self):
self._current_comments = [] if not self._current_enum_entry:
return
enum_entry = HeaderParser.enum_line_re.match(self._current_enum_entry)
if not enum_entry:
raise Exception('Unexpected error while attempting to parse %s as enum '
'entry.' % self._current_enum_entry)
enum_key = enum_entry.groups()[0]
enum_value = enum_entry.groups()[2]
self._current_definition.AppendEntry(enum_key, enum_value)
if self._current_comments:
self._current_definition.AppendEntryComment(
enum_key, ' '.join(self._current_comments))
self._current_comments = []
self._current_enum_entry = ''
def _AddToCurrentEnumEntry(self, line):
self._current_enum_entry += ' ' + line.strip()
def _FinalizeCurrentEnumEntry(self):
if self._current_enum_entry:
self._ParseCurrentEnumEntry()
self._ApplyGeneratorDirectives()
self._current_definition.Finalize()
self._enum_definitions.append(self._current_definition)
self._in_enum = False
def _ParseMultiLineDirectiveLine(self, line): def _ParseMultiLineDirectiveLine(self, line):
multi_line_directive_continuation = ( multi_line_directive_continuation = (
......
...@@ -108,6 +108,74 @@ public class ClassName { ...@@ -108,6 +108,74 @@ public class ClassName {
('VALUE_ONE', '1 << 1')]), ('VALUE_ONE', '1 << 1')]),
definition.entries) definition.entries)
def testParseMultilineEnumEntry(self):
test_data = """
// GENERATED_JAVA_ENUM_PACKAGE: bar.namespace
enum Foo {
VALUE_ZERO = 1 << 0,
VALUE_ONE =
SymbolKey | FnKey | AltGrKey | MetaKey | AltKey | ControlKey,
VALUE_TWO = 1 << 18,
};
""".split('\n')
expected_entries = collections.OrderedDict([
('VALUE_ZERO', '1 << 0'),
('VALUE_ONE', 'SymbolKey | FnKey | AltGrKey | MetaKey | AltKey | '
'ControlKey'),
('VALUE_TWO', '1 << 18')])
definitions = HeaderParser(test_data).ParseDefinitions()
self.assertEqual(1, len(definitions))
definition = definitions[0]
self.assertEqual('Foo', definition.class_name)
self.assertEqual('bar.namespace', definition.enum_package)
self.assertEqual(expected_entries, definition.entries)
def testParseEnumEntryWithTrailingMultilineEntry(self):
test_data = """
// GENERATED_JAVA_ENUM_PACKAGE: bar.namespace
enum Foo {
VALUE_ZERO = 1,
VALUE_ONE =
SymbolKey | FnKey | AltGrKey | MetaKey |
AltKey | ControlKey | ShiftKey,
};
""".split('\n')
expected_entries = collections.OrderedDict([
('VALUE_ZERO', '1'),
('VALUE_ONE', 'SymbolKey | FnKey | AltGrKey | MetaKey | AltKey | '
'ControlKey | ShiftKey')])
definitions = HeaderParser(test_data).ParseDefinitions()
self.assertEqual(1, len(definitions))
definition = definitions[0]
self.assertEqual('Foo', definition.class_name)
self.assertEqual('bar.namespace', definition.enum_package)
self.assertEqual(expected_entries, definition.entries)
def testParseNoCommaAfterLastEntry(self):
test_data = """
// GENERATED_JAVA_ENUM_PACKAGE: bar.namespace
enum Foo {
VALUE_ZERO = 1,
// This is a multiline
//
// comment with an empty line.
VALUE_ONE = 2
};
""".split('\n')
expected_entries = collections.OrderedDict([
('VALUE_ZERO', '1'),
('VALUE_ONE', '2')])
expected_comments = collections.OrderedDict([
('VALUE_ONE', 'This is a multiline comment with an empty line.')])
definitions = HeaderParser(test_data).ParseDefinitions()
self.assertEqual(1, len(definitions))
definition = definitions[0]
self.assertEqual('Foo', definition.class_name)
self.assertEqual('bar.namespace', definition.enum_package)
self.assertEqual(expected_entries, definition.entries)
self.assertEqual(expected_comments, definition.comments)
def testParseClassNameOverride(self): def testParseClassNameOverride(self):
test_data = """ test_data = """
// GENERATED_JAVA_ENUM_PACKAGE: test.namespace // GENERATED_JAVA_ENUM_PACKAGE: test.namespace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment