Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Unified Diff: lib/file_generator.dart

Issue 1192943003: changes for 0.3.9 (Closed) Base URL: https://github.com/dart-lang/dart-protoc-plugin.git@master
Patch Set: made mixins more general Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/code_generator.dart ('k') | lib/message_generator.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
}
« no previous file with comments | « lib/code_generator.dart ('k') | lib/message_generator.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698