writeMainHeader method

void writeMainHeader(
  1. IndentingWriter out, [
  2. OutputConfiguration config = const DefaultOutputConfiguration()
])

Writes the header and imports for the .pb.dart file.

Implementation

void writeMainHeader(IndentingWriter out,
    [OutputConfiguration config = const DefaultOutputConfiguration()]) {
  final importWriter = ImportWriter();

  // We only add the dart:async import if there are generic client API
  // generators for services in the FileDescriptorProto.
  if (clientApiGenerators.isNotEmpty) {
    importWriter.addImport(_asyncImportUrl, prefix: asyncImportPrefix);
  }

  importWriter.addImport(_coreImportUrl, prefix: coreImportPrefix);

  if (_needsFixnumImport) {
    importWriter.addImport('package:fixnum/fixnum.dart',
        prefix: fixnumImportPrefix);
  }

  if (_needsProtobufImport) {
    importWriter.addImport(_protobufImportUrl, prefix: protobufImportPrefix);
  }

  for (final libraryUri in findMixinImports()) {
    importWriter.addImport(libraryUri, prefix: mixinImportPrefix);
  }

  // Import the .pb.dart files we depend on.
  final imports = Set<FileGenerator>.identity();
  final enumImports = Set<FileGenerator>.identity();
  _findProtosToImport(imports, enumImports);

  for (final target in imports) {
    _addImport(importWriter, config, target, '.pb.dart');
  }

  for (final target in enumImports) {
    // If we're already adding the main file (.pb.dart) as an import, we don't
    // need to add the enums file, as that's exported from the main file.
    if (!imports.contains(target)) {
      _addImport(importWriter, config, target, '.pbenum.dart');
    }
  }

  importWriter.addExport(_protobufImportUrl,
      members: ['GeneratedMessageGenericExtensions']);

  for (final publicDependency in descriptor.publicDependency) {
    _addExport(importWriter, config,
        Uri.file(descriptor.dependency[publicDependency]), '.pb.dart');
  }

  // Export enums in main file for backward compatibility.
  if (enumCount > 0) {
    final url =
        config.resolveImport(protoFileUri, protoFileUri, '.pbenum.dart');
    importWriter.addExport(url.toString());
  }

  // The well-known-types mixins create src/ refs into package:protobuf; we
  // should likely refactor this so they're regular (non-src/) references.
  //
  // For now, we surpress the analysis warning.
  _writeHeading(out, extraIgnores: {
    if (importWriter.hasSrcImport) 'implementation_imports',
  });

  out.println(importWriter.emit());
}