Chromium Code Reviews| 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) { |