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 const String SP = ' '; | 7 const String SP = ' '; |
8 | 8 |
9 class MessageGenerator implements ProtobufContainer { | 9 class MessageGenerator implements ProtobufContainer { |
10 final String classname; | 10 final String classname; |
11 final String fqname; | 11 final String fqname; |
12 final GenerationContext _context; | 12 final GenerationContext _context; |
13 final DescriptorProto _descriptor; | 13 final DescriptorProto _descriptor; |
14 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; | 14 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; |
15 final List<ProtobufField> _fieldList = <ProtobufField>[]; | 15 final List<ProtobufField> _fieldList = <ProtobufField>[]; |
16 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; | 16 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; |
17 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; | 17 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; |
18 final Set<String> _methodNames = new Set<String>(); | |
18 | 19 |
19 MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, | 20 MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, |
20 this._context) | 21 this._context) |
21 : _descriptor = descriptor, | 22 : _descriptor = descriptor, |
22 classname = (parent == null || parent.classname == '') ? | 23 classname = (parent == null || parent.classname == '') ? |
23 descriptor.name : '${parent.classname}_${descriptor.name}', | 24 descriptor.name : '${parent.classname}_${descriptor.name}', |
24 fqname = (parent == null || parent.fqname == null) ? descriptor.name : | 25 fqname = (parent == null || parent.fqname == null) ? descriptor.name : |
25 (parent.fqname == '.' ? | 26 (parent.fqname == '.' ? |
26 '.${descriptor.name}' : '${parent.fqname}.${descriptor.name}') { | 27 '.${descriptor.name}' : '${parent.fqname}.${descriptor.name}') { |
27 _context.register(this); | 28 _context.register(this); |
(...skipping 15 matching lines...) Expand all Loading... | |
43 _fieldList.clear(); | 44 _fieldList.clear(); |
44 for (FieldDescriptorProto field in _descriptor.field) { | 45 for (FieldDescriptorProto field in _descriptor.field) { |
45 _fieldList.add(new ProtobufField(field, this, _context)); | 46 _fieldList.add(new ProtobufField(field, this, _context)); |
46 } | 47 } |
47 for (MessageGenerator m in _messageGenerators) { | 48 for (MessageGenerator m in _messageGenerators) { |
48 m.initializeFields(); | 49 m.initializeFields(); |
49 } | 50 } |
50 } | 51 } |
51 | 52 |
52 void generate(IndentingWriter out) { | 53 void generate(IndentingWriter out) { |
54 _methodNames.clear(); | |
55 _methodNames.addAll( | |
56 ["hashCode", "noSuchMethod","runtimeType", "toString"]); | |
57 _methodNames.addAll( | |
58 ["fromBuffer", "fromJson", "hasRequiredFields", "isInitialized", | |
59 "clear", "getTagNumber", "check", | |
60 "writeToBuffer", "writeToCodedBufferWriter", | |
61 "mergeFromCodedBufferReader", "mergeFromBuffer", | |
62 "writeToJson", "mergeFromJson", | |
63 "addExtension", "getExtension", "setExtension", | |
64 "hasExtension", "clearExtension", | |
65 "getField", "setField", "hasField", "clearField", | |
66 "extensionsAreInitialized", "mergeFromMessage", "mergeUnknownFields"]); | |
Siggi Cherem (dart-lang)
2013/10/24 17:04:21
I'm slightly worried about how we maintain this li
Søren Gjesse
2013/10/25 09:02:20
Mirror currently does not work well with dart2dart
| |
67 | |
53 for (EnumGenerator e in _enumGenerators) { | 68 for (EnumGenerator e in _enumGenerators) { |
54 e.generate(out); | 69 e.generate(out); |
55 } | 70 } |
56 | 71 |
57 for (MessageGenerator m in _messageGenerators) { | 72 for (MessageGenerator m in _messageGenerators) { |
58 m.generate(out); | 73 m.generate(out); |
59 } | 74 } |
60 | 75 |
61 out.addBlock('class ${classname} extends GeneratedMessage${SP}{', | 76 out.addBlock('class ${classname} extends GeneratedMessage${SP}{', |
62 '}', () | 77 '}', () |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 } | 197 } |
183 } | 198 } |
184 } | 199 } |
185 } | 200 } |
186 return false; | 201 return false; |
187 } | 202 } |
188 | 203 |
189 void generateFieldsAccessorsMutators(IndentingWriter out) { | 204 void generateFieldsAccessorsMutators(IndentingWriter out) { |
190 for (ProtobufField field in _fieldList) { | 205 for (ProtobufField field in _fieldList) { |
191 out.println(); | 206 out.println(); |
192 out.println('${field.typeString} get ${field.externalFieldName}' | 207 String identifier = field.externalFieldName; |
208 String hasIdentifier = "has" + field.titlecaseFieldName; | |
209 String clearIdentifier = "clear" + field.titlecaseFieldName; | |
210 if (field.single) { | |
211 while (_methodNames.contains(identifier) || | |
212 _methodNames.contains(hasIdentifier) || | |
213 _methodNames.contains(clearIdentifier)) { | |
214 identifier += field.number.toString(); | |
215 hasIdentifier += field.number.toString(); | |
216 clearIdentifier += field.number.toString(); | |
217 } | |
218 _methodNames.add(identifier); | |
219 _methodNames.add(hasIdentifier); | |
220 _methodNames.add(clearIdentifier); | |
221 } else { | |
222 while (_methodNames.contains(identifier)) { | |
223 identifier += field.number.toString(); | |
Siggi Cherem (dart-lang)
2013/10/24 17:04:21
should we also add an _ here?
Not sure how import
Søren Gjesse
2013/10/25 09:02:20
Added the underscore always - this also makes the
| |
224 } | |
225 _methodNames.add(identifier); | |
226 } | |
227 out.println('${field.typeString} get ${identifier}' | |
193 '${SP}=>${SP}getField(${field.number});'); | 228 '${SP}=>${SP}getField(${field.number});'); |
194 if (field.single) { | 229 if (field.single) { |
195 out.println('void set ${field.externalFieldName}' | 230 out.println('void set ${identifier}' |
196 '(${field.typeString} v)${SP}' | 231 '(${field.typeString} v)${SP}' |
197 '{${SP}setField(${field.number},${SP}v);${SP}}'); | 232 '{${SP}setField(${field.number},${SP}v);${SP}}'); |
198 out.println('bool has${field.titlecaseFieldName}()${SP}=>' | 233 out.println('bool $hasIdentifier()${SP}=>' |
199 '${SP}hasField(${field.number});'); | 234 '${SP}hasField(${field.number});'); |
200 out.println('void clear${field.titlecaseFieldName}()${SP}=>' | 235 out.println('void $clearIdentifier()${SP}=>' |
201 '${SP}clearField(${field.number});'); | 236 '${SP}clearField(${field.number});'); |
202 } | 237 } |
203 } | 238 } |
204 } | 239 } |
205 } | 240 } |
OLD | NEW |