blob: 6fd7ca5070a344f36ebc6270f12f5d7cd067a420 [file] [log] [blame]
Feng Xiaoe841bac2015-12-11 17:09:20 -08001// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#ifndef GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
32#define GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
33
34#include <string>
35#include <set>
36
37#include <google/protobuf/compiler/code_generator.h>
38
39namespace google {
40namespace protobuf {
41
42class Descriptor;
43class EnumDescriptor;
44class FieldDescriptor;
45class OneofDescriptor;
46class FileDescriptor;
47
48namespace io { class Printer; }
49
50namespace compiler {
51namespace js {
52
53struct GeneratorOptions {
54 // Add a `goog.requires()` call for each enum type used. If not set, a forward
55 // declaration with `goog.forwardDeclare` is produced instead.
56 bool add_require_for_enums;
57 // Set this as a test-only module via `goog.setTestOnly();`.
58 bool testonly;
59 // Output path.
60 string output_dir;
61 // Namespace prefix.
62 string namespace_prefix;
63 // Create a library with name <name>_lib.js rather than a separate .js file
64 // per type?
65 string library;
66 // Error if there are two types that would generate the same output file?
67 bool error_on_name_conflict;
68 // Enable binary-format support?
69 bool binary;
Josh Haberman55cc3aa2016-02-02 15:18:34 -080070 // What style of imports should be used.
71 enum ImportStyle {
72 IMPORT_CLOSURE, // goog.require()
73 IMPORT_COMMONJS, // require()
74 IMPORT_BROWSER, // no import statements
75 IMPORT_ES6, // import { member } from ''
76 } import_style;
Feng Xiaoe841bac2015-12-11 17:09:20 -080077
78 GeneratorOptions()
79 : add_require_for_enums(false),
80 testonly(false),
81 output_dir("."),
82 namespace_prefix(""),
83 library(""),
84 error_on_name_conflict(false),
Josh Haberman55cc3aa2016-02-02 15:18:34 -080085 binary(false),
86 import_style(IMPORT_CLOSURE) {}
Feng Xiaoe841bac2015-12-11 17:09:20 -080087
88 bool ParseFromOptions(
89 const vector< pair< string, string > >& options,
90 string* error);
91};
92
93class LIBPROTOC_EXPORT Generator : public CodeGenerator {
94 public:
95 Generator() {}
96 virtual ~Generator() {}
97
98 virtual bool Generate(const FileDescriptor* file,
99 const string& parameter,
100 GeneratorContext* context,
101 string* error) const {
102 *error = "Unimplemented Generate() method. Call GenerateAll() instead.";
103 return false;
104 }
105
106 virtual bool HasGenerateAll() const { return true; }
107
108 virtual bool GenerateAll(const vector<const FileDescriptor*>& files,
109 const string& parameter,
110 GeneratorContext* context,
111 string* error) const;
112
113 private:
114 void GenerateHeader(const GeneratorOptions& options,
115 io::Printer* printer) const;
116
117 // Generate goog.provides() calls.
118 void FindProvides(const GeneratorOptions& options,
119 io::Printer* printer,
120 const vector<const FileDescriptor*>& file,
121 std::set<string>* provided) const;
Josh Haberman55cc3aa2016-02-02 15:18:34 -0800122 void FindProvidesForFile(const GeneratorOptions& options,
123 io::Printer* printer,
124 const FileDescriptor* file,
125 std::set<string>* provided) const;
Feng Xiaoe841bac2015-12-11 17:09:20 -0800126 void FindProvidesForMessage(const GeneratorOptions& options,
127 io::Printer* printer,
128 const Descriptor* desc,
129 std::set<string>* provided) const;
130 void FindProvidesForEnum(const GeneratorOptions& options,
131 io::Printer* printer,
132 const EnumDescriptor* enumdesc,
133 std::set<string>* provided) const;
134 // For extension fields at file scope.
135 void FindProvidesForFields(const GeneratorOptions& options,
136 io::Printer* printer,
137 const vector<const FieldDescriptor*>& fields,
138 std::set<string>* provided) const;
139 // Print the goog.provides() found by the methods above.
140 void GenerateProvides(const GeneratorOptions& options,
141 io::Printer* printer,
142 std::set<string>* provided) const;
143
144 // Generate goog.setTestOnly() if indicated.
145 void GenerateTestOnly(const GeneratorOptions& options,
146 io::Printer* printer) const;
147
148 // Generate goog.requires() calls.
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700149 void GenerateRequiresForLibrary(const GeneratorOptions& options,
150 io::Printer* printer,
151 const vector<const FileDescriptor*>& files,
152 std::set<string>* provided) const;
153 void GenerateRequiresForMessage(const GeneratorOptions& options,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800154 io::Printer* printer,
155 const Descriptor* desc,
156 std::set<string>* provided) const;
157 // For extension fields at file scope.
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700158 void GenerateRequiresForExtensions(
159 const GeneratorOptions& options, io::Printer* printer,
160 const vector<const FieldDescriptor*>& fields,
161 std::set<string>* provided) const;
Feng Xiaoe841bac2015-12-11 17:09:20 -0800162 void GenerateRequiresImpl(const GeneratorOptions& options,
163 io::Printer* printer,
164 std::set<string>* required,
165 std::set<string>* forwards,
166 std::set<string>* provided,
167 bool require_jspb,
168 bool require_extension) const;
169 void FindRequiresForMessage(const GeneratorOptions& options,
170 const Descriptor* desc,
171 std::set<string>* required,
172 std::set<string>* forwards,
173 bool* have_message) const;
174 void FindRequiresForField(const GeneratorOptions& options,
175 const FieldDescriptor* field,
176 std::set<string>* required,
177 std::set<string>* forwards) const;
178 void FindRequiresForExtension(const GeneratorOptions& options,
179 const FieldDescriptor* field,
180 std::set<string>* required,
181 std::set<string>* forwards) const;
182
Josh Haberman55cc3aa2016-02-02 15:18:34 -0800183 void GenerateFile(const GeneratorOptions& options,
184 io::Printer* printer,
185 const FileDescriptor* file) const;
186
Feng Xiaoe841bac2015-12-11 17:09:20 -0800187 // Generate definitions for all message classes and enums in all files,
188 // processing the files in dependence order.
189 void GenerateFilesInDepOrder(const GeneratorOptions& options,
190 io::Printer* printer,
191 const vector<const FileDescriptor*>& file) const;
192 // Helper for above.
193 void GenerateFileAndDeps(const GeneratorOptions& options,
194 io::Printer* printer,
195 const FileDescriptor* root,
196 std::set<const FileDescriptor*>* all_files,
197 std::set<const FileDescriptor*>* generated) const;
198
199 // Generate definitions for all message classes and enums.
200 void GenerateClassesAndEnums(const GeneratorOptions& options,
201 io::Printer* printer,
202 const FileDescriptor* file) const;
203
204 // Generate definition for one class.
205 void GenerateClass(const GeneratorOptions& options,
206 io::Printer* printer,
207 const Descriptor* desc) const;
208 void GenerateClassConstructor(const GeneratorOptions& options,
209 io::Printer* printer,
210 const Descriptor* desc) const;
211 void GenerateClassFieldInfo(const GeneratorOptions& options,
212 io::Printer* printer,
213 const Descriptor* desc) const;
214 void GenerateClassXid(const GeneratorOptions& options,
215 io::Printer* printer,
216 const Descriptor* desc) const;
217 void GenerateOneofCaseDefinition(const GeneratorOptions& options,
218 io::Printer* printer,
219 const OneofDescriptor* oneof) const;
220 void GenerateClassToObject(const GeneratorOptions& options,
221 io::Printer* printer,
222 const Descriptor* desc) const;
223 void GenerateClassFieldToObject(const GeneratorOptions& options,
224 io::Printer* printer,
225 const FieldDescriptor* field) const;
226 void GenerateClassFromObject(const GeneratorOptions& options,
227 io::Printer* printer,
228 const Descriptor* desc) const;
229 void GenerateClassFieldFromObject(const GeneratorOptions& options,
230 io::Printer* printer,
231 const FieldDescriptor* field) const;
232 void GenerateClassClone(const GeneratorOptions& options,
233 io::Printer* printer,
234 const Descriptor* desc) const;
235 void GenerateClassRegistration(const GeneratorOptions& options,
236 io::Printer* printer,
237 const Descriptor* desc) const;
238 void GenerateClassFields(const GeneratorOptions& options,
239 io::Printer* printer,
240 const Descriptor* desc) const;
241 void GenerateClassField(const GeneratorOptions& options,
242 io::Printer* printer,
243 const FieldDescriptor* desc) const;
244 void GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
245 io::Printer* printer,
246 const Descriptor* desc) const;
247 void GenerateClassDeserialize(const GeneratorOptions& options,
248 io::Printer* printer,
249 const Descriptor* desc) const;
250 void GenerateClassDeserializeBinary(const GeneratorOptions& options,
251 io::Printer* printer,
252 const Descriptor* desc) const;
253 void GenerateClassDeserializeBinaryField(const GeneratorOptions& options,
254 io::Printer* printer,
255 const FieldDescriptor* field) const;
256 void GenerateClassSerializeBinary(const GeneratorOptions& options,
257 io::Printer* printer,
258 const Descriptor* desc) const;
259 void GenerateClassSerializeBinaryField(const GeneratorOptions& options,
260 io::Printer* printer,
261 const FieldDescriptor* field) const;
262
263 // Generate definition for one enum.
264 void GenerateEnum(const GeneratorOptions& options,
265 io::Printer* printer,
266 const EnumDescriptor* enumdesc) const;
267
268 // Generate an extension definition.
269 void GenerateExtension(const GeneratorOptions& options,
270 io::Printer* printer,
271 const FieldDescriptor* field) const;
272
273 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator);
274};
275
276} // namespace js
277} // namespace compiler
278} // namespace protobuf
279
280} // namespace google
281#endif // GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__