Modify java_cpp_enum.py to preserve comments

This CL modifies java_cpp_enum.py to preserve comments on the
enums in the generated Java file.

The comments are useful for developers who usually read the
JavaDoc and not the C++ files.

BUG=634092

Review-Url: https://codereview.chromium.org/2210633002
Cr-Original-Commit-Position: refs/heads/master@{#410047}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: ea986397d77dc45b5b272ad68d00cc6063ee6987
This commit is contained in:
xunjieli 2016-08-05 06:39:59 -07:00 коммит произвёл Commit bot
Родитель f68f8c19f4
Коммит 4ef8100961
2 изменённых файлов: 52 добавлений и 6 удалений

Просмотреть файл

@ -27,11 +27,12 @@ ENUM_FIXED_TYPE_WHITELIST = ['char', 'unsigned char',
class EnumDefinition(object):
def __init__(self, original_enum_name=None, class_name_override=None,
enum_package=None, entries=None, fixed_type=None):
enum_package=None, entries=None, comments=None, fixed_type=None):
self.original_enum_name = original_enum_name
self.class_name_override = class_name_override
self.enum_package = enum_package
self.entries = collections.OrderedDict(entries or [])
self.comments = collections.OrderedDict(comments or [])
self.prefix_to_strip = None
self.fixed_type = fixed_type
@ -40,6 +41,11 @@ class EnumDefinition(object):
raise Exception('Multiple definitions of key %s found.' % key)
self.entries[key] = value
def AppendEntryComment(self, key, value):
if key in self.comments:
raise Exception('Multiple definitions of key %s found.' % key)
self.comments[key] = value
@property
def class_name(self):
return self.class_name_override or self.original_enum_name
@ -124,7 +130,7 @@ class DirectiveSet(object):
class HeaderParser(object):
single_line_comment_re = re.compile(r'\s*//')
single_line_comment_re = re.compile(r'\s*//\s*([^\n]+)')
multi_line_comment_start_re = re.compile(r'\s*/\*')
enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
enum_end_re = re.compile(r'^\s*}\s*;\.*$')
@ -150,6 +156,7 @@ class HeaderParser(object):
self._enum_definitions = []
self._in_enum = False
self._current_definition = None
self._current_comments = []
self._generator_directives = DirectiveSet()
self._multi_line_generator_directive = None
@ -171,7 +178,9 @@ class HeaderParser(object):
self._ParseEnumLine(line)
def _ParseEnumLine(self, line):
if HeaderParser.single_line_comment_re.match(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):
raise Exception('Multi-line comments in enums are not supported in ' +
@ -187,6 +196,10 @@ class HeaderParser(object):
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 = []
def _ParseMultiLineDirectiveLine(self, line):
multi_line_directive_continuation = (
@ -289,6 +302,17 @@ ${ENUM_ENTRIES}
'NAME': enum_name,
'VALUE': enum_value,
}
enum_comments = enum_definition.comments.get(enum_name)
if enum_comments:
enum_comments_indent = ' * '
comments_line_wrapper = textwrap.TextWrapper(
initial_indent=enum_comments_indent,
subsequent_indent=enum_comments_indent,
width=100)
enum_entries_string.append(' /**')
enum_entries_string.append(
'\n'.join(comments_line_wrapper.wrap(enum_comments)))
enum_entries_string.append(' */')
enum_entries_string.append(enum_template.substitute(values))
enum_names.append(enum_name)
enum_entries_string = '\n'.join(enum_entries_string)

Просмотреть файл

@ -26,7 +26,13 @@ class TestPreprocess(unittest.TestCase):
def testOutput(self):
definition = EnumDefinition(original_enum_name='ClassName',
enum_package='some.package',
entries=[('E1', 1), ('E2', '2 << 2')])
entries=[('E1', 1), ('E2', '2 << 2')],
comments=[('E2', 'This is a comment.'),
('E1', 'This is a multiple line '
'comment that is really long. '
'This is a multiple line '
'comment that is really '
'really long.')])
output = GenerateOutput('path/to/file', definition)
expected = """
// Copyright %d The Chromium Authors. All rights reserved.
@ -51,11 +57,22 @@ public class ClassName {
})
@Retention(RetentionPolicy.SOURCE)
public @interface ClassNameEnum {}
/**
* %s
* really really long.
*/
public static final int E1 = 1;
/**
* This is a comment.
*/
public static final int E2 = 2 << 2;
}
"""
self.assertEqual(expected % (date.today().year, GetScriptName()), output)
long_comment = ('This is a multiple line comment that is really long. '
'This is a multiple line comment that is')
self.assertEqual(
expected % (date.today().year, GetScriptName(), long_comment),
output)
def testParseSimpleEnum(self):
test_data = """
@ -134,6 +151,8 @@ public class ClassName {
// GENERATED_JAVA_PREFIX_TO_STRIP: P_
enum EnumTwo {
P_A,
// This comment spans
// two lines.
P_B
};
""".split('\n')
@ -145,10 +164,13 @@ public class ClassName {
self.assertEqual(collections.OrderedDict([('A', '1'),
('B', 'A')]),
definition.entries)
self.assertEqual(collections.OrderedDict([('ENUM_ONE_B', 'Comment there')]),
definition.comments)
definition = definitions[1]
self.assertEqual('EnumTwo', definition.class_name)
self.assertEqual('other.package', definition.enum_package)
self.assertEqual(collections.OrderedDict(
[('P_B', 'This comment spans two lines.')]), definition.comments)
self.assertEqual(collections.OrderedDict([('A', 0),
('B', 1)]),
definition.entries)