Merge pull request #6160 from haon4/3.8.x-20190521140707

Update protobuf version to 3.8.0
diff --git a/js/gulpfile.js b/js/gulpfile.js
index b236699..449ae50 100644
--- a/js/gulpfile.js
+++ b/js/gulpfile.js
@@ -144,7 +144,7 @@
   exportsFile  + ' > ' + outputFile;
 }
 
-gulp.task('dist', ['genproto_wellknowntypes'], function (cb) {
+gulp.task('dist', gulp.series(['genproto_wellknowntypes'], function (cb) {
   // TODO(haberman): minify this more aggressively.
   // Will require proper externs/exports.
   exec(getClosureBuilderCommand('commonjs/export.js', 'google-protobuf.js'),
@@ -153,7 +153,7 @@
     console.log(stderr);
     cb(err);
   });
-});
+}));
 
 gulp.task('commonjs_asserts', function (cb) {
   exec('mkdir -p commonjs_out/test_node_modules && ' +
@@ -179,7 +179,7 @@
   });
 });
 
-gulp.task('make_commonjs_out', ['dist', 'genproto_well_known_types_commonjs', 'genproto_group1_commonjs', 'genproto_group2_commonjs', 'genproto_commonjs_wellknowntypes', 'commonjs_asserts', 'commonjs_testdeps', 'genproto_group3_commonjs_strict'], function (cb) {
+gulp.task('make_commonjs_out', gulp.series(['dist', 'genproto_well_known_types_commonjs', 'genproto_group1_commonjs', 'genproto_group2_commonjs', 'genproto_commonjs_wellknowntypes', 'commonjs_asserts', 'commonjs_testdeps', 'genproto_group3_commonjs_strict'], function (cb) {
   // TODO(haberman): minify this more aggressively.
   // Will require proper externs/exports.
   var cmd = "mkdir -p commonjs_out/binary && mkdir -p commonjs_out/test_node_modules && ";
@@ -201,35 +201,35 @@
     console.log(stderr);
     cb(err);
   });
-});
+}));
 
-gulp.task('deps', ['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure'], function (cb) {
+gulp.task('deps', gulp.series(['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure'], function (cb) {
   exec('./node_modules/google-closure-library/closure/bin/build/depswriter.py binary/arith.js binary/constants.js binary/decoder.js binary/encoder.js binary/reader.js binary/utils.js binary/writer.js debug.js map.js message.js node_loader.js test_bootstrap.js > deps.js',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
     cb(err);
   });
-});
+}));
 
-gulp.task('test_closure', ['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure', 'deps'], function (cb) {
+gulp.task('test_closure', gulp.series(['genproto_well_known_types_closure', 'genproto_group1_closure', 'genproto_group2_closure', 'deps'], function (cb) {
   exec('JASMINE_CONFIG_PATH=jasmine.json ./node_modules/.bin/jasmine',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
     cb(err);
   });
-});
+}));
 
-gulp.task('test_commonjs', ['make_commonjs_out'], function (cb) {
+gulp.task('test_commonjs', gulp.series(['make_commonjs_out'], function (cb) {
   exec('cd commonjs_out && JASMINE_CONFIG_PATH=jasmine.json NODE_PATH=test_node_modules ../node_modules/.bin/jasmine',
        function (err, stdout, stderr) {
     console.log(stdout);
     console.log(stderr);
     cb(err);
   });
-});
+}));
 
-gulp.task('test', ['test_closure', 'test_commonjs'], function(cb) {
+gulp.task('test', gulp.series(['test_closure', 'test_commonjs'], function(cb) {
   cb();
-});
+}));
diff --git a/js/package.json b/js/package.json
index 5b3ab59..5043963 100644
--- a/js/package.json
+++ b/js/package.json
@@ -11,7 +11,7 @@
     "glob": "~6.0.4",
     "google-closure-compiler": "~20190301.0.0",
     "google-closure-library": "~20190301.0.0",
-    "gulp": "~3.9.0",
+    "gulp": "~4.0.1",
     "jasmine": "~2.4.1"
   },
   "scripts": {
diff --git a/php/src/Google/Protobuf/Internal/DescriptorPool.php b/php/src/Google/Protobuf/Internal/DescriptorPool.php
index 9b4dcc0..419bbf4 100644
--- a/php/src/Google/Protobuf/Internal/DescriptorPool.php
+++ b/php/src/Google/Protobuf/Internal/DescriptorPool.php
@@ -55,7 +55,7 @@
         return self::$pool;
     }
 
-    public function internalAddGeneratedFile($data)
+    public function internalAddGeneratedFile($data, $use_nested = false)
     {
         $files = new FileDescriptorSet();
         $files->mergeFromString($data);
diff --git a/php/tests/proto/test_wrapper_type_setters.proto b/php/tests/proto/test_wrapper_type_setters.proto
index 41ca7f3..119bd25 100644
--- a/php/tests/proto/test_wrapper_type_setters.proto
+++ b/php/tests/proto/test_wrapper_type_setters.proto
@@ -24,3 +24,14 @@
 
   map<string, google.protobuf.StringValue> map_string_value = 13;
 }
+
+message TestWrapperAccessorConflicts {
+  int32 normal_vs_wrapper_value = 1;
+  google.protobuf.Int32Value normal_vs_wrapper = 2;
+
+  int32 normal_vs_normal_value = 3;
+  int32 normal_vs_normal = 4;
+
+  google.protobuf.Int32Value wrapper_vs_wrapper_value = 5;
+  google.protobuf.Int32Value wrapper_vs_wrapper = 6;
+}
diff --git a/php/tests/wrapper_type_setters_test.php b/php/tests/wrapper_type_setters_test.php
index 5509a17..35e3a7d 100644
--- a/php/tests/wrapper_type_setters_test.php
+++ b/php/tests/wrapper_type_setters_test.php
@@ -16,6 +16,44 @@
 
 class WrapperTypeSettersTest extends TestBase
 {
+    public function testConflictNormalVsWrapper()
+    {
+        $m = new Foo\TestWrapperAccessorConflicts();
+
+        $m->setNormalVsWrapperValue1(1);
+        $this->assertSame(1, $m->getNormalVsWrapperValue1());
+
+        $m->setNormalVsWrapperValue2(1);
+        $this->assertSame(1, $m->getNormalVsWrapperValue2());
+
+        $wrapper = new Int32Value(["value" => 1]);
+        $m->setNormalVsWrapper($wrapper);
+        $this->assertSame(1, $m->getNormalVsWrapper()->getValue());
+    }
+
+    public function testConflictNormalVsNormal()
+    {
+        $m = new Foo\TestWrapperAccessorConflicts();
+
+        $m->setNormalVsNormalValue(1);
+        $this->assertSame(1, $m->getNormalVsNormalValue());
+
+        $m->setNormalVsNormal(1);
+        $this->assertSame(1, $m->getNormalVsNormal());
+    }
+
+    public function testConflictWrapperVsWrapper()
+    {
+        $m = new Foo\TestWrapperAccessorConflicts();
+
+        $m->setWrapperVsWrapperValueValue(1);
+        $this->assertSame(1, $m->getWrapperVsWrapperValueValue());
+
+        $wrapper = new Int32Value(["value" => 1]);
+        $m->setWrapperVsWrapperValue5($wrapper);
+        $this->assertSame(1, $m->getWrapperVsWrapperValue5()->getValue());
+    }
+
     /**
      * @dataProvider gettersAndSettersDataProvider
      */
diff --git a/protobuf.pc.in b/protobuf.pc.in
index 282fef3..4e88b51 100644
--- a/protobuf.pc.in
+++ b/protobuf.pc.in
@@ -8,5 +8,5 @@
 Version: @VERSION@
 Libs: -L${libdir} -lprotobuf @PTHREAD_LIBS@
 Libs.private: @LIBS@
-Cflags: -I${includedir} @PTHREAD_CFLAGS@ @CXXFLAGS@
+Cflags: -I${includedir} @PTHREAD_CFLAGS@
 Conflicts: protobuf-lite
diff --git a/src/google/protobuf/compiler/php/php_generator.cc b/src/google/protobuf/compiler/php/php_generator.cc
index d7e33b2..8e40560 100644
--- a/src/google/protobuf/compiler/php/php_generator.cc
+++ b/src/google/protobuf/compiler/php/php_generator.cc
@@ -655,27 +655,58 @@
 
 void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor,
                            io::Printer* printer) {
+  bool need_other_name_for_accessor = false;
+  bool need_other_name_for_wrapper_accessor = false;
+  const Descriptor* desc = field->containing_type();
+
+  if (!field->is_repeated() &&
+      field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+      IsWrapperType(field)) {
+    // Check if there is any field called xxx_value
+    const FieldDescriptor* other =
+        desc->FindFieldByName(StrCat(field->name(), "_value"));
+    if (other != NULL) {
+      need_other_name_for_wrapper_accessor = true;
+    }
+  }
+
+  if (strings::EndsWith(field->name(), "_value")) {
+    std::size_t pos = (field->name()).find("_value");  
+    string name = (field->name()).substr(0, pos);
+    const FieldDescriptor* other = desc->FindFieldByName(name);
+    if (other != NULL &&
+        !other->is_repeated() &&
+        other->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+        IsWrapperType(other)) {
+      need_other_name_for_accessor = true;
+    }
+  }
+
   const OneofDescriptor* oneof = field->containing_oneof();
 
   // Generate getter.
   if (oneof != NULL) {
     GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
     printer->Print(
-        "public function get^camel_name^()\n"
+        "public function get^camel_name^^field_number^()\n"
         "{\n"
         "    return $this->readOneof(^number^);\n"
         "}\n\n",
         "camel_name", UnderscoresToCamelCase(field->name(), true),
-        "number", IntToString(field->number()));
+        "number", IntToString(field->number()),
+        "field_number", need_other_name_for_accessor ?
+            StrCat(field->number()) : "");
   } else {
     GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter);
     printer->Print(
-        "public function get^camel_name^()\n"
+        "public function get^camel_name^^field_number^()\n"
         "{\n"
         "    return $this->^name^;\n"
         "}\n\n",
-        "camel_name", UnderscoresToCamelCase(field->name(), true), "name",
-        field->name());
+        "camel_name", UnderscoresToCamelCase(field->name(), true),
+        "name", field->name(),
+        "field_number", need_other_name_for_accessor ?
+            StrCat(field->number()) : "");
   }
 
   // For wrapper types, generate an additional getXXXValue getter
@@ -684,21 +715,28 @@
       field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
       IsWrapperType(field)) {
     GenerateWrapperFieldGetterDocComment(printer, field);
+
     printer->Print(
-        "public function get^camel_name^Value()\n"
+        "public function get^camel_name^Value^field_number1^()\n"
         "{\n"
-        "    $wrapper = $this->get^camel_name^();\n"
+        "    $wrapper = $this->get^camel_name^^field_number2^();\n"
         "    return is_null($wrapper) ? null : $wrapper->getValue();\n"
         "}\n\n",
-        "camel_name", UnderscoresToCamelCase(field->name(), true));
+        "camel_name", UnderscoresToCamelCase(field->name(), true),
+        "field_number1", need_other_name_for_wrapper_accessor ?
+            StrCat(field->number()) : "",
+        "field_number2", need_other_name_for_accessor ?
+            StrCat(field->number()) : "");
   }
 
   // Generate setter.
   GenerateFieldDocComment(printer, field, is_descriptor, kFieldSetter);
   printer->Print(
-      "public function set^camel_name^($var)\n"
+      "public function set^camel_name^^field_number^($var)\n"
       "{\n",
-      "camel_name", UnderscoresToCamelCase(field->name(), true));
+      "camel_name", UnderscoresToCamelCase(field->name(), true),
+      "field_number", need_other_name_for_accessor ?
+          StrCat(field->number()) : "");
 
   Indent(printer);
 
@@ -798,13 +836,17 @@
       IsWrapperType(field)) {
     GenerateWrapperFieldSetterDocComment(printer, field);
     printer->Print(
-        "public function set^camel_name^Value($var)\n"
+        "public function set^camel_name^Value^field_number1^($var)\n"
         "{\n"
         "    $wrappedVar = is_null($var) ? null : new \\^wrapper_type^(['value' => $var]);\n"
-        "    return $this->set^camel_name^($wrappedVar);\n"
+        "    return $this->set^camel_name^^field_number2^($wrappedVar);\n"
         "}\n\n",
         "camel_name", UnderscoresToCamelCase(field->name(), true),
-        "wrapper_type", LegacyFullClassName(field->message_type(), is_descriptor));
+        "wrapper_type", LegacyFullClassName(field->message_type(), is_descriptor),
+        "field_number1", need_other_name_for_wrapper_accessor ?
+            StrCat(field->number()) : "",
+        "field_number2", need_other_name_for_accessor ?
+            StrCat(field->number()) : "");
   }
 
   // Generate has method for proto2 only.