generate method
Implementation
void generate(IndentingWriter out) {
checkResolved();
for (final 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 (final oneof in _oneofNames) {
OneofEnumGenerator.generate(
out,
oneof,
_oneofFields[oneof.index],
fieldPath,
);
}
var mixinClause = '';
if (mixin != null) {
final mixinNames = mixin!.findMixinsToApply().map(
(m) => '$mixinImportPrefix.${m.name}',
);
mixinClause = ' with ${mixinNames.join(", ")}';
}
final omitMessageNames = ConditionalConstDefinition('omit_message_names');
out.addSuffix(
omitMessageNames.constFieldName,
omitMessageNames.constDefinition,
);
final conditionalPackageName =
'const $protobufImportPrefix.PackageName'
'(${omitMessageNames.createTernary(package)})';
final packageClause =
package == '' ? '' : ', package: $conditionalPackageName';
final proto3JsonClause =
(mixin?.wellKnownType != null)
? ', wellKnownType: $mixinImportPrefix.WellKnownType.${mixin!.wellKnownType}'
: '';
final String extendedClass;
if (_descriptor.options.messageSetWireFormat) {
extendedClass = '\$_MessageSet';
} else {
extendedClass = 'GeneratedMessage';
}
final commentBlock = fileGen.commentBlock(fieldPath);
if (commentBlock != null) {
out.println(commentBlock);
}
if (_descriptor.options.deprecated) {
out.println(
'@$coreImportPrefix.Deprecated(\'This message is deprecated\')',
);
}
out.addAnnotatedBlock(
'class $classname extends $protobufImportPrefix.$extendedClass$mixinClause {',
'}',
[
NamedLocation(
name: classname,
fieldPathSegment: fieldPath,
start: 'class '.length,
),
],
() {
_generateFactory(out);
out.println();
out.printlnAnnotated('$classname._();', [
NamedLocation(name: classname, fieldPathSegment: fieldPath, start: 0),
]);
out.println();
out.println(
'factory $classname.fromBuffer($coreImportPrefix.List<$coreImportPrefix.int> data,'
' [$protobufImportPrefix.ExtensionRegistry registry = $protobufImportPrefix.ExtensionRegistry.EMPTY])'
' => create()..mergeFromBuffer(data, registry);',
);
out.println(
'factory $classname.fromJson($coreImportPrefix.String json,'
' [$protobufImportPrefix.ExtensionRegistry registry = $protobufImportPrefix.ExtensionRegistry.EMPTY])'
' => create()..mergeFromJson(json, registry);',
);
out.println();
for (final oneof in _oneofNames) {
out.addBlock(
'static const $coreImportPrefix.Map<$coreImportPrefix.int, ${oneof.oneofEnumName}> ${oneof.byTagMapName} = {',
'};',
() {
for (final 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 omitMessageNames = ConditionalConstDefinition(
'omit_message_names',
);
out.addSuffix(
omitMessageNames.constFieldName,
omitMessageNames.constDefinition,
);
out.addBlock(
'static final $protobufImportPrefix.BuilderInfo _i = '
'$protobufImportPrefix.BuilderInfo(${omitMessageNames.createTernary(messageName)}'
'$packageClause'
', createEmptyInstance: create'
'$proto3JsonClause)',
';',
() {
for (var oneof = 0; oneof < _oneofFields.length; oneof++) {
final tags =
_oneofFields[oneof]
.map((ProtobufField f) => f.number)
.toList();
out.println('..oo($oneof, $tags)');
}
for (final field in fieldList) {
field.generateBuilderInfoCall(out, package);
}
if (_descriptor.extensionRange.isNotEmpty) {
out.println('..hasExtensions = true');
}
if (!_hasRequiredFields(this, {})) {
out.println('..hasRequiredFields = false');
}
},
);
for (final x in _extensionGenerators) {
x.generate(out);
}
out.println();
out.println(
'@$coreImportPrefix.Deprecated('
"'See https://github.com/google/protobuf.dart/issues/998.')",
);
out.println('$classname clone() => deepCopy();');
out.println(
'@$coreImportPrefix.Deprecated('
"'See https://github.com/google/protobuf.dart/issues/998.')",
);
out.println(
'$classname copyWith(void Function($classname) updates) =>'
' super.copyWith((message) => updates(message as $classname))'
' as $classname;',
);
out.println();
out.println('@$coreImportPrefix.override');
out.println('$protobufImportPrefix.BuilderInfo get info_ => _i;');
// Factory functions which can be used as default value closures.
out.println();
out.println("@$coreImportPrefix.pragma('dart2js:noInline')");
out.println('static $classname create() => $classname._();');
out.println('@$coreImportPrefix.override');
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();
}