Index: lib/message_generator.dart |
diff --git a/lib/message_generator.dart b/lib/message_generator.dart |
index a3d47b64474ebf29c23f668b7a8f05feaf4ea9d0..4dd64bba2066d855bef896a69e4a1f39d2dc033c 100644 |
--- a/lib/message_generator.dart |
+++ b/lib/message_generator.dart |
@@ -4,57 +4,7 @@ |
part of protoc; |
-/// A Dart function called on each item added to a repeated list |
-/// to check its type and range. |
-const checkItem = '\$checkItem'; |
- |
class MessageGenerator extends ProtobufContainer { |
- // List of Dart language reserved words in names which cannot be used in a |
- // subclass of GeneratedMessage. |
- static final List<String> reservedWords = [ |
- 'assert', |
- 'break', |
- 'case', |
- 'catch', |
- 'class', |
- 'const', |
- 'continue', |
- 'default', |
- 'do', |
- 'else', |
- 'enum', |
- 'extends', |
- 'false', |
- 'final', |
- 'finally', |
- 'for', |
- 'if', |
- 'in', |
- 'is', |
- 'new', |
- 'null', |
- 'rethrow', |
- 'return', |
- 'super', |
- 'switch', |
- 'this', |
- 'throw', |
- 'true', |
- 'try', |
- 'var', |
- 'void', |
- 'while', |
- 'with' |
- ]; |
- |
- // List of names used in the generated class itself |
- static final List<String> generatedNames = [ |
- 'create', |
- 'createRepeated', |
- 'getDefault', |
- checkItem |
- ]; |
- |
// Returns the mixin for this message, or null if none. |
static PbMixin _getMixin(DescriptorProto desc, PbMixin defaultValue) { |
if (!desc.hasOptions()) return defaultValue; |
@@ -82,9 +32,6 @@ class MessageGenerator extends ProtobufContainer { |
// populated by resolve() |
List<ProtobufField> _fieldList; |
- // Used during generation. |
- final Set<String> _methodNames = new Set<String>(); |
- |
MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, |
PbMixin defaultMixin) |
: _descriptor = descriptor, |
@@ -158,17 +105,12 @@ 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"; |
- }); |
+ var reserved = mixin?.findReservedNames() ?? const <String>[]; |
+ var fields = messageFieldNames(_descriptor, reserved: reserved); |
_fieldList = <ProtobufField>[]; |
- for (FieldDescriptorProto field in sorted) { |
- int index = _fieldList.length; |
- _fieldList.add(new ProtobufField(field, index, this, ctx)); |
+ for (MemberNames names in fields.values) { |
+ _fieldList.add(new ProtobufField.message(names, this, ctx)); |
} |
for (var m in _messageGenerators) { |
@@ -242,15 +184,6 @@ class MessageGenerator extends ProtobufContainer { |
void generate(IndentingWriter out) { |
checkResolved(); |
- _methodNames.clear(); |
- _methodNames.addAll(reservedWords); |
- _methodNames.addAll(GeneratedMessage_reservedNames); |
- _methodNames.addAll(generatedNames); |
- |
- if (mixin != null) { |
- _methodNames.addAll(mixin.findReservedNames()); |
- } |
- |
for (MessageGenerator m in _messageGenerators) { |
m.generate(out); |
} |
@@ -267,7 +200,8 @@ class MessageGenerator extends ProtobufContainer { |
'static final BuilderInfo _i = new BuilderInfo(\'${classname}\')', |
';', () { |
for (ProtobufField field in _fieldList) { |
- out.println(field.generateBuilderInfoCall(package)); |
+ var dartFieldName = field.memberNames.fieldName; |
+ out.println(field.generateBuilderInfoCall(package, dartFieldName)); |
} |
if (_descriptor.extensionRange.length > 0) { |
@@ -366,49 +300,29 @@ class MessageGenerator extends ProtobufContainer { |
for (ProtobufField field in _fieldList) { |
out.println(); |
- // Choose non-conflicting names. |
- String identifier = field.dartFieldName; |
- String hasIdentifier = field.hasMethodName; |
- String clearIdentifier = field.clearMethodName; |
- if (!field.isRepeated) { |
- while (_methodNames.contains(identifier) || |
- _methodNames.contains(hasIdentifier) || |
- _methodNames.contains(clearIdentifier)) { |
- identifier += '_' + field.number.toString(); |
- hasIdentifier += '_' + field.number.toString(); |
- clearIdentifier += '_' + field.number.toString(); |
- } |
- _methodNames.add(identifier); |
- _methodNames.add(hasIdentifier); |
- _methodNames.add(clearIdentifier); |
- } else { |
- while (_methodNames.contains(identifier)) { |
- identifier += '_' + field.number.toString(); |
- } |
- _methodNames.add(identifier); |
- } |
- |
var fieldTypeString = field.getDartType(package); |
var defaultExpr = field.getDefaultExpr(); |
- out.println('${fieldTypeString} get ${identifier}' |
+ var names = field.memberNames; |
+ |
+ out.println('${fieldTypeString} get ${names.fieldName}' |
' => \$_get(' |
'${field.index}, ${field.number}, $defaultExpr);'); |
if (!field.isRepeated) { |
var fastSetter = field.baseType.setter; |
if (fastSetter != null) { |
- out.println('void set $identifier' |
+ out.println('void set ${names.fieldName}' |
'($fieldTypeString v) { ' |
'$fastSetter(${field.index}, ${field.number}, v);' |
' }'); |
} else { |
- out.println('void set $identifier' |
+ out.println('void set ${names.fieldName}' |
'($fieldTypeString v) { ' |
'setField(${field.number}, v);' |
' }'); |
} |
- out.println('bool $hasIdentifier() =>' |
+ out.println('bool ${names.hasMethodName}() =>' |
' \$_has(${field.index}, ${field.number});'); |
- out.println('void $clearIdentifier() =>' |
+ out.println('void ${names.clearMethodName}() =>' |
' clearField(${field.number});'); |
} |
} |