OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of protoc; | 5 part of protoc; |
6 | 6 |
7 class MessageGenerator extends ProtobufContainer { | 7 class MessageGenerator extends ProtobufContainer { |
8 // Returns the mixin for this message, or null if none. | 8 /// Returns the mixin for this message, or null if none. |
9 static PbMixin _getMixin(DescriptorProto desc, PbMixin defaultValue) { | 9 /// |
10 if (!desc.hasOptions()) return defaultValue; | 10 /// First searches [declaredMixins], then internal mixins declared by |
11 if (!desc.options.hasExtension(Dart_options.mixin)) return defaultValue; | 11 /// [findMixin]. |
12 static PbMixin _getMixin(DescriptorProto desc, | |
13 Map<String, PbMixin> declaredMixins, String defaultMixin) { | |
14 PbMixin getMixinByName(String name) { | |
15 if (name.isEmpty) return null; // don't use a mixin (override any default) | |
16 return declaredMixins[name] ?? findMixin(name); | |
17 } | |
18 | |
19 if (!desc.hasOptions() || !desc.options.hasExtension(Dart_options.mixin)) { | |
20 return getMixinByName(defaultMixin); | |
21 } | |
12 | 22 |
13 String name = desc.options.getExtension(Dart_options.mixin); | 23 String name = desc.options.getExtension(Dart_options.mixin); |
14 if (name.isEmpty) return null; // don't use a mixin (override any default) | 24 return getMixinByName(name); |
15 var mixin = findMixin(name); | |
16 if (mixin == null) { | |
17 throw ("unknown mixin class: ${name}"); | |
18 } | |
19 return mixin; | |
20 } | 25 } |
21 | 26 |
22 final String classname; | 27 final String classname; |
23 final String fqname; | 28 final String fqname; |
24 final PbMixin mixin; | 29 final PbMixin mixin; |
25 | 30 |
26 final ProtobufContainer _parent; | 31 final ProtobufContainer _parent; |
27 final DescriptorProto _descriptor; | 32 final DescriptorProto _descriptor; |
28 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; | 33 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; |
29 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; | 34 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; |
30 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; | 35 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; |
31 | 36 |
32 // populated by resolve() | 37 // populated by resolve() |
33 List<ProtobufField> _fieldList; | 38 List<ProtobufField> _fieldList; |
34 | 39 |
35 MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, | 40 MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, |
36 PbMixin defaultMixin) | 41 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.
| |
37 : _descriptor = descriptor, | 42 : _descriptor = descriptor, |
38 _parent = parent, | 43 _parent = parent, |
39 classname = (parent.classname == '') | 44 classname = (parent.classname == '') |
40 ? descriptor.name | 45 ? descriptor.name |
41 : '${parent.classname}_${descriptor.name}', | 46 : '${parent.classname}_${descriptor.name}', |
42 fqname = (parent == null || parent.fqname == null) | 47 fqname = (parent == null || parent.fqname == null) |
43 ? descriptor.name | 48 ? descriptor.name |
44 : (parent.fqname == '.' | 49 : (parent.fqname == '.' |
45 ? '.${descriptor.name}' | 50 ? '.${descriptor.name}' |
46 : '${parent.fqname}.${descriptor.name}'), | 51 : '${parent.fqname}.${descriptor.name}'), |
47 mixin = _getMixin(descriptor, defaultMixin) { | 52 mixin = _getMixin(descriptor, declaredMixins, defaultMixin) { |
48 for (EnumDescriptorProto e in _descriptor.enumType) { | 53 for (EnumDescriptorProto e in _descriptor.enumType) { |
49 _enumGenerators.add(new EnumGenerator(e, this)); | 54 _enumGenerators.add(new EnumGenerator(e, this)); |
50 } | 55 } |
51 | 56 |
52 for (DescriptorProto n in _descriptor.nestedType) { | 57 for (DescriptorProto n in _descriptor.nestedType) { |
53 _messageGenerators.add(new MessageGenerator(n, this, defaultMixin)); | 58 _messageGenerators |
59 .add(new MessageGenerator(n, this, declaredMixins, defaultMixin)); | |
54 } | 60 } |
55 | 61 |
56 for (FieldDescriptorProto x in _descriptor.extension) { | 62 for (FieldDescriptorProto x in _descriptor.extension) { |
57 _extensionGenerators.add(new ExtensionGenerator(x, this)); | 63 _extensionGenerators.add(new ExtensionGenerator(x, this)); |
58 } | 64 } |
59 } | 65 } |
60 | 66 |
61 String get package => _parent.package; | 67 String get package => _parent.package; |
62 | 68 |
63 /// The generator of the .pb.dart file that will declare this type. | 69 /// The generator of the .pb.dart file that will declare this type. |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
374 | 380 |
375 for (var m in _messageGenerators) { | 381 for (var m in _messageGenerators) { |
376 m.generateConstants(out); | 382 m.generateConstants(out); |
377 } | 383 } |
378 | 384 |
379 for (var e in _enumGenerators) { | 385 for (var e in _enumGenerators) { |
380 e.generateConstants(out); | 386 e.generateConstants(out); |
381 } | 387 } |
382 } | 388 } |
383 } | 389 } |
OLD | NEW |