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 // List of names which cannot be used in a subclass of GeneratedMessage. | 10 // List of names which cannot be used in a subclass of GeneratedMessage. |
11 static final List<String> reservedNames = | 11 static final List<String> reservedNames = |
12 ['hashCode', 'noSuchMethod','runtimeType', 'toString', | 12 ['hashCode', 'noSuchMethod','runtimeType', 'toString', |
13 'fromBuffer', 'fromJson', 'hasRequiredFields', 'isInitialized', | 13 'fromBuffer', 'fromJson', 'hasRequiredFields', 'isInitialized', |
14 'clear', 'getTagNumber', 'check', | 14 'clear', 'getTagNumber', 'check', |
15 'writeToBuffer', 'writeToCodedBufferWriter', | 15 'writeToBuffer', 'writeToCodedBufferWriter', |
16 'mergeFromCodedBufferReader', 'mergeFromBuffer', | 16 'mergeFromCodedBufferReader', 'mergeFromBuffer', |
17 'writeToJson', 'mergeFromJson', | 17 'writeToJson', 'mergeFromJson', |
18 'addExtension', 'getExtension', 'setExtension', | 18 'addExtension', 'getExtension', 'setExtension', |
19 'hasExtension', 'clearExtension', | 19 'hasExtension', 'clearExtension', |
20 'getField', 'setField', 'hasField', 'clearField', | 20 'getField', 'setField', 'hasField', 'clearField', |
21 'extensionsAreInitialized', 'mergeFromMessage', 'mergeUnknownFields', | 21 'extensionsAreInitialized', 'mergeFromMessage', 'mergeUnknownFields', |
22 '==', 'info_', 'GeneratedMessage', 'Object']; | 22 '==', 'info_', 'GeneratedMessage', 'Object']; |
23 | 23 |
24 final String classname; | 24 final String classname; |
25 final String fqname; | 25 final String fqname; |
| 26 final ProtobufContainer _parent; |
26 final GenerationContext _context; | 27 final GenerationContext _context; |
27 final DescriptorProto _descriptor; | 28 final DescriptorProto _descriptor; |
28 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; | 29 final List<EnumGenerator> _enumGenerators = <EnumGenerator>[]; |
29 final List<ProtobufField> _fieldList = <ProtobufField>[]; | 30 final List<ProtobufField> _fieldList = <ProtobufField>[]; |
30 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; | 31 final List<MessageGenerator> _messageGenerators = <MessageGenerator>[]; |
31 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; | 32 final List<ExtensionGenerator> _extensionGenerators = <ExtensionGenerator>[]; |
32 final Set<String> _methodNames = new Set<String>(); | 33 final Set<String> _methodNames = new Set<String>(); |
33 | 34 |
34 MessageGenerator(DescriptorProto descriptor, ProtobufContainer parent, | 35 MessageGenerator( |
35 this._context) | 36 DescriptorProto descriptor, ProtobufContainer parent, this._context) |
36 : _descriptor = descriptor, | 37 : _descriptor = descriptor, |
37 classname = (parent == null || parent.classname == '') ? | 38 _parent = parent, |
| 39 classname = (parent.classname == '') ? |
38 descriptor.name : '${parent.classname}_${descriptor.name}', | 40 descriptor.name : '${parent.classname}_${descriptor.name}', |
39 fqname = (parent == null || parent.fqname == null) ? descriptor.name : | 41 fqname = (parent == null || parent.fqname == null) ? descriptor.name : |
40 (parent.fqname == '.' ? | 42 (parent.fqname == '.' ? |
41 '.${descriptor.name}' : '${parent.fqname}.${descriptor.name}') { | 43 '.${descriptor.name}' : '${parent.fqname}.${descriptor.name}') { |
42 _context.register(this); | 44 _context.register(this); |
43 | 45 |
44 for (EnumDescriptorProto e in _descriptor.enumType) { | 46 for (EnumDescriptorProto e in _descriptor.enumType) { |
45 _enumGenerators.add(new EnumGenerator(e, this, _context)); | 47 _enumGenerators.add(new EnumGenerator(e, this, _context)); |
46 } | 48 } |
47 | 49 |
48 for (DescriptorProto n in _descriptor.nestedType) { | 50 for (DescriptorProto n in _descriptor.nestedType) { |
49 _messageGenerators.add(new MessageGenerator(n, this, _context)); | 51 _messageGenerators.add(new MessageGenerator(n, this, _context)); |
50 } | 52 } |
51 | 53 |
52 for (FieldDescriptorProto x in _descriptor.extension) { | 54 for (FieldDescriptorProto x in _descriptor.extension) { |
53 _extensionGenerators.add(new ExtensionGenerator(x, this, _context)); | 55 _extensionGenerators.add(new ExtensionGenerator(x, this, _context)); |
54 } | 56 } |
55 } | 57 } |
56 | 58 |
| 59 String get package => _parent.package; |
| 60 |
57 void initializeFields() { | 61 void initializeFields() { |
58 _fieldList.clear(); | 62 _fieldList.clear(); |
59 for (FieldDescriptorProto field in _descriptor.field) { | 63 for (FieldDescriptorProto field in _descriptor.field) { |
60 _fieldList.add(new ProtobufField(field, this, _context)); | 64 _fieldList.add(new ProtobufField(field, this, _context)); |
61 } | 65 } |
62 for (MessageGenerator m in _messageGenerators) { | 66 for (MessageGenerator m in _messageGenerators) { |
63 m.initializeFields(); | 67 m.initializeFields(); |
64 } | 68 } |
65 } | 69 } |
66 | 70 |
(...skipping 10 matching lines...) Expand all Loading... |
77 } | 81 } |
78 | 82 |
79 out.addBlock('class ${classname} extends GeneratedMessage${SP}{', | 83 out.addBlock('class ${classname} extends GeneratedMessage${SP}{', |
80 '}', () | 84 '}', () |
81 { | 85 { |
82 out.addBlock( | 86 out.addBlock( |
83 'static final BuilderInfo _i = new BuilderInfo(\'${classname}\')', | 87 'static final BuilderInfo _i = new BuilderInfo(\'${classname}\')', |
84 ';', () { | 88 ';', () { |
85 for (ProtobufField field in _fieldList) { | 89 for (ProtobufField field in _fieldList) { |
86 String type = field.shortTypeName; | 90 String type = field.shortTypeName; |
| 91 String fieldType = field.baseTypeForPackage(package); |
87 | 92 |
88 String makeDefault = null; | 93 String makeDefault = null; |
89 if (field.hasInitialization) { | 94 if (field.hasInitialization) { |
90 makeDefault = '${field.initialization}'; | 95 makeDefault = field.initializationForPackage(package); |
91 } | 96 } |
92 String subBuilder = null; | 97 String subBuilder = null; |
93 if (field.message || field.group) { | 98 if (field.message || field.group) { |
94 subBuilder = '()${SP}=>${SP}new ${field.baseType}()'; | 99 subBuilder = '()${SP}=>${SP}new ${fieldType}()'; |
95 } | 100 } |
96 String valueOf = null; | 101 String valueOf = null; |
97 if (field.enm) { | 102 if (field.enm) { |
98 valueOf = '(var v)${SP}=>${SP}${field.baseType}.valueOf(v)'; | 103 valueOf = '(var v)${SP}=>${SP}${fieldType}.valueOf(v)'; |
99 } | 104 } |
100 if ('PM' == type) { | 105 if ('PM' == type) { |
101 // Repeated message: default is an empty list | 106 // Repeated message: default is an empty list |
102 out.println('..m(${field.number},${SP}' | 107 out.println('..m(${field.number},${SP}' |
103 '\'${field.externalFieldName}\',${SP}$subBuilder,' | 108 '\'${field.externalFieldName}\',${SP}$subBuilder,' |
104 '${SP}()${SP}=>${SP}new PbList<${field.baseType}>())'); | 109 '${SP}()${SP}=>${SP}new PbList<${fieldType}>())'); |
105 } else if (type[0] == 'P' && type != 'PG' && type != 'PE') { | 110 } else if (type[0] == 'P' && type != 'PG' && type != 'PE') { |
106 // Repeated, not a message or enum: default is an empty list, | 111 // Repeated, not a message or enum: default is an empty list, |
107 // subBuilder is null, valueOf is null. | 112 // subBuilder is null, valueOf is null. |
108 out.println('..p(${field.number},${SP}' | 113 out.println('..p(${field.number},${SP}' |
109 '\'${field.externalFieldName}\',${SP}GeneratedMessage.$type)'); | 114 '\'${field.externalFieldName}\',${SP}GeneratedMessage.$type)'); |
110 } else if (type == 'OE' || type == 'QE') { | 115 } else if (type == 'OE' || type == 'QE') { |
111 out.println('..e(${field.number},${SP}' | 116 out.println('..e(${field.number},${SP}' |
112 '\'${field.externalFieldName}\',${SP}GeneratedMessage.$type,' | 117 '\'${field.externalFieldName}\',${SP}GeneratedMessage.$type,' |
113 '${SP}$makeDefault,${SP}$valueOf)'); | 118 '${SP}$makeDefault,${SP}$valueOf)'); |
114 } else { | 119 } else { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 225 } |
221 _methodNames.add(identifier); | 226 _methodNames.add(identifier); |
222 _methodNames.add(hasIdentifier); | 227 _methodNames.add(hasIdentifier); |
223 _methodNames.add(clearIdentifier); | 228 _methodNames.add(clearIdentifier); |
224 } else { | 229 } else { |
225 while (_methodNames.contains(identifier)) { | 230 while (_methodNames.contains(identifier)) { |
226 identifier += '_' + field.number.toString(); | 231 identifier += '_' + field.number.toString(); |
227 } | 232 } |
228 _methodNames.add(identifier); | 233 _methodNames.add(identifier); |
229 } | 234 } |
230 out.println('${field.typeString} get ${identifier}' | 235 var fieldTypeString = field.typeStringForPackage(package); |
| 236 out.println('${fieldTypeString} get ${identifier}' |
231 '${SP}=>${SP}getField(${field.number});'); | 237 '${SP}=>${SP}getField(${field.number});'); |
232 if (field.single) { | 238 if (field.single) { |
233 out.println('void set ${identifier}' | 239 out.println('void set ${identifier}' |
234 '(${field.typeString} v)${SP}' | 240 '(${fieldTypeString} v)${SP}' |
235 '{${SP}setField(${field.number},${SP}v);${SP}}'); | 241 '{${SP}setField(${field.number},${SP}v);${SP}}'); |
236 out.println('bool $hasIdentifier()${SP}=>' | 242 out.println('bool $hasIdentifier()${SP}=>' |
237 '${SP}hasField(${field.number});'); | 243 '${SP}hasField(${field.number});'); |
238 out.println('void $clearIdentifier()${SP}=>' | 244 out.println('void $clearIdentifier()${SP}=>' |
239 '${SP}clearField(${field.number});'); | 245 '${SP}clearField(${field.number});'); |
240 } | 246 } |
241 } | 247 } |
242 } | 248 } |
243 } | 249 } |
OLD | NEW |