Index: lib/message_generator.dart |
diff --git a/lib/message_generator.dart b/lib/message_generator.dart |
index 4dd64bba2066d855bef896a69e4a1f39d2dc033c..4e87ffbab2aa6ef80bf2ab40de6a063977a7db67 100644 |
--- a/lib/message_generator.dart |
+++ b/lib/message_generator.dart |
@@ -5,18 +5,23 @@ |
part of protoc; |
class MessageGenerator extends ProtobufContainer { |
- // Returns the mixin for this message, or null if none. |
- static PbMixin _getMixin(DescriptorProto desc, PbMixin defaultValue) { |
- if (!desc.hasOptions()) return defaultValue; |
- if (!desc.options.hasExtension(Dart_options.mixin)) return defaultValue; |
+ /// Returns the mixin for this message, or null if none. |
+ /// |
+ /// First searches [declaredMixins], then internal mixins declared by |
+ /// [findMixin]. |
+ static PbMixin _getMixin(DescriptorProto desc, |
+ Map<String, PbMixin> declaredMixins, String defaultMixin) { |
+ PbMixin getMixinByName(String name) { |
+ if (name.isEmpty) return null; // don't use a mixin (override any default) |
+ return declaredMixins[name] ?? findMixin(name); |
+ } |
- String name = desc.options.getExtension(Dart_options.mixin); |
- if (name.isEmpty) return null; // don't use a mixin (override any default) |
- var mixin = findMixin(name); |
- if (mixin == null) { |
- throw ("unknown mixin class: ${name}"); |
+ if (!desc.hasOptions() || !desc.options.hasExtension(Dart_options.mixin)) { |
+ return getMixinByName(defaultMixin); |
} |
- return mixin; |
+ |
+ String name = desc.options.getExtension(Dart_options.mixin); |
+ return getMixinByName(name); |
} |
final String classname; |
@@ -33,7 +38,7 @@ class MessageGenerator extends ProtobufContainer { |
List<ProtobufField> _fieldList; |
MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, |
- PbMixin defaultMixin) |
+ Map<String, PbMixin> declaredMixins, String defaultMixin) |
skybrian
2016/06/23 19:01:42
Maybe change defaultMixin back to having type PbMi
frederikmutzel
2016/06/27 08:44:31
Done.
|
: _descriptor = descriptor, |
_parent = parent, |
classname = (parent.classname == '') |
@@ -44,13 +49,14 @@ class MessageGenerator extends ProtobufContainer { |
: (parent.fqname == '.' |
? '.${descriptor.name}' |
: '${parent.fqname}.${descriptor.name}'), |
- mixin = _getMixin(descriptor, defaultMixin) { |
+ mixin = _getMixin(descriptor, declaredMixins, defaultMixin) { |
for (EnumDescriptorProto e in _descriptor.enumType) { |
_enumGenerators.add(new EnumGenerator(e, this)); |
} |
for (DescriptorProto n in _descriptor.nestedType) { |
- _messageGenerators.add(new MessageGenerator(n, this, defaultMixin)); |
+ _messageGenerators |
+ .add(new MessageGenerator(n, this, declaredMixins, defaultMixin)); |
} |
for (FieldDescriptorProto x in _descriptor.extension) { |