generate method

void generate(
  1. IndentingWriter out
)

Implementation

void generate(IndentingWriter out) {
  final comment = fileGen?.commentBlock(fieldPath!);
  if (comment != null) {
    out.println(comment);
  }
  out.addAnnotatedBlock(
      'enum $classname implements $protobufImportPrefix.ProtobufEnum {',
      '}\n', [
    NamedLocation(
        name: classname!, fieldPathSegment: fieldPath!, start: 'enum '.length)
  ], () {
    final bool betterProtos = fileGen!.useBetterProtos;
    // -----------------------------------------------------------------
    // Define enum types.
    for (var i = 0; i < _canonicalValues.length; i++) {
      final val = _canonicalValues[i];
      final name = dartNames[val.name]!;
      final omitEnumNames = ConditionalConstDefinition('omit_enum_names');
      out.addSuffix(
          omitEnumNames.constFieldName, omitEnumNames.constDefinition);
      final conditionalValName = omitEnumNames.createTernary(val.name);
      final separator = i < _canonicalValues.length - 1 ? ',' : ';';
      out.printlnAnnotated(
          '$name(${val.number}, \'$name\', $conditionalValName)$separator', [
        NamedLocation(
            name: name,
            fieldPathSegment: List.from(fieldPath!)
              ..addAll([_enumValueTag, _originalCanonicalIndices[i]]),
            start: 0)
      ]);
    }
    if (_aliases.isNotEmpty) {
      out.println();
      for (var i = 0; i < _aliases.length; i++) {
        final alias = _aliases[i];
        final name = dartNames[alias.value.name]!;
        out.printlnAnnotated(
            'static const $classname $name ='
            ' ${dartNames[alias.canonicalValue.name]};',
            [
              NamedLocation(
                  name: name,
                  fieldPathSegment: List.from(fieldPath!)
                    ..addAll([_enumValueTag, _originalAliasIndices[i]]),
                  start: 'static const $classname '.length)
            ]);
      }
    }
    out.println();

    out.println('$overridePrefix final $coreImportPrefix.int value;');
    out.println();

    /// We must always override `name` because ProtobufEnum unfortunately requires it.
    out.println('$overridePrefix final $coreImportPrefix.String name;');
    out.println();

    out.println(
        'final $coreImportPrefix.String ${betterProtos ? 'protoName' : 'dartName'};');
    out.println();

    if (!betterProtos) {
      out.println('''
/// protobuf.dart 3 spec:
/// https://pub.dev/documentation/protobuf/latest/protobuf/ProtobufEnum/toString.html
/// Returns this enum's [name] or the [value] if names are not represented.
@\$core.override
\$core.String toString() => name == '' ? value.toString() : name;
    ''');
    }

    out.println(
        'static final $coreImportPrefix.Map<$coreImportPrefix.int, $classname> _byValue ='
        ' $protobufImportPrefix.ProtobufEnum.initByValue(values);');
    out.println('static $classname? valueOf($coreImportPrefix.int value) =>'
        ' _byValue[value];');
    out.println();

    out.println(
        'static final $coreImportPrefix.Map<$coreImportPrefix.String, $classname> _byProtoName ='
        ' { for (final value in values) value.${betterProtos ? 'protoName' : 'name'}: value };');
    out.println(
        'static final $coreImportPrefix.Map<$coreImportPrefix.String, $classname> _byDartName ='
        ' values.asNameMap();');

    final unspecifiedRegexp = RegExp(r'(unspecified|unknown|undefined)$',
        caseSensitive: false, multiLine: true);
    final unspecifiedValue = dartNames.values
        .firstWhereOrNull((name) => unspecifiedRegexp.hasMatch(name));
    final bool hasUnspecified = unspecifiedValue != null;
    final String orUnspecified =
        hasUnspecified ? ' ?? $unspecifiedValue' : '';

    out.println(
        'static $classname${hasUnspecified ? '' : '?'} ofProtoName($coreImportPrefix.String name) =>'
        ' _byProtoName[name]$orUnspecified;');
    out.println(
        'static $classname${hasUnspecified ? '' : '?'} ofDartName($coreImportPrefix.String name) =>'
        ' _byDartName[name]$orUnspecified;');
    out.println();

    if (betterProtos) {
      out.println('const $classname(this.value, this.name, this.protoName);');
    } else {
      out.println('const $classname(this.value, this.dartName, this.name);');
    }
  });
}