webkit  2cdf99a9e3038c7e01b3c37e8ad903ecbe5eecf1
https://github.com/WebKit/webkit
js_generator.h
Go to the documentation of this file.
1 // 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 
38 
39 namespace google {
40 namespace protobuf {
41 
42 class Descriptor;
43 class EnumDescriptor;
44 class FieldDescriptor;
45 class OneofDescriptor;
46 class FileDescriptor;
47 
48 namespace io { class Printer; }
49 
50 namespace compiler {
51 namespace js {
52 
54  // Add a `goog.requires()` call for each enum type used. If not set, a forward
55  // declaration with `goog.forwardDeclare` is produced instead.
57  // Set this as a test-only module via `goog.setTestOnly();`.
58  bool testonly;
59  // Output path.
60  string output_dir;
61  // 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?
68  // Enable binary-format support?
69  bool binary;
70  // 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;
77 
79  : add_require_for_enums(false),
80  testonly(false),
81  output_dir("."),
82  namespace_prefix(""),
83  library(""),
84  error_on_name_conflict(false),
85  binary(false),
86  import_style(IMPORT_CLOSURE) {}
87 
88  bool ParseFromOptions(
89  const vector< pair< string, string > >& options,
90  string* error);
91 };
92 
94  public:
95  Generator() {}
96  virtual ~Generator() {}
97 
98  virtual bool Generate(const FileDescriptor* file,
99  const string& parameter,
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,
111  string* error) const;
112 
113  private:
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;
122  void FindProvidesForFile(const GeneratorOptions& options,
123  io::Printer* printer,
124  const FileDescriptor* file,
125  std::set<string>* provided) const;
126  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.
149  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,
154  io::Printer* printer,
155  const Descriptor* desc,
156  std::set<string>* provided) const;
157  // For extension fields at file scope.
158  void GenerateRequiresForExtensions(
159  const GeneratorOptions& options, io::Printer* printer,
160  const vector<const FieldDescriptor*>& fields,
161  std::set<string>* provided) const;
162  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 
183  void GenerateFile(const GeneratorOptions& options,
184  io::Printer* printer,
185  const FileDescriptor* file) const;
186 
187  // 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 
274 };
275 
276 } // namespace js
277 } // namespace compiler
278 } // namespace protobuf
279 
280 } // namespace google
281 #endif // GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
Definition: upb.c:6604
Definition: EncryptedMediaExtensions.idl:15
Definition: descriptor.h:801
Definition: printer.h:164
const FieldDescriptor * field
Definition: parser_unittest.cc:2279
void GenerateEnum(const google::protobuf::EnumDescriptor *en, google::protobuf::io::Printer *printer)
Definition: ruby_generator.cc:220
Definition: code_generator.h:121
def root
Definition: pyjsontestrunner.py:60
Definition: protobuf.h:90
virtual ~Generator()
Definition: js_generator.h:96
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
Definition: macros.h:40
options
Definition: CodeGeneratorReplayInputs.py:1046
virtual bool Generate(const FileDescriptor *file, const string &parameter, GeneratorContext *context, string *error) const
Definition: js_generator.h:98
Definition: descriptor.h:1156
Definition: descriptor.h:172
bool error_on_name_conflict
Definition: js_generator.h:67
virtual bool HasGenerateAll() const
Definition: js_generator.h:106
#define desc
Definition: extension_set.h:320
Definition: descriptor.h:439
bool testonly
Definition: js_generator.h:58
list files
Definition: generate-combined-inspector-json.py:35
string library
Definition: js_generator.h:65
VoEFile * file
Definition: voe_cmd_test.cc:59
Definition: protobuf.h:85
bool binary
Definition: js_generator.h:69
def GenerateFile(path, content)
Definition: gen_gtest_pred_impl.py:304
bool add_require_for_enums
Definition: js_generator.h:56
Definition: EncryptedMediaExtensions.idl:80
Definition: __init__.py:1
string namespace_prefix
Definition: js_generator.h:62
def GenerateHeader(n)
Definition: gen_gtest_pred_impl.py:317
#define LIBPROTOC_EXPORT
Definition: port.h:98
#define false
Definition: float-mm.c:5
GeneratorOptions()
Definition: js_generator.h:78
string output_dir
Definition: js_generator.h:60
Definition: gflags_completions.h:115
Definition: js_generator.h:93
Definition: js.py:1
Definition: descriptor.h:736
U_CDECL_BEGIN typedef void * context
Definition: ustring.h:1023
Generator()
Definition: js_generator.h:95
Definition: protobuf.h:70
Definition: protobuf.h:95
Definition: code_generator.h:61