ソースを参照

Fix strict JS generator with import in a protofile

Peter Marton 7 年 前
コミット
13f94b4092

+ 1 - 0
Makefile.am

@@ -1003,6 +1003,7 @@ js_EXTRA_DIST=                                                         \
   js/test5.proto                                                       \
   js/test8.proto                                                       \
   js/test9.proto                                                       \
+  js/test10.proto                                                      \
   js/test_bootstrap.js                                                 \
   js/testbinary.proto                                                  \
   js/testempty.proto

+ 16 - 3
js/commonjs/strict_test.js

@@ -40,15 +40,28 @@ var global = Function('return this')();
 googleProtobuf.object.extend(global, asserts);
 
 var test9_pb = require('./test9_pb');
+var test10_pb = require('./test10_pb');
 
 describe('Strict test suite', function() {
   it('testImportedMessage', function() {
-    var simple1 = new test9_pb.Simple9()
-    var simple2 = new test9_pb.Simple9()
+    var simple1 = new test9_pb.jspb.exttest.strict.nine.Simple9()
+    var simple2 = new test9_pb.jspb.exttest.strict.nine.Simple9()
     assertObjectEquals(simple1.toObject(), simple2.toObject());
   });
 
   it('testGlobalScopePollution', function() {
-    assertObjectEquals(global.proto.jspb.test.Simple9, undefined);
+    assertObjectEquals(global.jspb.exttest, undefined);
+  });
+
+  describe('with imports', function() {
+    it('testImportedMessage', function() {
+      var simple1 = new test10_pb.jspb.exttest.strict.ten.Simple10()
+      var simple2 = new test10_pb.jspb.exttest.strict.ten.Simple10()
+      assertObjectEquals(simple1.toObject(), simple2.toObject());
+    });
+
+    it('testGlobalScopePollution', function() {
+      assertObjectEquals(global.jspb.exttest, undefined);
+    });
   });
 });

+ 2 - 1
js/gulpfile.js

@@ -42,7 +42,8 @@ var group2Protos = [
 ];
 
 var group3Protos = [
-  'test9.proto'
+  'test9.proto',
+  'test10.proto'
 ];
 
 

+ 39 - 0
js/test10.proto

@@ -0,0 +1,39 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package jspb.exttest.strict.ten;
+
+import "test9.proto";
+
+message Simple10 {
+    jspb.exttest.strict.nine.Simple9 a = 1;
+}

+ 1 - 2
js/test9.proto

@@ -30,8 +30,7 @@
 
 syntax = "proto2";
 
-option java_package = "com.google.apps.jspb.proto";
-option java_multiple_files = true;
+package jspb.exttest.strict.nine;
 
 message Simple9 {
   required string a_string = 1;

+ 6 - 3
src/google/protobuf/compiler/js/js_generator.cc

@@ -3458,7 +3458,8 @@ void Generator::GenerateFile(const GeneratorOptions& options,
     for (int i = 0; i < file->dependency_count(); i++) {
       const string& name = file->dependency(i)->name();
       printer->Print(
-          "var $alias$ = require('$file$');\n",
+          "var $alias$ = require('$file$');\n"
+          "goog.object.extend(proto, $alias$);\n",
           "alias", ModuleAlias(name),
           "file",
           GetRootPath(file->name(), name) + GetJSFilename(options, name));
@@ -3497,10 +3498,12 @@ void Generator::GenerateFile(const GeneratorOptions& options,
     GenerateExtension(options, printer, *it);
   }
 
-  if ((options.import_style == GeneratorOptions::kImportCommonJs ||
-       options.import_style == GeneratorOptions::kImportCommonJsStrict)) {
+  if (options.import_style == GeneratorOptions::kImportCommonJs) {
     printer->Print("goog.object.extend(exports, $package$);\n",
                    "package", GetFilePath(options, file));
+  } else if(options.import_style == GeneratorOptions::kImportCommonJsStrict) {
+    printer->Print("goog.object.extend(exports, proto);\n",
+                   "package", GetFilePath(options, file));
   }
 
   // Emit well-known type methods.