Przeglądaj źródła

Merge pull request #2517 from acozzette/js-embed

Auto-generate well_known_types_embed.cc
Adam Cozzette 8 lat temu
rodzic
commit
fb15862bac

+ 2 - 0
.gitignore

@@ -47,6 +47,7 @@ any_test.pb.*
 map*unittest.pb.*
 unittest*.pb.*
 cpp_test*.pb.*
+src/google/protobuf/compiler/js/well_known_types_embed.cc
 src/google/protobuf/util/**/*.pb.cc
 src/google/protobuf/util/**/*.pb.h
 
@@ -60,6 +61,7 @@ python/build/
 python/google/protobuf/compiler/
 python/google/protobuf/util/
 
+src/js_embed
 src/protoc
 src/unittest_proto_middleman
 

+ 12 - 0
cmake/libprotoc.cmake

@@ -94,6 +94,18 @@ set(libprotoc_files
   ${protobuf_source_dir}/src/google/protobuf/compiler/zip_writer.cc
 )
 
+set(js_well_known_types_sources,
+  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/any.js
+  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/struct.js
+  ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/timestamp.js
+)
+add_executable(js_embed ${protobuf_source_dir}/src/google/protobuf/compiler/js/embed.cc)
+add_custom_command(
+  OUTPUT ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
+  DEPENDS js_embed ${js_well_known_types_sources}
+  COMMAND js_embed ${js_well_known_types_sources} > ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
+)
+
 add_library(libprotoc ${protobuf_SHARED_OR_STATIC}
   ${libprotoc_files})
 target_link_libraries(libprotoc libprotobuf)

+ 1 - 0
cmake/tests.cmake

@@ -214,4 +214,5 @@ target_link_libraries(lite-arena-test libprotobuf-lite gmock_main)
 
 add_custom_target(check
   COMMAND tests
+  DEPENDS tests test_plugin
   WORKING_DIRECTORY ${protobuf_source_dir})

+ 12 - 2
src/Makefile.am

@@ -483,10 +483,20 @@ libprotoc_la_SOURCES =                                         \
   google/protobuf/compiler/csharp/csharp_wrapper_field.cc      \
   google/protobuf/compiler/csharp/csharp_wrapper_field.h
 
-bin_PROGRAMS = protoc
+bin_PROGRAMS = protoc js_embed
 protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
 protoc_SOURCES = google/protobuf/compiler/main.cc
 
+# The special JS code for the well-known types is linked into the compiler via
+# well_known_types_embed.cc, which is generated from .js source files.
+js_embed_SOURCES = google/protobuf/compiler/js/embed.cc
+js_well_known_types_sources =                                  \
+	google/protobuf/compiler/js/well_known_types/any.js          \
+	google/protobuf/compiler/js/well_known_types/struct.js       \
+	google/protobuf/compiler/js/well_known_types/timestamp.js
+google/protobuf/compiler/js/well_known_types_embed.cc: js_embed$(EXEEXT) $(js_well_known_types_sources)
+	./js_embed$(EXEEXT) $(js_well_known_types_sources) > $@
+
 # Tests ==============================================================
 
 protoc_inputs =                                                   \
@@ -661,7 +671,7 @@ protoc_outputs =                                                  \
   google/protobuf/util/message_differencer_unittest.pb.cc         \
   google/protobuf/util/message_differencer_unittest.pb.h
 
-BUILT_SOURCES = $(protoc_outputs)
+BUILT_SOURCES = $(protoc_outputs) google/protobuf/compiler/js/well_known_types_embed.cc
 
 if USE_EXTERNAL_PROTOC
 

+ 8 - 9
src/google/protobuf/compiler/js/embed.cc

@@ -48,7 +48,8 @@ static char ToDecimalDigit(int num) {
 static std::string CEscape(const std::string& str) {
   std::string dest;
 
-  for (unsigned char ch : str) {
+  for (int i = 0; i < str.size(); ++i) {
+    unsigned char ch = str[i];
     switch (ch) {
       case '\n': dest += "\\n"; break;
       case '\r': dest += "\\r"; break;
@@ -96,18 +97,16 @@ static void AddFile(const char* name, std::basic_ostream<char>* out) {
 }
 
 int main(int argc, char *argv[]) {
-  auto& out = std::cout;
-
-  out << "#include "
-         "\"google/protobuf/compiler/js/well_known_types_embed.h\"\n";
-  out << "struct FileToc well_known_types_js[] = {\n";
+  std::cout << "#include "
+               "\"google/protobuf/compiler/js/well_known_types_embed.h\"\n";
+  std::cout << "struct FileToc well_known_types_js[] = {\n";
 
   for (int i = 1; i < argc; i++) {
-    AddFile(argv[i], &out);
+    AddFile(argv[i], &std::cout);
   }
 
-  out << "  {NULL, NULL}  // Terminate the list.\n";
-  out << "};\n";
+  std::cout << "  {NULL, NULL}  // Terminate the list.\n";
+  std::cout << "};\n";
 
   return EXIT_SUCCESS;
 }

+ 0 - 314
src/google/protobuf/compiler/js/well_known_types_embed.cc

@@ -1,314 +0,0 @@
-#include <google/protobuf/compiler/js/well_known_types_embed.h>
-struct FileToc well_known_types_js[] = {
-{"any.js",
-  "// Protocol Buffers - Google's data interchange format\n"
-  "// Copyright 2008 Google Inc.  All rights reserved.\n"
-  "// https://developers.google.com/protocol-buffers/\n"
-  "//\n"
-  "// Redistribution and use in source and binary forms, with or without\n"
-  "// modification, are permitted provided that the following conditions are\n"
-  "// met:\n"
-  "//\n"
-  "//     * Redistributions of source code must retain the above copyright\n"
-  "// notice, this list of conditions and the following disclaimer.\n"
-  "//     * Redistributions in binary form must reproduce the above\n"
-  "// copyright notice, this list of conditions and the following disclaimer\n"
-  "// in the documentation and/or other materials provided with the\n"
-  "// distribution.\n"
-  "//     * Neither the name of Google Inc. nor the names of its\n"
-  "// contributors may be used to endorse or promote products derived from\n"
-  "// this software without specific prior written permission.\n"
-  "//\n"
-  "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
-  "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
-  "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
-  "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
-  "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
-  "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
-  "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
-  "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
-  "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
-  "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
-  "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
-  "\n"
-  "/* This code will be inserted into generated code for\n"
-  " * google/protobuf/any.proto. */\n"
-  "\n"
-  "/**\n"
-  " * Returns the type name contained in this instance, if any.\n"
-  " * @return {string|undefined}\n"
-  " */\n"
-  "proto.google.protobuf.Any.prototype.getTypeName = function() {\n"
-  "  return this.getTypeUrl().split('/').pop();\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Packs the given message instance into this Any.\n"
-  " * @param {!Uint8Array} serialized The serialized data to pack.\n"
-  " * @param {string} name The type name of this message object.\n"
-  " * @param {string=} opt_typeUrlPrefix the type URL prefix.\n"
-  " */\n"
-  "proto.google.protobuf.Any.prototype.pack = function(serialized, name,\n"
-  "                                                    opt_typeUrlPrefix) {\n"
-  "  if (!opt_typeUrlPrefix) {\n"
-  "    opt_typeUrlPrefix = 'type.googleapis.com/';\n"
-  "  }\n"
-  "\n"
-  "  if (opt_typeUrlPrefix.substr(-1) != '/') {\n"
-  "    this.setTypeUrl(opt_typeUrlPrefix + '/' + name);\n"
-  "  } else {\n"
-  "    this.setTypeUrl(opt_typeUrlPrefix + name);\n"
-  "  }\n"
-  "\n"
-  "  this.setValue(serialized);\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * @template T\n"
-  " * Unpacks this Any into the given message object.\n"
-  " * @param {function(Uint8Array):T} deserialize Function that will deserialize\n"
-  " *     the binary data properly.\n"
-  " * @param {string} name The expected type name of this message object.\n"
-  " * @return {?T} If the name matched the expected name, returns the deserialized\n"
-  " *     object, otherwise returns undefined.\n"
-  " */\n"
-  "proto.google.protobuf.Any.prototype.unpack = function(deserialize, name) {\n"
-  "  if (this.getTypeName() == name) {\n"
-  "    return deserialize(this.getValue_asU8());\n"
-  "  } else {\n"
-  "    return null;\n"
-  "  }\n"
-  "};\n"
-},
-{"timestamp.js",
-  "// Protocol Buffers - Google's data interchange format\n"
-  "// Copyright 2008 Google Inc.  All rights reserved.\n"
-  "// https://developers.google.com/protocol-buffers/\n"
-  "//\n"
-  "// Redistribution and use in source and binary forms, with or without\n"
-  "// modification, are permitted provided that the following conditions are\n"
-  "// met:\n"
-  "//\n"
-  "//     * Redistributions of source code must retain the above copyright\n"
-  "// notice, this list of conditions and the following disclaimer.\n"
-  "//     * Redistributions in binary form must reproduce the above\n"
-  "// copyright notice, this list of conditions and the following disclaimer\n"
-  "// in the documentation and/or other materials provided with the\n"
-  "// distribution.\n"
-  "//     * Neither the name of Google Inc. nor the names of its\n"
-  "// contributors may be used to endorse or promote products derived from\n"
-  "// this software without specific prior written permission.\n"
-  "//\n"
-  "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
-  "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
-  "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
-  "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
-  "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
-  "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
-  "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
-  "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
-  "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
-  "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
-  "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
-  "\n"
-  "/* This code will be inserted into generated code for\n"
-  " * google/protobuf/timestamp.proto. */\n"
-  "\n"
-  "/**\n"
-  " * Returns a JavaScript 'Date' object corresponding to this Timestamp.\n"
-  " * @return {!Date}\n"
-  " */\n"
-  "proto.google.protobuf.Timestamp.prototype.toDate = function() {\n"
-  "  // The '|| 0' clauses are necessary for as long as\n"
-  "  // broken_proto3_semantics are specified for this rule inside Google.\n"
-  "  var seconds = this.getSeconds() || 0;\n"
-  "  var nanos = this.getNanos() || 0;\n"
-  "\n"
-  "  return new Date((seconds * 1000) + (nanos / 1000000));\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Sets the value of this Timestamp object to be the given Date.\n"
-  " * @param {!Date} value The value to set.\n"
-  " */\n"
-  "proto.google.protobuf.Timestamp.prototype.fromDate = function(value) {\n"
-  "  var millis = value.getTime();\n"
-  "  this.setSeconds(Math.floor(value.getTime() / 1000));\n"
-  "  this.setNanos(value.getMilliseconds() * 1000000);\n"
-  "};\n"
-},
-{"struct.js",
-  "// Protocol Buffers - Google's data interchange format\n"
-  "// Copyright 2008 Google Inc.  All rights reserved.\n"
-  "// https://developers.google.com/protocol-buffers/\n"
-  "//\n"
-  "// Redistribution and use in source and binary forms, with or without\n"
-  "// modification, are permitted provided that the following conditions are\n"
-  "// met:\n"
-  "//\n"
-  "//     * Redistributions of source code must retain the above copyright\n"
-  "// notice, this list of conditions and the following disclaimer.\n"
-  "//     * Redistributions in binary form must reproduce the above\n"
-  "// copyright notice, this list of conditions and the following disclaimer\n"
-  "// in the documentation and/or other materials provided with the\n"
-  "// distribution.\n"
-  "//     * Neither the name of Google Inc. nor the names of its\n"
-  "// contributors may be used to endorse or promote products derived from\n"
-  "// this software without specific prior written permission.\n"
-  "//\n"
-  "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
-  "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
-  "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
-  "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
-  "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
-  "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
-  "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
-  "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
-  "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
-  "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
-  "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
-  "\n"
-  "/* This code will be inserted into generated code for\n"
-  " * google/protobuf/struct.proto. */\n"
-  "\n"
-  "/**\n"
-  " * Typedef representing plain JavaScript values that can go into a\n"
-  " *     Struct.\n"
-  " * @typedef {null|number|string|boolean|Array|Object}\n"
-  " */\n"
-  "proto.google.protobuf.JavaScriptValue;\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Converts this Value object to a plain JavaScript value.\n"
-  " * @return {?proto.google.protobuf.JavaScriptValue} a plain JavaScript\n"
-  " *     value representing this Struct.\n"
-  " */\n"
-  "proto.google.protobuf.Value.prototype.toJavaScript = function() {\n"
-  "  var kindCase = proto.google.protobuf.Value.KindCase;\n"
-  "  switch (this.getKindCase()) {\n"
-  "    case kindCase.NULL_VALUE:\n"
-  "      return null;\n"
-  "    case kindCase.NUMBER_VALUE:\n"
-  "      return this.getNumberValue();\n"
-  "    case kindCase.STRING_VALUE:\n"
-  "      return this.getStringValue();\n"
-  "    case kindCase.BOOL_VALUE:\n"
-  "      return this.getBoolValue();\n"
-  "    case kindCase.STRUCT_VALUE:\n"
-  "      return this.getStructValue().toJavaScript();\n"
-  "    case kindCase.LIST_VALUE:\n"
-  "      return this.getListValue().toJavaScript();\n"
-  "    default:\n"
-  "      throw new Error('Unexpected struct type');\n"
-  "  }\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Converts this JavaScript value to a new Value proto.\n"
-  " * @param {!proto.google.protobuf.JavaScriptValue} value The value to\n"
-  " *     convert.\n"
-  " * @return {!proto.google.protobuf.Value} The newly constructed value.\n"
-  " */\n"
-  "proto.google.protobuf.Value.fromJavaScript = function(value) {\n"
-  "  var ret = new proto.google.protobuf.Value();\n"
-  "  switch (goog.typeOf(value)) {\n"
-  "    case 'string':\n"
-  "      ret.setStringValue(/** @type {string} */ (value));\n"
-  "      break;\n"
-  "    case 'number':\n"
-  "      ret.setNumberValue(/** @type {number} */ (value));\n"
-  "      break;\n"
-  "    case 'boolean':\n"
-  "      ret.setBoolValue(/** @type {boolean} */ (value));\n"
-  "      break;\n"
-  "    case 'null':\n"
-  "      ret.setNullValue(proto.google.protobuf.NullValue.NULL_VALUE);\n"
-  "      break;\n"
-  "    case 'array':\n"
-  "      ret.setListValue(proto.google.protobuf.ListValue.fromJavaScript(\n"
-  "          /** @type{!Array} */ (value)));\n"
-  "      break;\n"
-  "    case 'object':\n"
-  "      ret.setStructValue(proto.google.protobuf.Struct.fromJavaScript(\n"
-  "          /** @type{!Object} */ (value)));\n"
-  "      break;\n"
-  "    default:\n"
-  "      throw new Error('Unexpected struct type.');\n"
-  "  }\n"
-  "\n"
-  "  return ret;\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Converts this ListValue object to a plain JavaScript array.\n"
-  " * @return {!Array} a plain JavaScript array representing this List.\n"
-  " */\n"
-  "proto.google.protobuf.ListValue.prototype.toJavaScript = function() {\n"
-  "  var ret = [];\n"
-  "  var values = this.getValuesList();\n"
-  "\n"
-  "  for (var i = 0; i < values.length; i++) {\n"
-  "    ret[i] = values[i].toJavaScript();\n"
-  "  }\n"
-  "\n"
-  "  return ret;\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Constructs a ListValue protobuf from this plain JavaScript array.\n"
-  " * @param {!Array} array a plain JavaScript array\n"
-  " * @return {proto.google.protobuf.ListValue} a new ListValue object\n"
-  " */\n"
-  "proto.google.protobuf.ListValue.fromJavaScript = function(array) {\n"
-  "  var ret = new proto.google.protobuf.ListValue();\n"
-  "\n"
-  "  for (var i = 0; i < array.length; i++) {\n"
-  "    ret.addValues(proto.google.protobuf.Value.fromJavaScript(array[i]));\n"
-  "  }\n"
-  "\n"
-  "  return ret;\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Converts this Struct object to a plain JavaScript object.\n"
-  " * @return {!Object<string, !proto.google.protobuf.JavaScriptValue>} a plain\n"
-  " *     JavaScript object representing this Struct.\n"
-  " */\n"
-  "proto.google.protobuf.Struct.prototype.toJavaScript = function() {\n"
-  "  var ret = {};\n"
-  "\n"
-  "  this.getFieldsMap().forEach(function(value, key) {\n"
-  "    ret[key] = value.toJavaScript();\n"
-  "  });\n"
-  "\n"
-  "  return ret;\n"
-  "};\n"
-  "\n"
-  "\n"
-  "/**\n"
-  " * Constructs a Struct protobuf from this plain JavaScript object.\n"
-  " * @param {!Object} obj a plain JavaScript object\n"
-  " * @return {proto.google.protobuf.Struct} a new Struct object\n"
-  " */\n"
-  "proto.google.protobuf.Struct.fromJavaScript = function(obj) {\n"
-  "  var ret = new proto.google.protobuf.Struct();\n"
-  "  var map = ret.getFieldsMap();\n"
-  "\n"
-  "  for (var property in obj) {\n"
-  "    var val = obj[property];\n"
-  "    map.set(property, proto.google.protobuf.Value.fromJavaScript(val));\n"
-  "  }\n"
-  "\n"
-  "  return ret;\n"
-  "};\n"
-},
-  {NULL, NULL}  // Terminate the list.
-};