generate method
Implementation
void generate(IndentingWriter out) {
checkResolved();
for (var m in _messageGenerators) {
// Don't output the generated map entry type. Instead, the `PbMap` type
// from the protobuf library is used to hold the keys and values.
if (m._descriptor.options.hasMapEntry()) continue;
m.generate(out);
}
for (var oneof in _oneofNames) {
OneofEnumGenerator.generate(
out, oneof.oneofEnumName, _oneofFields[oneof.index]);
}
var mixinClause = '';
if (mixin != null) {
var mixinNames =
mixin!.findMixinsToApply().map((m) => '$mixinImportPrefix.${m.name}');
mixinClause = ' with ${mixinNames.join(", ")}';
}
final conditionalPackageName = 'const $protobufImportPrefix.PackageName(' +
configurationDependent('protobuf.omit_message_names', quoted(package)) +
')';
var packageClause =
package == '' ? '' : ', package: $conditionalPackageName';
var proto3JsonClause = (mixin?.hasProto3JsonHelpers ?? false)
? ', toProto3Json: $mixinImportPrefix.${mixin!.name}.toProto3JsonHelper, '
'fromProto3Json: $mixinImportPrefix.${mixin!.name}.fromProto3JsonHelper'
: '';
out.addAnnotatedBlock(
'class $classname extends $protobufImportPrefix.GeneratedMessage$mixinClause {',
'}', [
NamedLocation(
name: classname, fieldPathSegment: fieldPath, start: 'class '.length)
], () {
for (var oneof in _oneofNames) {
out.addBlock(
'static const $coreImportPrefix.Map<$coreImportPrefix.int, ${oneof.oneofEnumName}> ${oneof.byTagMapName} = {',
'};', () {
for (var field in _oneofFields[oneof.index]) {
final oneofMemberName =
oneofEnumMemberName(field.memberNames!.fieldName);
out.println(
'${field.number} : ${oneof.oneofEnumName}.$oneofMemberName,');
}
out.println('0 : ${oneof.oneofEnumName}.notSet');
});
}
final conditionalMessageName = configurationDependent(
'protobuf.omit_message_names', quoted(messageName));
out.addBlock(
'static final $protobufImportPrefix.BuilderInfo _i = '
'$protobufImportPrefix.BuilderInfo($conditionalMessageName'
'$packageClause'
', createEmptyInstance: create'
'$proto3JsonClause)',
';', () {
for (var oneof = 0; oneof < _oneofFields.length; oneof++) {
var tags =
_oneofFields[oneof].map((ProtobufField f) => f.number).toList();
out.println('..oo($oneof, $tags)');
}
for (var field in _fieldList) {
out.println(field.generateBuilderInfoCall(package));
}
if (_descriptor.extensionRange.isNotEmpty) {
out.println('..hasExtensions = true');
}
if (!_hasRequiredFields(this, <dynamic>{})) {
out.println('..hasRequiredFields = false');
}
});
for (var x in _extensionGenerators) {
x.generate(out);
}
out.println();
out.printlnAnnotated('$classname._() : super();', [
NamedLocation(name: classname, fieldPathSegment: fieldPath, start: 0)
]);
out.print('factory $classname(');
if (_fieldList.isNotEmpty) {
out.println('{');
for (final field in _fieldList) {
_emitDeprecatedIf(field.isDeprecated, out);
if (field.isRepeated && !field.isMapField) {
out.println(
' ${field.baseType.getRepeatedDartTypeIterable(fileGen)}? ${field.memberNames!.fieldName},');
} else {
out.println(
' ${field.getDartType()}? ${field.memberNames!.fieldName},');
}
}
out.print('}');
}
if (_fieldList.isNotEmpty) {
out.println(') {');
out.println(' final _result = create();');
for (final field in _fieldList) {
out.println(' if (${field.memberNames!.fieldName} != null) {');
if (field.isDeprecated) {
out.println(
' // ignore: deprecated_member_use_from_same_package');
}
if (field.isRepeated || field.isMapField) {
out.println(
' _result.${field.memberNames!.fieldName}.addAll(${field.memberNames!.fieldName});');
} else {
out.println(
' _result.${field.memberNames!.fieldName} = ${field.memberNames!.fieldName};');
}
out.println(' }');
}
out.println(' return _result;');
out.println('}');
} else {
out.println(') => create();');
}
out.println(
'factory $classname.fromBuffer($coreImportPrefix.List<$coreImportPrefix.int> i,'
' [$protobufImportPrefix.ExtensionRegistry r = $protobufImportPrefix.ExtensionRegistry.EMPTY])'
' => create()..mergeFromBuffer(i, r);');
out.println('factory $classname.fromJson($coreImportPrefix.String i,'
' [$protobufImportPrefix.ExtensionRegistry r = $protobufImportPrefix.ExtensionRegistry.EMPTY])'
' => create()..mergeFromJson(i, r);');
out.println('''@$coreImportPrefix.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')''');
out.println('$classname clone() =>'
' $classname()..mergeFromMessage(this);');
out.println('''@$coreImportPrefix.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')''');
out.println('$classname copyWith(void Function($classname) updates) =>'
' super.copyWith((message) => updates(message as $classname))'
' as $classname;'
' // ignore: deprecated_member_use');
out.println('$protobufImportPrefix.BuilderInfo get info_ => _i;');
// Factory functions which can be used as default value closures.
out.println("@$coreImportPrefix.pragma('dart2js:noInline')");
out.println('static $classname create() => $classname._();');
out.println('$classname createEmptyInstance() => create();');
out.println(
'static $protobufImportPrefix.PbList<$classname> createRepeated() =>'
' $protobufImportPrefix.PbList<$classname>();');
out.println("@$coreImportPrefix.pragma('dart2js:noInline')");
out.println('static $classname getDefault() =>'
' _defaultInstance ??='
' $protobufImportPrefix.GeneratedMessage.\$_defaultFor<$classname>'
'(create);');
out.println('static $classname? _defaultInstance;');
generateFieldsAccessorsMutators(out);
mixin?.injectHelpers(out);
});
out.println();
}