Merge pull request #5368 from haberman/objc

Some changes to the ObjC code generator to support importing into Google.
diff --git a/cmake/README.md b/cmake/README.md
index 1f37056..29f7669 100644
--- a/cmake/README.md
+++ b/cmake/README.md
@@ -130,6 +130,13 @@
 If the *gmock* directory does not exist, and you do not want to build protobuf unit tests,
 you need to add *cmake* command argument `-Dprotobuf_BUILD_TESTS=OFF` to disable testing.
 
+To make a *Visual Studio* file for Visual Studio 15 2017, create the *Visual Studio* 
+solution file above and edit the CmakeCache file.
+	
+	C:Path\to\protobuf\cmake\build\solution\CMakeCache
+	
+Then create the *Visual Studio* solution file again
+
 Compiling
 =========
 
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index a7db1e9..3d5eccd 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -1283,16 +1283,20 @@
   NSUInteger fieldCount = fieldsArray.count;
   const GPBExtensionRange *extensionRanges = descriptor.extensionRanges;
   NSUInteger extensionRangesCount = descriptor.extensionRangesCount;
+  NSArray *sortedExtensions =
+      [[extensionMap_ allKeys] sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
   for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) {
     if (i == fieldCount) {
       [self writeExtensionsToCodedOutputStream:output
-                                         range:extensionRanges[j++]];
+                                         range:extensionRanges[j++]
+                              sortedExtensions:sortedExtensions];
     } else if (j == extensionRangesCount ||
                GPBFieldNumber(fieldsArray[i]) < extensionRanges[j].start) {
       [self writeField:fieldsArray[i++] toCodedOutputStream:output];
     } else {
       [self writeExtensionsToCodedOutputStream:output
-                                         range:extensionRanges[j++]];
+                                         range:extensionRanges[j++]
+                              sortedExtensions:sortedExtensions];
     }
   }
   if (descriptor.isWireFormat) {
@@ -1808,17 +1812,20 @@
 }
 
 - (void)writeExtensionsToCodedOutputStream:(GPBCodedOutputStream *)output
-                                     range:(GPBExtensionRange)range {
-  NSArray *sortedExtensions = [[extensionMap_ allKeys]
-      sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
+                                     range:(GPBExtensionRange)range
+                          sortedExtensions:(NSArray *)sortedExtensions {
   uint32_t start = range.start;
   uint32_t end = range.end;
   for (GPBExtensionDescriptor *extension in sortedExtensions) {
     uint32_t fieldNumber = extension.fieldNumber;
-    if (fieldNumber >= start && fieldNumber < end) {
-      id value = [extensionMap_ objectForKey:extension];
-      GPBWriteExtensionValueToOutputStream(extension, value, output);
+    if (fieldNumber < start) {
+      continue;
     }
+    if (fieldNumber >= end) {
+      break;
+    }
+    id value = [extensionMap_ objectForKey:extension];
+    GPBWriteExtensionValueToOutputStream(extension, value, output);
   }
 }
 
diff --git a/protobuf.bzl b/protobuf.bzl
index b8ec0ee..88eeb87 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -132,7 +132,7 @@
       inputs += [plugin]
 
     if not in_gen_dir:
-      ctx.action(
+      ctx.actions.run(
           inputs=inputs,
           outputs=outs,
           arguments=args + import_flags + [src.path],
@@ -154,7 +154,7 @@
         generated_out = '/'.join([gen_dir,  out.basename])
         if generated_out != out.path:
             command += ";mv %s %s" % (generated_out, out.path)
-        ctx.action(
+        ctx.actions.run_shell(
             inputs=inputs + [ctx.executable.protoc],
             outputs=[out],
             command=command,
diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb
index 920fadc..60897b6 100644
--- a/ruby/tests/common_tests.rb
+++ b/ruby/tests/common_tests.rb
@@ -204,10 +204,10 @@
     m.optional_string = "asdf".encode!('UTF-8')
     # Ruby 2.5 changed to raise FrozenError. However, assert_raise don't
     # accept subclass.
-    ok = true
+    ok = false
     begin
       m.optional_string.encode!('ASCII-8BIT')
-    rescue RuntimeError => e
+    rescue RuntimeError
       ok = true
     end
     assert ok
@@ -341,16 +341,16 @@
 
   def test_rptfield_initialize
     assert_raise ArgumentError do
-      l = Google::Protobuf::RepeatedField.new
+      Google::Protobuf::RepeatedField.new
     end
     assert_raise ArgumentError do
-      l = Google::Protobuf::RepeatedField.new(:message)
+      Google::Protobuf::RepeatedField.new(:message)
     end
     assert_raise ArgumentError do
-      l = Google::Protobuf::RepeatedField.new([1, 2, 3])
+      Google::Protobuf::RepeatedField.new([1, 2, 3])
     end
     assert_raise ArgumentError do
-      l = Google::Protobuf::RepeatedField.new(:message, [proto_module::TestMessage2.new])
+      Google::Protobuf::RepeatedField.new(:message, [proto_module::TestMessage2.new])
     end
   end
 
@@ -620,14 +620,14 @@
     encoded_field_d = proto_module::OneofMessage.encode(proto_module::OneofMessage.new(:d => :B))
 
     d3 = proto_module::OneofMessage.decode(
-      encoded_field_c + encoded_field_a + encoded_field_d)
+      encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d)
     assert d3.a == ""
     assert d3.b == 0
     assert d3.c == nil
     assert d3.d == :B
 
     d4 = proto_module::OneofMessage.decode(
-      encoded_field_c + encoded_field_a + encoded_field_d +
+      encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d +
       encoded_field_c)
     assert d4.a == ""
     assert d4.b == 0
@@ -800,7 +800,7 @@
     m = proto_module::Recursive1.new(:foo => proto_module::Recursive2.new)
     m.foo.foo = m
     assert_raise RuntimeError do
-      serialized = proto_module::Recursive1.encode(m)
+      proto_module::Recursive1.encode(m)
     end
   end
 
@@ -933,7 +933,6 @@
 
     data = proto_module::TestMessage.encode(m)
 
-    l = 0
     10_000.times do
       m = proto_module::TestMessage.decode(data)
       data_new = proto_module::TestMessage.encode(m)
diff --git a/ruby/tests/encode_decode_test.rb b/ruby/tests/encode_decode_test.rb
index f8b991c..d2b25fd 100644
--- a/ruby/tests/encode_decode_test.rb
+++ b/ruby/tests/encode_decode_test.rb
@@ -86,7 +86,7 @@
   end
 
   def test_encode_wrong_msg
-    e = assert_raise ::ArgumentError do
+    assert_raise ::ArgumentError do
       m = A::B::C::TestMessage.new(
           :optional_int32 => 1,
       )
diff --git a/ruby/tests/generated_code_proto2_test.rb b/ruby/tests/generated_code_proto2_test.rb
index e988abd..302f945 100644
--- a/ruby/tests/generated_code_proto2_test.rb
+++ b/ruby/tests/generated_code_proto2_test.rb
@@ -14,8 +14,8 @@
     # is to ensure that the output of the code generator is valid Ruby and
     # successfully creates message definitions and classes, not to test every
     # aspect of the extension (basic.rb is for that).
-    m = A::B::Proto2::TestMessage.new()
-    m2 = FooBar::Proto2::TestImportedMessage.new()
-    m3 = A::B::Proto2::TestRubyPackageMessage.new()
+    A::B::Proto2::TestMessage.new
+    FooBar::Proto2::TestImportedMessage.new
+    A::B::Proto2::TestRubyPackageMessage.new
   end
 end
diff --git a/ruby/tests/generated_code_test.rb b/ruby/tests/generated_code_test.rb
index 431d681..6e6f915 100644
--- a/ruby/tests/generated_code_test.rb
+++ b/ruby/tests/generated_code_test.rb
@@ -14,8 +14,8 @@
     # is to ensure that the output of the code generator is valid Ruby and
     # successfully creates message definitions and classes, not to test every
     # aspect of the extension (basic.rb is for that).
-    m = A::B::C::TestMessage.new()
-    m2 = FooBar::TestImportedMessage.new()
-    m3 = A::B::TestRubyPackageMessage.new()
+    A::B::C::TestMessage.new
+    FooBar::TestImportedMessage.new
+    A::B::TestRubyPackageMessage.new
   end
 end