| 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 |