Skip to content
This repository has been archived by the owner on Jan 26, 2021. It is now read-only.

Commit

Permalink
Sort fields by tag number before generating code
Browse files Browse the repository at this point in the history
Nothing immediately depends on this, but eventually
BuilderInfo.sortedByTag() can be a no-op.

BUG=
[email protected]

Review URL: https://chromiumcodereview.appspot.com//1374843002.
  • Loading branch information
Brian Slesinsky committed Sep 30, 2015
1 parent f4c3a7b commit 0efcda3
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
9 changes: 8 additions & 1 deletion lib/message_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,15 @@ class MessageGenerator extends ProtobufContainer {
void resolve(GenerationContext ctx) {
if (_fieldList != null) throw new StateError("message already resolved");

var sorted = new List<FieldDescriptorProto>.from(_descriptor.field)
..sort((FieldDescriptorProto a, FieldDescriptorProto b) {
if (a.number < b.number) return -1;
if (a.number > b.number) return 1;
throw "multiple fields defined for tag ${a.number} in $fqname";
});

_fieldList = <ProtobufField>[];
for (FieldDescriptorProto field in _descriptor.field) {
for (FieldDescriptorProto field in sorted) {
int index = _fieldList.length;
_fieldList.add(new ProtobufField(field, index, this, ctx));
}
Expand Down
12 changes: 6 additions & 6 deletions test/message_generator_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -98,19 +98,19 @@ class _ReadonlyPhoneNumber extends PhoneNumber with ReadonlyMessageMixin {}
DescriptorProto md = new DescriptorProto()
..name = 'PhoneNumber'
..field.addAll([
// required string number = 1;
new FieldDescriptorProto()
..name = 'number'
..number = 1
..label = FieldDescriptorProto_Label.LABEL_REQUIRED
..type = FieldDescriptorProto_Type.TYPE_STRING,
// optional PhoneType type = 2 [default = HOME];
new FieldDescriptorProto()
..name = 'type'
..number = 2
..label = FieldDescriptorProto_Label.LABEL_OPTIONAL
..type = FieldDescriptorProto_Type.TYPE_ENUM
..typeName = '.PhoneNumber.PhoneType',
// required string number = 1;
new FieldDescriptorProto()
..name = 'number'
..number = 1
..label = FieldDescriptorProto_Label.LABEL_REQUIRED
..type = FieldDescriptorProto_Type.TYPE_STRING,
new FieldDescriptorProto()
..name = 'name'
..number = 3
Expand Down

0 comments on commit 0efcda3

Please sign in to comment.