Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of protoc; | 5 part of protoc; |
| 6 | 6 |
| 7 final _dartIdentifier = new RegExp(r'^\w+$'); | |
| 8 | |
| 7 /// Generates the Dart output files for one .proto input file. | 9 /// Generates the Dart output files for one .proto input file. |
| 8 /// | 10 /// |
| 9 /// Outputs include .pb.dart, pbenum.dart, and .pbjson.dart. | 11 /// Outputs include .pb.dart, pbenum.dart, and .pbjson.dart. |
| 10 class FileGenerator extends ProtobufContainer { | 12 class FileGenerator extends ProtobufContainer { |
| 11 /// Returns the the mixin to use by default in this file, | 13 /// Reads the declared mixins in the file, keyed by name. |
| 12 /// or null for no mixin by default. | 14 static Map<String, DartMixin> _getDeclaredMixins(FileDescriptorProto desc) { |
| 13 static PbMixin _getDefaultMixin(FileDescriptorProto desc) { | 15 final mixins = <String, DartMixin>{}; |
| 14 if (!desc.hasOptions()) return null; | 16 if (!desc.hasOptions() || !desc.options.hasExtension(Dart_options.mixins)) { |
| 15 if (!desc.options.hasExtension(Dart_options.defaultMixin)) { | 17 return mixins; |
| 16 return null; | |
| 17 } | 18 } |
| 18 var name = desc.options.getExtension(Dart_options.defaultMixin); | 19 for (DartMixin mixin in desc.options.getExtension(Dart_options.mixins)) { |
| 19 PbMixin mixin = findMixin(name); | 20 if (mixins.containsKey(mixin.name)) { |
| 20 if (mixin == null) { | 21 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.
| |
| 21 throw ("unknown mixin class: ${name}"); | 22 } |
| 23 if (!mixin.name.startsWith(_dartIdentifier)) { | |
| 24 throw ('Mixin name "${mixin.name}" is not a valid dart class ' | |
| 25 'identifier'); | |
| 26 } | |
| 27 if (mixin.hasParent() && !mixin.parent.startsWith(_dartIdentifier)) { | |
| 28 throw ('Mixin parent "${mixin.parent}" of ${mixin.name} is not a valid ' | |
| 29 'dart class identifier'); | |
| 30 } | |
| 31 mixins[mixin.name] = mixin; | |
| 22 } | 32 } |
|
skybrian
2016/06/22 19:27:18
Also check for cycles?
frederikmutzel
2016/06/23 12:30:16
Done.
| |
| 23 return mixin; | 33 return mixins; |
| 24 } | 34 } |
| 25 | 35 |
| 26 final FileDescriptorProto _fileDescriptor; | 36 final FileDescriptorProto _fileDescriptor; |
| 27 | 37 |
| 28 // The relative path used to import the .proto file, as a URI. | 38 // The relative path used to import the .proto file, as a URI. |
| 29 final Uri protoFileUri; | 39 final Uri protoFileUri; |
| 30 | 40 |
| 31 final List<EnumGenerator> enumGenerators = <EnumGenerator>[]; | 41 final List<EnumGenerator> enumGenerators = <EnumGenerator>[]; |
| 32 final List<MessageGenerator> messageGenerators = <MessageGenerator>[]; | 42 final List<MessageGenerator> messageGenerators = <MessageGenerator>[]; |
| 33 final List<ExtensionGenerator> extensionGenerators = <ExtensionGenerator>[]; | 43 final List<ExtensionGenerator> extensionGenerators = <ExtensionGenerator>[]; |
| 34 final List<ClientApiGenerator> clientApiGenerators = <ClientApiGenerator>[]; | 44 final List<ClientApiGenerator> clientApiGenerators = <ClientApiGenerator>[]; |
| 35 final List<ServiceGenerator> serviceGenerators = <ServiceGenerator>[]; | 45 final List<ServiceGenerator> serviceGenerators = <ServiceGenerator>[]; |
| 36 | 46 |
| 37 /// True if cross-references have been resolved. | 47 /// True if cross-references have been resolved. |
| 38 bool _linked = false; | 48 bool _linked = false; |
| 39 | 49 |
| 40 FileGenerator(FileDescriptorProto descriptor) | 50 FileGenerator(FileDescriptorProto descriptor) |
| 41 : _fileDescriptor = descriptor, | 51 : _fileDescriptor = descriptor, |
| 42 protoFileUri = new Uri.file(descriptor.name) { | 52 protoFileUri = new Uri.file(descriptor.name) { |
| 43 if (protoFileUri.isAbsolute) { | 53 if (protoFileUri.isAbsolute) { |
| 44 // protoc should never generate an import with an absolute path. | 54 // protoc should never generate an import with an absolute path. |
| 45 throw "FAILURE: Import with absolute path is not supported"; | 55 throw "FAILURE: Import with absolute path is not supported"; |
| 46 } | 56 } |
| 47 | 57 |
| 48 var defaultMixin = _getDefaultMixin(_fileDescriptor); | 58 var declaredMixins = _getDeclaredMixins(descriptor); |
| 59 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.
| |
| 60 descriptor.options?.getExtension(Dart_options.defaultMixin); | |
| 49 | 61 |
| 50 // Load and register all enum and message types. | 62 // Load and register all enum and message types. |
| 51 for (EnumDescriptorProto enumType in _fileDescriptor.enumType) { | 63 for (EnumDescriptorProto enumType in _fileDescriptor.enumType) { |
| 52 enumGenerators.add(new EnumGenerator(enumType, this)); | 64 enumGenerators.add(new EnumGenerator(enumType, this)); |
| 53 } | 65 } |
| 54 for (DescriptorProto messageType in _fileDescriptor.messageType) { | 66 for (DescriptorProto messageType in _fileDescriptor.messageType) { |
| 55 messageGenerators | 67 messageGenerators.add(new MessageGenerator( |
| 56 .add(new MessageGenerator(messageType, this, defaultMixin)); | 68 messageType, this, declaredMixins, defaultMixin)); |
| 57 } | 69 } |
| 58 for (FieldDescriptorProto extension in _fileDescriptor.extension) { | 70 for (FieldDescriptorProto extension in _fileDescriptor.extension) { |
| 59 extensionGenerators.add(new ExtensionGenerator(extension, this)); | 71 extensionGenerators.add(new ExtensionGenerator(extension, this)); |
| 60 } | 72 } |
| 61 for (ServiceDescriptorProto service in _fileDescriptor.service) { | 73 for (ServiceDescriptorProto service in _fileDescriptor.service) { |
| 62 var serviceGen = new ServiceGenerator(service, this); | 74 var serviceGen = new ServiceGenerator(service, this); |
| 63 serviceGenerators.add(serviceGen); | 75 serviceGenerators.add(serviceGen); |
| 64 clientApiGenerators.add(new ClientApiGenerator(serviceGen)); | 76 clientApiGenerators.add(new ClientApiGenerator(serviceGen)); |
| 65 } | 77 } |
| 66 } | 78 } |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 FileGenerator target, String extension) { | 427 FileGenerator target, String extension) { |
| 416 Uri resolvedImport = | 428 Uri resolvedImport = |
| 417 config.resolveImport(target.protoFileUri, protoFileUri, extension); | 429 config.resolveImport(target.protoFileUri, protoFileUri, extension); |
| 418 out.print("import '$resolvedImport'"); | 430 out.print("import '$resolvedImport'"); |
| 419 if (package != target.package && target.package.isNotEmpty) { | 431 if (package != target.package && target.package.isNotEmpty) { |
| 420 out.print(' as ${target.packageImportPrefix}'); | 432 out.print(' as ${target.packageImportPrefix}'); |
| 421 } | 433 } |
| 422 out.println(';'); | 434 out.println(';'); |
| 423 } | 435 } |
| 424 } | 436 } |
| OLD | NEW |