 Chromium Code Reviews
 Chromium Code Reviews Issue 1192943003:
  changes for 0.3.9  (Closed) 
  Base URL: https://github.com/dart-lang/dart-protoc-plugin.git@master
    
  
    Issue 1192943003:
  changes for 0.3.9  (Closed) 
  Base URL: https://github.com/dart-lang/dart-protoc-plugin.git@master| Index: lib/file_generator.dart | 
| diff --git a/lib/file_generator.dart b/lib/file_generator.dart | 
| index a53c46fd24571ca9ebd7752494bba1b5ff130f63..c7f85d2839b60186354c1cc47ae96848c1af43d4 100644 | 
| --- a/lib/file_generator.dart | 
| +++ b/lib/file_generator.dart | 
| @@ -5,17 +5,20 @@ | 
| part of protoc; | 
| class FileGenerator extends ProtobufContainer { | 
| - // This should match the extension in dart_options.proto. | 
| - static const int implementMapByDefaultOption = 95333044; | 
| - // Returns true if option implement_map_by_default is on for this file. | 
| - static bool _shouldImplementMapByDefault(FileDescriptorProto desc) { | 
| - if (!desc.hasOptions()) return false; | 
| - | 
| - var val = desc.options.unknownFields.getField(implementMapByDefaultOption); | 
| - if (val == null || val.length != 1) return false; | 
| - | 
| - return val.values[0] == 1; | 
| + /// Returns the the mixin to use by default in this file, | 
| + /// or null for no mixin by default. | 
| + static PbMixin _getDefaultMixin(FileDescriptorProto desc) { | 
| + if (!desc.hasOptions()) return null; | 
| + if (!desc.options.hasExtension(Dart_options.defaultMixin)) { | 
| + return null; | 
| + } | 
| + var name = desc.options.getExtension(Dart_options.defaultMixin); | 
| + PbMixin mixin = findMixin(name); | 
| + if (mixin == null) { | 
| + throw("unknown mixin class: ${name}"); | 
| + } | 
| + return mixin; | 
| } | 
| final FileDescriptorProto _fileDescriptor; | 
| @@ -29,7 +32,7 @@ class FileGenerator extends ProtobufContainer { | 
| FileGenerator(this._fileDescriptor, this._parent, this._context) { | 
| _context.register(this); | 
| - bool implementMap = _shouldImplementMapByDefault(_fileDescriptor); | 
| + var defaultMixin = _getDefaultMixin(_fileDescriptor); | 
| // Load and register all enum and message types. | 
| for (EnumDescriptorProto enumType in _fileDescriptor.enumType) { | 
| @@ -37,7 +40,7 @@ class FileGenerator extends ProtobufContainer { | 
| } | 
| for (DescriptorProto messageType in _fileDescriptor.messageType) { | 
| messageGenerators.add( | 
| - new MessageGenerator(messageType, this, _context, implementMap)); | 
| + new MessageGenerator(messageType, this, _context, defaultMixin)); | 
| } | 
| for (FieldDescriptorProto extension in _fileDescriptor.extension) { | 
| extensionGenerators.add( | 
| @@ -97,8 +100,12 @@ class FileGenerator extends ProtobufContainer { | 
| "import 'package:protobuf/protobuf.dart';" | 
| ); | 
| - if (needsMapMixinImport) { | 
| - out.println("import 'dart:collection' show MapMixin;"); | 
| + var mixinImports = findMixinsToImport(); | 
| + var importNames = mixinImports.keys.toList(); | 
| + importNames.sort(); | 
| + for (var imp in importNames) { | 
| + var symbols = mixinImports[imp]; | 
| + out.println("import '${imp}' show ${symbols.join(', ')};"); | 
| 
Søren Gjesse
2015/06/23 06:43:33
This import could cause name-clashes. Should these
 
skybrian
2015/06/23 17:32:42
It's a good point but I'm going to defer this, sin
 
Søren Gjesse
2015/06/24 07:11:27
Please file an issue on this.
 | 
| } | 
| for (String import in _fileDescriptor.dependency) { | 
| @@ -153,13 +160,29 @@ class FileGenerator extends ProtobufContainer { | 
| } | 
| } | 
| - bool get needsMapMixinImport { | 
| - for (var m in messageGenerators) { | 
| - if (m.needsMapMixinImport) { | 
| - return true; | 
| - } | 
| + /// Returns a map from import names to the Dart symbols to be imported. | 
| + Map<String, List<String>> findMixinsToImport() { | 
| + var mixins = new Set<PbMixin>(); | 
| + for (MessageGenerator m in messageGenerators) { | 
| + m.addMixinsTo(mixins); | 
| } | 
| - return false; | 
| + | 
| + var imports = {}; | 
| + for (var m in mixins) { | 
| + var imp = m.importFrom; | 
| + List<String> symbols = imports[imp]; | 
| + if (symbols == null) { | 
| + symbols = []; | 
| + imports[imp] = symbols; | 
| + } | 
| + symbols.add(m.name); | 
| + } | 
| + | 
| + for (var imp in imports.keys) { | 
| + imports[imp].sort(); | 
| + } | 
| + | 
| + return imports; | 
| } | 
| } |