Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(587)

Unified Diff: lib/message_generator.dart

Issue 1192943003: changes for 0.3.9 (Closed) Base URL: https://github.com/dart-lang/dart-protoc-plugin.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/message_generator.dart
diff --git a/lib/message_generator.dart b/lib/message_generator.dart
index 1deaa6f2587d37dd9a03cb3268c000502b51a3a5..f397f9054d40cf3d50b3bbd3f71d76e146d79e5a 100644
--- a/lib/message_generator.dart
+++ b/lib/message_generator.dart
@@ -31,27 +31,22 @@ class MessageGenerator extends ProtobufContainer {
'extensionsAreInitialized', 'mergeFromMessage', 'mergeUnknownFields',
'==', 'info_', 'GeneratedMessage', 'Object'];
- // List of names that can't be used in a subclass that implements Map.
- static final List<String> reservedNamesForMap =
- ['addAll', 'containsKey', 'containsValue', 'forEach', 'putIfAbsent',
- 'remove', 'isEmpty', 'isNotEmpty', 'keys', 'length', 'values'];
-
- // This should match the extension in dart_options.proto.
- static const int implementMapOption = 95333044;
-
- // Returns true if the implement_map option is turned on for the message.
- static bool _shouldImplementMap(DescriptorProto desc, bool defaultValue) {
+ // Returns the mixin for this message, or null if none.
+ static String _getMixin(DescriptorProto desc, String defaultValue) {
if (!desc.hasOptions()) return defaultValue;
+ if (!desc.options.hasExtension(Dart_options.mixin)) return defaultValue;
- var val = desc.options.unknownFields.getField(implementMapOption);
- if (val == null || val.length != 1) return defaultValue;
-
- return val.values[0] == 1;
+ String name = desc.options.getExtension(Dart_options.mixin);
+ if (name.isEmpty) return null; // don't use a mixin (override any default)
+ if (!reservedNamesForMixins.containsKey(name)) {
+ throw("unknown mixin class: ${name}");
+ }
+ return name;
}
final String classname;
final String fqname;
- final bool implementsMap;
+ final String mixin;
final ProtobufContainer _parent;
final GenerationContext _context;
@@ -64,7 +59,7 @@ class MessageGenerator extends ProtobufContainer {
MessageGenerator(
DescriptorProto descriptor, ProtobufContainer parent, this._context,
- bool implementMapByDefault)
+ String defaultMixin)
: _descriptor = descriptor,
_parent = parent,
classname = (parent.classname == '') ?
@@ -72,7 +67,7 @@ class MessageGenerator extends ProtobufContainer {
fqname = (parent == null || parent.fqname == null) ? descriptor.name :
(parent.fqname == '.' ?
'.${descriptor.name}' : '${parent.fqname}.${descriptor.name}'),
- implementsMap = _shouldImplementMap(descriptor, implementMapByDefault) {
+ mixin = _getMixin(descriptor, defaultMixin) {
_context.register(this);
for (EnumDescriptorProto e in _descriptor.enumType) {
@@ -81,7 +76,7 @@ class MessageGenerator extends ProtobufContainer {
for (DescriptorProto n in _descriptor.nestedType) {
_messageGenerators.add(
- new MessageGenerator(n, this, _context, implementMapByDefault));
+ new MessageGenerator(n, this, _context, defaultMixin));
}
for (FieldDescriptorProto x in _descriptor.extension) {
@@ -91,16 +86,6 @@ class MessageGenerator extends ProtobufContainer {
String get package => _parent.package;
- bool get needsMapMixinImport {
- if (implementsMap) return true;
-
- for (var m in _messageGenerators) {
- if (m.implementsMap) return true;
- }
-
- return false;
- }
-
void initializeFields() {
_fieldList.clear();
for (FieldDescriptorProto field in _descriptor.field) {
@@ -116,8 +101,8 @@ class MessageGenerator extends ProtobufContainer {
_methodNames.addAll(reservedWords);
_methodNames.addAll(reservedNames);
- if (implementsMap) {
- _methodNames.addAll(reservedNamesForMap);
+ if (mixin != null) {
+ _methodNames.addAll(reservedNamesForMixins[mixin]);
}
for (EnumGenerator e in _enumGenerators) {
@@ -128,12 +113,12 @@ class MessageGenerator extends ProtobufContainer {
m.generate(out);
}
- var implClause = "";
- if (implementsMap) {
- implClause = " with MapMixin";
+ var mixinClause = "";
+ if (mixin != null) {
+ mixinClause = " with ${mixin}";
Søren Gjesse 2015/06/22 18:29:38 The new approach currently does not require/suppor
skybrian 2015/06/23 02:21:25 It didn't because the PbMapMixin was in the protob
}
- out.addBlock('class ${classname} extends GeneratedMessage${implClause} {',
+ out.addBlock('class ${classname} extends GeneratedMessage${mixinClause} {',
'}', ()
{
out.addBlock(
@@ -223,76 +208,6 @@ class MessageGenerator extends ProtobufContainer {
out.println('static PbList<${classname}>${SP}createRepeated()${SP}=>'
'${SP}new PbList<${classname}>();');
-
- if (implementsMap) {
- // clear() is inherited from GeneratedMessage.
- // Other map operations are implemented by MapMixin.
- out.println('''
-@override
-operator [] (key) {
- if (key is !String) return null;
- if (!key.contains(".")) {
- var tag = getTagNumber(key);
- if (tag == null) return null;
- return getField(tag);
- }
-
- var keys = key.split('.');
- var item = this;
- for (var key in keys) {
- if (item is !GeneratedMessage) return null;
- var tag = item.getTagNumber(key);
- if (tag == null) return null;
- item = item.getField(tag);
- }
-
- return item;
-}
-
-@override
-operator []= (String key, val) {
- if (!key.contains(".")) {
- var tag = _mustGetTagNumber(this, key);
- setField(tag, val);
- return;
- }
-
- var keys = key.split('.');
- var lastKey = keys.removeLast();
- var item = this;
- for (var key in keys) {
- var tag = _mustGetTagNumber(item, key);
- item = item.getField(tag);
- if (item is !GeneratedMessage) {
- throw new ArgumentError(
- "field '\${key}' in \${info._messageName} isn't a GeneratedMessage:");
- }
- }
- var tag = _mustGetTagNumber(item, lastKey);
- item.setField(tag, val);
-}
-
-_mustGetTagNumber(GeneratedMessage msg, String key) {
- var tag = msg.getTagNumber(key);
- if (tag == null) {
- throw new ArgumentError(
- "field '\${key}' not found in \${msg.info_.messageName}");
- }
- return tag;
-}
-
-@override
-get keys => info_.byName.keys;
-
-@override
-get length => info_.byName.length;
-
-remove(key) {
- throw new UnsupportedError("remove() not supported by \${info_.messageName}");
-}
-''');
- }
-
generateFieldsAccessorsMutators(out);
});
out.println();

Powered by Google App Engine
This is Rietveld 408576698