Chromium Code Reviews| Index: lib/file_generator.dart |
| diff --git a/lib/file_generator.dart b/lib/file_generator.dart |
| index 65cba47953dcc0339f235c9dafccf6333952c871..fd8f0ab93c079fec3f8951628087f41fe603f8c1 100644 |
| --- a/lib/file_generator.dart |
| +++ b/lib/file_generator.dart |
| @@ -4,23 +4,33 @@ |
| part of protoc; |
| +final _dartIdentifier = new RegExp(r'^\w+$'); |
| + |
| /// 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. |
| - 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; |
| + /// Reads the declared mixins in the file, keyed by name. |
| + static Map<String, DartMixin> _getDeclaredMixins(FileDescriptorProto desc) { |
| + final mixins = <String, DartMixin>{}; |
| + if (!desc.hasOptions() || !desc.options.hasExtension(Dart_options.mixins)) { |
| + return mixins; |
| + } |
| + for (DartMixin mixin in desc.options.getExtension(Dart_options.mixins)) { |
| + if (mixins.containsKey(mixin.name)) { |
| + throw ('Duplicate mixin name: "${mixin.name}"'); |
|
skybrian
2016/06/22 19:27:18
style nit: parentheses aren't needed.
skybrian
2016/06/22 20:29:52
When we throw we should give some indication of th
frederikmutzel
2016/06/23 12:30:16
Done.
frederikmutzel
2016/06/23 12:30:16
Done.
|
| + } |
| + if (!mixin.name.startsWith(_dartIdentifier)) { |
| + throw ('Mixin name "${mixin.name}" is not a valid dart class ' |
| + 'identifier'); |
| + } |
| + if (mixin.hasParent() && !mixin.parent.startsWith(_dartIdentifier)) { |
| + throw ('Mixin parent "${mixin.parent}" of ${mixin.name} is not a valid ' |
| + 'dart class identifier'); |
| + } |
| + mixins[mixin.name] = mixin; |
| + } |
|
skybrian
2016/06/22 19:27:18
Also check for cycles?
frederikmutzel
2016/06/23 12:30:16
Done.
|
| + return mixins; |
| } |
| final FileDescriptorProto _fileDescriptor; |
| @@ -45,15 +55,17 @@ class FileGenerator extends ProtobufContainer { |
| throw "FAILURE: Import with absolute path is not supported"; |
| } |
| - var defaultMixin = _getDefaultMixin(_fileDescriptor); |
| + var declaredMixins = _getDeclaredMixins(descriptor); |
| + var defaultMixin = |
|
skybrian
2016/06/22 20:29:52
should check that we can find defaultMixin.
It wil
frederikmutzel
2016/06/23 12:30:16
Done.
|
| + descriptor.options?.getExtension(Dart_options.defaultMixin); |
| // Load and register all enum and message types. |
| for (EnumDescriptorProto enumType in _fileDescriptor.enumType) { |
| enumGenerators.add(new EnumGenerator(enumType, this)); |
| } |
| for (DescriptorProto messageType in _fileDescriptor.messageType) { |
| - messageGenerators |
| - .add(new MessageGenerator(messageType, this, defaultMixin)); |
| + messageGenerators.add(new MessageGenerator( |
| + messageType, this, declaredMixins, defaultMixin)); |
| } |
| for (FieldDescriptorProto extension in _fileDescriptor.extension) { |
| extensionGenerators.add(new ExtensionGenerator(extension, this)); |