| Index: lib/file_generator.dart | 
| diff --git a/lib/file_generator.dart b/lib/file_generator.dart | 
| index f1f78f2bd4cb24a8d44fad5d502d625a213849d2..148e2a6ebadfb5fd6e648d99937feb60a22e60cb 100644 | 
| --- a/lib/file_generator.dart | 
| +++ b/lib/file_generator.dart | 
| @@ -4,6 +4,9 @@ | 
|  | 
| part of protoc; | 
|  | 
| +/// Generates the Dart output files for one .proto input file. | 
| +/// | 
| +/// Outputs include .pb.dart, pbenum.dart, and .pbjson.dart. | 
| class FileGenerator extends ProtobufContainer { | 
| /// Returns the the mixin to use by default in this file, | 
| /// or null for no mixin by default. | 
| @@ -111,23 +114,32 @@ class FileGenerator extends ProtobufContainer { | 
| return libraryName; | 
| } | 
|  | 
| -  CodeGeneratorResponse_File generateResponse(OutputConfiguration config) { | 
| -    IndentingWriter out = new IndentingWriter(); | 
| +  /// Generates all the Dart files for this .proto file. | 
| +  List<CodeGeneratorResponse_File> generateFiles(OutputConfiguration config) { | 
| +    if (!_linked) throw new StateError("not linked"); | 
|  | 
| -    generate(out, config); | 
| +    makeFile(String extension, String content) { | 
| +      Uri protoUrl = new Uri.file(_fileDescriptor.name); | 
| +      Uri dartUrl = config.outputPathFor(protoUrl, extension); | 
| +      return new CodeGeneratorResponse_File() | 
| +        ..name = dartUrl.path | 
| +        ..content = content; | 
| +    } | 
|  | 
| -    Uri filePath = new Uri.file(_fileDescriptor.name); | 
| -    return new CodeGeneratorResponse_File() | 
| -      ..name = config.outputPathFor(filePath, ".pb.dart").path | 
| -      ..content = out.toString(); | 
| +    return [ | 
| +      makeFile(".pb.dart", generateMainFile(config)), | 
| +      makeFile(".pbenum.dart", generateEnumFile(config)), | 
| +      makeFile(".pbjson.dart", generateJsonFile(config)), | 
| +    ]; | 
| } | 
|  | 
| -  /// Generates the Dart code for this .proto file. | 
| -  void generate(IndentingWriter out, | 
| +  /// Returns the contents of the .pb.dart file for this .proto file. | 
| +  String generateMainFile( | 
| [OutputConfiguration config = const DefaultOutputConfiguration()]) { | 
| if (!_linked) throw new StateError("not linked"); | 
| +    IndentingWriter out = new IndentingWriter(); | 
|  | 
| -    generateHeader(out, config); | 
| +    writeMainHeader(out, config); | 
|  | 
| // Generate code. | 
| for (MessageGenerator m in messageGenerators) { | 
| @@ -158,10 +170,12 @@ class FileGenerator extends ProtobufContainer { | 
| for (ServiceGenerator s in serviceGenerators) { | 
| s.generate(out); | 
| } | 
| + | 
| +    return out.toString(); | 
| } | 
|  | 
| -  /// Prints header and imports. | 
| -  void generateHeader(IndentingWriter out, | 
| +  /// Writes the header and imports for the .pb.dart file. | 
| +  void writeMainHeader(IndentingWriter out, | 
| [OutputConfiguration config = const DefaultOutputConfiguration()]) { | 
| String libraryName = _generateLibraryName(protoFileUri); | 
| out.println('///\n' | 
| @@ -180,7 +194,7 @@ class FileGenerator extends ProtobufContainer { | 
| } | 
|  | 
| if (_needsProtobufImport) { | 
| -    out.println("import 'package:protobuf/protobuf.dart';"); | 
| +      out.println("import 'package:protobuf/protobuf.dart';"); | 
| out.println(); | 
| } | 
|  | 
| @@ -292,21 +306,10 @@ class FileGenerator extends ProtobufContainer { | 
| return imports; | 
| } | 
|  | 
| -  CodeGeneratorResponse_File generateEnumResponse(OutputConfiguration config) { | 
| -    if (!_linked) throw new StateError("not linked"); | 
| - | 
| -    IndentingWriter out = new IndentingWriter(); | 
| - | 
| -    generateEnumFile(out, config); | 
| - | 
| -    Uri filePath = new Uri.file(_fileDescriptor.name); | 
| -    return new CodeGeneratorResponse_File() | 
| -      ..name = config.outputPathFor(filePath, ".pbenum.dart").path | 
| -      ..content = out.toString(); | 
| -  } | 
| - | 
| -  void generateEnumFile(IndentingWriter out, | 
| +  /// Returns the contents of the .pbenum.dart file for this .proto file. | 
| +  String generateEnumFile( | 
| [OutputConfiguration config = const DefaultOutputConfiguration()]) { | 
| +    if (!_linked) throw new StateError("not linked"); | 
| Uri filePath = new Uri.file(_fileDescriptor.name); | 
| if (filePath.isAbsolute) { | 
| // protoc should never generate a file descriptor with an absolute path. | 
| @@ -315,6 +318,7 @@ class FileGenerator extends ProtobufContainer { | 
|  | 
| var baseLibraryName = _generateLibraryName(filePath); | 
| var libraryName = baseLibraryName + "_pbenum"; | 
| +    var out = new IndentingWriter(); | 
| out.print(''' | 
| /// | 
| //  Generated code. Do not modify. | 
| @@ -335,6 +339,8 @@ library $libraryName; | 
| for (MessageGenerator m in messageGenerators) { | 
| m.generateEnums(out); | 
| } | 
| + | 
| +    return out.toString(); | 
| } | 
|  | 
| /// Returns the number of enum types generated in the .pbenum.dart file. | 
| @@ -346,22 +352,10 @@ library $libraryName; | 
| return count; | 
| } | 
|  | 
| -  CodeGeneratorResponse_File generateJsonDartResponse( | 
| -      OutputConfiguration config) { | 
| -    if (!_linked) throw new StateError("not linked"); | 
| - | 
| -    IndentingWriter out = new IndentingWriter(); | 
| - | 
| -    generateJsonDart(out, config); | 
| - | 
| -    Uri filePath = new Uri.file(_fileDescriptor.name); | 
| -    return new CodeGeneratorResponse_File() | 
| -      ..name = config.outputPathFor(filePath, ".pbjson.dart").path | 
| -      ..content = out.toString(); | 
| -  } | 
| - | 
| -  void generateJsonDart(IndentingWriter out, | 
| +  /// Returns the contents of the .pbjson.dart file for this .proto file. | 
| +  String generateJsonFile( | 
| [OutputConfiguration config = const DefaultOutputConfiguration()]) { | 
| +    if (!_linked) throw new StateError("not linked"); | 
| Uri filePath = new Uri.file(_fileDescriptor.name); | 
| if (filePath.isAbsolute) { | 
| // protoc should never generate a file descriptor with an absolute path. | 
| @@ -370,6 +364,7 @@ library $libraryName; | 
|  | 
| var baseLibraryName = _generateLibraryName(filePath); | 
| var libraryName = baseLibraryName + "_pbjson"; | 
| +    var out = new IndentingWriter(); | 
| out.print(''' | 
| /// | 
| //  Generated code. Do not modify. | 
| @@ -400,6 +395,8 @@ library $libraryName; | 
| for (ServiceGenerator s in serviceGenerators) { | 
| s.generateConstants(out); | 
| } | 
| + | 
| +    return out.toString(); | 
| } | 
|  | 
| /// Returns the generator for each .pbjson.dart file the generated | 
|  |