OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 protobuf; | 5 part of protobuf; |
6 | 6 |
7 /** | 7 /** |
8 * Per-message type setup. | 8 * Per-message type setup. |
9 */ | 9 */ |
10 class BuilderInfo { | 10 class BuilderInfo { |
11 final String messageName; | 11 final String messageName; |
12 final Map<int, FieldInfo> fieldInfo = new Map<int, FieldInfo>(); | 12 final Map<int, FieldInfo> fieldInfo = new Map<int, FieldInfo>(); |
13 final Map<String, FieldInfo> byTagAsString = <String, FieldInfo>{}; | 13 final Map<String, FieldInfo> byTagAsString = <String, FieldInfo>{}; |
14 final Map<String, FieldInfo> byName = <String, FieldInfo>{}; | 14 final Map<String, FieldInfo> byName = <String, FieldInfo>{}; |
15 bool hasExtensions = false; | 15 bool hasExtensions = false; |
16 bool hasRequiredFields = true; | 16 bool hasRequiredFields = true; |
17 List<FieldInfo> _sortedByTag; | 17 List<FieldInfo> _sortedByTag; |
18 | 18 |
19 BuilderInfo(this.messageName); | 19 BuilderInfo(this.messageName); |
20 | 20 |
21 void add(int tagNumber, String name, int fieldType, | 21 void add/*<T>*/( |
22 dynamic defaultOrMaker, | 22 int tagNumber, |
23 CreateBuilderFunc subBuilder, | 23 String name, |
24 ValueOfFunc valueOf) { | 24 int fieldType, |
| 25 dynamic defaultOrMaker, |
| 26 CreateBuilderFunc subBuilder, |
| 27 ValueOfFunc valueOf) { |
25 var index = fieldInfo.length; | 28 var index = fieldInfo.length; |
26 addField(new FieldInfo( | 29 addField(new FieldInfo/*<T>*/(name, tagNumber, index, fieldType, |
27 name, tagNumber, index, fieldType, defaultOrMaker, subBuilder, valueOf)); | 30 defaultOrMaker, subBuilder, valueOf)); |
28 } | 31 } |
29 | 32 |
30 void addRepeated(int tagNumber, String name, int fieldType, | 33 void addRepeated/*<T>*/(int tagNumber, String name, int fieldType, |
31 CheckFunc check, | 34 CheckFunc check, CreateBuilderFunc subBuilder, ValueOfFunc valueOf) { |
32 CreateBuilderFunc subBuilder, | |
33 ValueOfFunc valueOf) { | |
34 var index = fieldInfo.length; | 35 var index = fieldInfo.length; |
35 addField(new FieldInfo.repeated( | 36 addField(new FieldInfo/*<T>*/ .repeated( |
36 name, tagNumber, index, fieldType, check, subBuilder, valueOf)); | 37 name, tagNumber, index, fieldType, check, subBuilder, valueOf)); |
37 } | 38 } |
38 | 39 |
39 void addField(FieldInfo fi) { | 40 void addField(FieldInfo fi) { |
40 fieldInfo[fi.tagNumber] = fi; | 41 fieldInfo[fi.tagNumber] = fi; |
41 byTagAsString["${fi.tagNumber}"] = fi; | 42 byTagAsString["${fi.tagNumber}"] = fi; |
42 byName[fi.name] = fi; | 43 byName[fi.name] = fi; |
43 } | 44 } |
44 | 45 |
45 void a(int tagNumber, String name, int fieldType, | 46 void a/*<T>*/(int tagNumber, String name, int fieldType, |
46 [dynamic defaultOrMaker, | 47 [dynamic defaultOrMaker, |
47 CreateBuilderFunc subBuilder, | 48 CreateBuilderFunc subBuilder, |
48 ValueOfFunc valueOf]) { | 49 ValueOfFunc valueOf]) { |
49 add(tagNumber, name, fieldType, | 50 add/*<T>*/(tagNumber, name, fieldType, defaultOrMaker, subBuilder, valueOf); |
50 defaultOrMaker, subBuilder, valueOf); | |
51 } | 51 } |
52 | 52 |
53 // Enum. | 53 // Enum. |
54 void e(int tagNumber, String name, int fieldType, | 54 void e/*<T>*/(int tagNumber, String name, int fieldType, |
55 dynamic defaultOrMaker, ValueOfFunc valueOf) { | 55 dynamic defaultOrMaker, ValueOfFunc valueOf) { |
56 add(tagNumber, name, fieldType, | 56 add/*<T>*/(tagNumber, name, fieldType, defaultOrMaker, null, valueOf); |
57 defaultOrMaker, null, valueOf); | |
58 } | 57 } |
59 | 58 |
60 // Repeated message. | 59 // Repeated message. |
61 // TODO(skybrian): migrate to pp() and remove. | 60 // TODO(skybrian): migrate to pp() and remove. |
62 void m(int tagNumber, String name, | 61 void m/*<T>*/(int tagNumber, String name, CreateBuilderFunc subBuilder, |
63 CreateBuilderFunc subBuilder, MakeDefaultFunc makeDefault) { | 62 MakeDefaultFunc makeDefault) { |
64 add(tagNumber, name, PbFieldType._REPEATED_MESSAGE, | 63 add/*<T>*/(tagNumber, name, PbFieldType._REPEATED_MESSAGE, makeDefault, |
65 makeDefault, subBuilder, null); | 64 subBuilder, null); |
66 } | 65 } |
67 | 66 |
68 // Repeated, not a message, group, or enum. | 67 // Repeated, not a message, group, or enum. |
69 void p(int tagNumber, String name, int fieldType) { | 68 void p/*<T>*/(int tagNumber, String name, int fieldType) { |
70 assert(!_isGroupOrMessage(fieldType) && !_isEnum(fieldType)); | 69 assert(!_isGroupOrMessage(fieldType) && !_isEnum(fieldType)); |
71 addRepeated(tagNumber, name, fieldType, | 70 addRepeated/*<T>*/( |
72 getCheckFunction(fieldType), null, null); | 71 tagNumber, name, fieldType, getCheckFunction(fieldType), null, null); |
73 } | 72 } |
74 | 73 |
75 // Repeated message, group, or enum. | 74 // Repeated message, group, or enum. |
76 void pp(int tagNumber, String name, int fieldType, CheckFunc check, | 75 void pp/*<T>*/(int tagNumber, String name, int fieldType, CheckFunc check, |
77 [CreateBuilderFunc subBuilder, ValueOfFunc valueOf]) { | 76 [CreateBuilderFunc subBuilder, ValueOfFunc valueOf]) { |
78 assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType)); | 77 assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType)); |
79 addRepeated(tagNumber, name, fieldType, check, subBuilder, valueOf); | 78 addRepeated/*<T>*/(tagNumber, name, fieldType, check, subBuilder, valueOf); |
80 } | 79 } |
81 | 80 |
82 bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber); | 81 bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber); |
83 | 82 |
84 defaultValue(int tagNumber) { | 83 defaultValue(int tagNumber) { |
85 MakeDefaultFunc func = makeDefault(tagNumber); | 84 MakeDefaultFunc func = makeDefault(tagNumber); |
86 return func == null ? null : func(); | 85 return func == null ? null : func(); |
87 } | 86 } |
88 | 87 |
89 // Returns the field name for a given tag number, for debugging purposes. | 88 // Returns the field name for a given tag number, for debugging purposes. |
(...skipping 26 matching lines...) Expand all Loading... |
116 FieldInfo i = fieldInfo[tagNumber]; | 115 FieldInfo i = fieldInfo[tagNumber]; |
117 return i != null ? i.valueOf : null; | 116 return i != null ? i.valueOf : null; |
118 } | 117 } |
119 | 118 |
120 /// Returns the FieldInfo for each field in tag number order. | 119 /// Returns the FieldInfo for each field in tag number order. |
121 List<FieldInfo> get sortedByTag { | 120 List<FieldInfo> get sortedByTag { |
122 if (_sortedByTag != null) return _sortedByTag; | 121 if (_sortedByTag != null) return _sortedByTag; |
123 // TODO(skybrian): perhaps the code generator should insert the FieldInfos | 122 // TODO(skybrian): perhaps the code generator should insert the FieldInfos |
124 // in tag number order, to avoid sorting them? | 123 // in tag number order, to avoid sorting them? |
125 _sortedByTag = new List<FieldInfo>.from(fieldInfo.values) | 124 _sortedByTag = new List<FieldInfo>.from(fieldInfo.values) |
126 ..sort((a, b) => a.tagNumber.compareTo(b.tagNumber)); | 125 ..sort((a, b) => a.tagNumber.compareTo(b.tagNumber)); |
127 return _sortedByTag; | 126 return _sortedByTag; |
128 } | 127 } |
129 | 128 |
130 GeneratedMessage _makeEmptyMessage( | 129 GeneratedMessage _makeEmptyMessage( |
131 int tagNumber, ExtensionRegistry extensionRegistry) { | 130 int tagNumber, ExtensionRegistry extensionRegistry) { |
132 CreateBuilderFunc subBuilderFunc = subBuilder(tagNumber); | 131 CreateBuilderFunc subBuilderFunc = subBuilder(tagNumber); |
133 if (subBuilderFunc == null && extensionRegistry != null) { | 132 if (subBuilderFunc == null && extensionRegistry != null) { |
134 subBuilderFunc = extensionRegistry.getExtension(messageName, | 133 subBuilderFunc = |
135 tagNumber).subBuilder; | 134 extensionRegistry.getExtension(messageName, tagNumber).subBuilder; |
136 } | 135 } |
137 return subBuilderFunc(); | 136 return subBuilderFunc(); |
138 } | 137 } |
139 | 138 |
140 _decodeEnum(int tagNumber, ExtensionRegistry registry, int rawValue) { | 139 _decodeEnum(int tagNumber, ExtensionRegistry registry, int rawValue) { |
141 | |
142 ValueOfFunc f = valueOfFunc(tagNumber); | 140 ValueOfFunc f = valueOfFunc(tagNumber); |
143 if (f == null && registry != null) { | 141 if (f == null && registry != null) { |
144 f = registry.getExtension(messageName, tagNumber).valueOf; | 142 f = registry.getExtension(messageName, tagNumber).valueOf; |
145 } | 143 } |
146 return f(rawValue); | 144 return f(rawValue); |
147 } | 145 } |
148 } | 146 } |
OLD | NEW |