Fix naming of enums when long_names=false.

Modify test case to check that options.pb.o compiles.

Update issue 42
Status: FixedInGit

Update issue 43
Status: FixedInGit
This commit is contained in:
Petteri Aimonen
2012-11-14 00:20:44 +02:00
parent 332a9ee95c
commit 02ecee2de8
4 changed files with 28 additions and 7 deletions

View File

@@ -73,6 +73,9 @@ class Names:
else: else:
raise ValueError("Name parts should be of type str") raise ValueError("Name parts should be of type str")
def __eq__(self, other):
return isinstance(other, Names) and self.parts == other.parts
def names_from_type_name(type_name): def names_from_type_name(type_name):
'''Parse Names() from FieldDescriptorProto type_name''' '''Parse Names() from FieldDescriptorProto type_name'''
if type_name[0] != '.': if type_name[0] != '.':
@@ -83,12 +86,15 @@ class Enum:
def __init__(self, names, desc, enum_options): def __init__(self, names, desc, enum_options):
'''desc is EnumDescriptorProto''' '''desc is EnumDescriptorProto'''
if enum_options.long_names: self.options = enum_options
self.names = names + desc.name self.names = names + desc.name
else:
self.names = names
self.values = [(self.names + x.name, x.number) for x in desc.value] if enum_options.long_names:
self.values = [(self.names + x.name, x.number) for x in desc.value]
else:
self.values = [(x.name, x.number) for x in desc.value]
self.value_longnames = [names + desc.name + x.name for x in desc.value]
def __str__(self): def __str__(self):
result = 'typedef enum _%s {\n' % self.names result = 'typedef enum _%s {\n' % self.names
@@ -391,6 +397,15 @@ def parse_file(fdesc, file_options):
for enum in message.enum_type: for enum in message.enum_type:
enums.append(Enum(names, enum, message_options)) enums.append(Enum(names, enum, message_options))
# Fix field default values where enum short names are used.
for enum in enums:
if not enum.options.long_names:
for message in messages:
for field in message.fields:
if field.default in enum.value_longnames:
idx = enum.value_longnames.index(field.default)
field.default = enum.values[idx][0]
return enums, messages return enums, messages
def toposort2(data): def toposort2(data):

View File

@@ -82,7 +82,7 @@ run_unittests: decode_unittests encode_unittests test_cxxcompile test_encode1 te
./test_missing_fields ./test_missing_fields
test_options: options.pb.h options.expected test_options: options.pb.h options.expected options.pb.o
cat options.expected | while read -r p; do \ cat options.expected | while read -r p; do \
if ! grep -q "$$p" $<; then \ if ! grep -q "$$p" $<; then \
echo Expected: "$$p"; \ echo Expected: "$$p"; \

View File

@@ -2,4 +2,4 @@ char filesize\[20\];
char msgsize\[30\]; char msgsize\[30\];
char fieldsize\[40\]; char fieldsize\[40\];
pb_callback_t int32_callback; pb_callback_t int32_callback;
[^_]EnumValue1 = 1 \sEnumValue1 = 1

View File

@@ -36,4 +36,10 @@ enum Enum1
{ {
option (nanopb_enumopt).long_names = false; option (nanopb_enumopt).long_names = false;
EnumValue1 = 1; EnumValue1 = 1;
EnumValue2 = 2;
}
message EnumTest
{
required Enum1 field = 1 [default = EnumValue2];
} }