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

Side by Side Diff: lib/file_generator.dart

Issue 1196293003: Initial support for generating client and server stubs for Dart. (Closed) Base URL: https://github.com/dart-lang/dart-protoc-plugin.git@master
Patch Set: don't import dart:async if no services 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 unified diff | Download patch
OLDNEW
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 class FileGenerator extends ProtobufContainer { 7 class FileGenerator extends ProtobufContainer {
8 // This should match the extension in dart_options.proto. 8 // This should match the extension in dart_options.proto.
9 static const int implementMapByDefaultOption = 95333044; 9 static const int implementMapByDefaultOption = 95333044;
10 10
11 // Returns true if option implement_map_by_default is on for this file. 11 // Returns true if option implement_map_by_default is on for this file.
12 static bool _shouldImplementMapByDefault(FileDescriptorProto desc) { 12 static bool _shouldImplementMapByDefault(FileDescriptorProto desc) {
13 if (!desc.hasOptions()) return false; 13 if (!desc.hasOptions()) return false;
14 14
15 var val = desc.options.unknownFields.getField(implementMapByDefaultOption); 15 var val = desc.options.unknownFields.getField(implementMapByDefaultOption);
16 if (val == null || val.length != 1) return false; 16 if (val == null || val.length != 1) return false;
17 17
18 return val.values[0] == 1; 18 return val.values[0] == 1;
19 } 19 }
20 20
21 final FileDescriptorProto _fileDescriptor; 21 final FileDescriptorProto _fileDescriptor;
22 final ProtobufContainer _parent; 22 final ProtobufContainer _parent;
23 final GenerationContext _context; 23 final GenerationContext _context;
24 24
25 final List<EnumGenerator> enumGenerators = <EnumGenerator>[]; 25 final List<EnumGenerator> enumGenerators = <EnumGenerator>[];
26 final List<MessageGenerator> messageGenerators = <MessageGenerator>[]; 26 final List<MessageGenerator> messageGenerators = <MessageGenerator>[];
27 final List<ExtensionGenerator> extensionGenerators = <ExtensionGenerator>[]; 27 final List<ExtensionGenerator> extensionGenerators = <ExtensionGenerator>[];
28 final List<ClientApiGenerator> clientApiGenerators = <ClientApiGenerator>[];
29 final List<ServiceGenerator> serviceGenerators = <ServiceGenerator>[];
28 30
29 FileGenerator(this._fileDescriptor, this._parent, this._context) { 31 FileGenerator(this._fileDescriptor, this._parent, this._context) {
30 _context.register(this); 32 _context.register(this);
31 33
32 bool implementMap = _shouldImplementMapByDefault(_fileDescriptor); 34 bool implementMap = _shouldImplementMapByDefault(_fileDescriptor);
33 35
34 // Load and register all enum and message types. 36 // Load and register all enum and message types.
35 for (EnumDescriptorProto enumType in _fileDescriptor.enumType) { 37 for (EnumDescriptorProto enumType in _fileDescriptor.enumType) {
36 enumGenerators.add(new EnumGenerator(enumType, this, _context)); 38 enumGenerators.add(new EnumGenerator(enumType, this, _context));
37 } 39 }
38 for (DescriptorProto messageType in _fileDescriptor.messageType) { 40 for (DescriptorProto messageType in _fileDescriptor.messageType) {
39 messageGenerators.add( 41 messageGenerators.add(
40 new MessageGenerator(messageType, this, _context, implementMap)); 42 new MessageGenerator(messageType, this, _context, implementMap));
41 } 43 }
42 for (FieldDescriptorProto extension in _fileDescriptor.extension) { 44 for (FieldDescriptorProto extension in _fileDescriptor.extension) {
43 extensionGenerators.add( 45 extensionGenerators.add(
44 new ExtensionGenerator(extension, this, _context)); 46 new ExtensionGenerator(extension, this, _context));
45 } 47 }
48 for (ServiceDescriptorProto service in _fileDescriptor.service) {
49 serviceGenerators.add(new ServiceGenerator(service, this, _context));
50 clientApiGenerators.add(new ClientApiGenerator(service, this, _context));
51 }
46 } 52 }
47 53
48 String get package => _fileDescriptor.package; 54 String get package => _fileDescriptor.package;
49 String get classname => ''; 55 String get classname => '';
50 String get fqname => '.${_fileDescriptor.package}'; 56 String get fqname => '.${_fileDescriptor.package}';
51 57
52 // Extract the filename from a URI and remove the extension. 58 // Extract the filename from a URI and remove the extension.
53 String _fileNameWithoutExtension(Uri filePath) { 59 String _fileNameWithoutExtension(Uri filePath) {
54 String fileName = filePath.pathSegments.last; 60 String fileName = filePath.pathSegments.last;
55 int index = fileName.lastIndexOf("."); 61 int index = fileName.lastIndexOf(".");
(...skipping 24 matching lines...) Expand all
80 86
81 void generate(IndentingWriter out) { 87 void generate(IndentingWriter out) {
82 Uri filePath = new Uri.file(_fileDescriptor.name); 88 Uri filePath = new Uri.file(_fileDescriptor.name);
83 if (filePath.isAbsolute) { 89 if (filePath.isAbsolute) {
84 // protoc should never generate a file descriptor with an absolute path. 90 // protoc should never generate a file descriptor with an absolute path.
85 throw("FAILURE: File with an absolute path is not supported"); 91 throw("FAILURE: File with an absolute path is not supported");
86 } 92 }
87 93
88 String libraryName = _generateLibraryName(filePath); 94 String libraryName = _generateLibraryName(filePath);
89 95
96 // Print header and imports. We only add the dart:async import if there
97 // are services in the FileDescriptorProto.
90 out.println( 98 out.println(
91 '///\n' 99 '///\n'
92 '// Generated code. Do not modify.\n' 100 '// Generated code. Do not modify.\n'
93 '///\n' 101 '///\n'
94 'library $libraryName;\n' 102 'library $libraryName;\n');
95 '\n' 103 if (_fileDescriptor.service.isNotEmpty) {
104 out.println("import 'dart:async'\n;");
105 }
106 out.println(
96 "import 'package:fixnum/fixnum.dart';\n" 107 "import 'package:fixnum/fixnum.dart';\n"
97 "import 'package:protobuf/protobuf.dart';" 108 "import 'package:protobuf/protobuf.dart';"
98 ); 109 );
99 110
100 if (needsMapMixinImport) { 111 if (needsMapMixinImport) {
101 out.println("import 'dart:collection' show MapMixin;"); 112 out.println("import 'dart:collection' show MapMixin;");
102 } 113 }
103 114
104 for (String import in _fileDescriptor.dependency) { 115 for (String import in _fileDescriptor.dependency) {
105 Uri importPath = new Uri.file(import); 116 Uri importPath = new Uri.file(import);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 x.generate(out); 155 x.generate(out);
145 } 156 }
146 out.println('static void registerAllExtensions(ExtensionRegistry ' 157 out.println('static void registerAllExtensions(ExtensionRegistry '
147 'registry) {'); 158 'registry) {');
148 for (ExtensionGenerator x in extensionGenerators) { 159 for (ExtensionGenerator x in extensionGenerators) {
149 out.println(' registry.add(${x.name});'); 160 out.println(' registry.add(${x.name});');
150 } 161 }
151 out.println('}'); 162 out.println('}');
152 }); 163 });
153 } 164 }
165
166 for (ClientApiGenerator c in clientApiGenerators) {
167 c.generate(out);
168 }
169 for (ServiceGenerator s in serviceGenerators) {
170 s.generate(out);
171 }
154 } 172 }
155 173
156 bool get needsMapMixinImport { 174 bool get needsMapMixinImport {
157 for (var m in messageGenerators) { 175 for (var m in messageGenerators) {
158 if (m.needsMapMixinImport) { 176 if (m.needsMapMixinImport) {
159 return true; 177 return true;
160 } 178 }
161 } 179 }
162 return false; 180 return false;
163 } 181 }
(...skipping 13 matching lines...) Expand all
177 _registry[container.fqname] = container; 195 _registry[container.fqname] = container;
178 if (container is FileGenerator) { 196 if (container is FileGenerator) {
179 _files[container._fileDescriptor.name] = container; 197 _files[container._fileDescriptor.name] = container;
180 } 198 }
181 } 199 }
182 200
183 ProtobufContainer operator [](String fqname) => _registry[fqname]; 201 ProtobufContainer operator [](String fqname) => _registry[fqname];
184 202
185 FileGenerator lookupFile(String name) => _files[name]; 203 FileGenerator lookupFile(String name) => _files[name];
186 } 204 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698