diff --git a/java/core/src/main/java/com/google/protobuf/Descriptors.java b/java/core/src/main/java/com/google/protobuf/Descriptors.java index d22b50447b..5374309665 100644 --- a/java/core/src/main/java/com/google/protobuf/Descriptors.java +++ b/java/core/src/main/java/com/google/protobuf/Descriptors.java @@ -182,6 +182,17 @@ public final class Descriptors { return Syntax.PROTO2; } + public void copyHeadingTo(FileDescriptorProto.Builder protoBuilder) { + protoBuilder.setName(getName()).setSyntax(getSyntax().name); + if (!getPackage().isEmpty()) { + protoBuilder.setPackage(getPackage()); + } + + if (!getOptions().equals(FileOptions.getDefaultInstance())) { + protoBuilder.setOptions(getOptions()); + } + } + /** * Find a message type in the file by name. Does not find nested types. * diff --git a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java index 79c710a5c9..3a3cd5fef5 100644 --- a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java +++ b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java @@ -159,6 +159,40 @@ public class DescriptorsTest { assertThat(file3.getSyntax()).isEqualTo(Descriptors.FileDescriptor.Syntax.PROTO3); } + @Test + public void testFileDescriptorCopyHeadingTo() throws Exception { + FileDescriptorProto.Builder protoBuilder = + FileDescriptorProto.newBuilder() + .setName("foo.proto") + .setPackage("foo.bar.baz") + .setSyntax("proto2") + .setOptions(FileOptions.newBuilder().setJavaPackage("foo.bar.baz").build()) + // Won't be copied. + .addMessageType(DescriptorProto.newBuilder().setName("Foo").build()); + FileDescriptor file2 = + Descriptors.FileDescriptor.buildFrom(protoBuilder.build(), new FileDescriptor[0]); + FileDescriptorProto.Builder protoBuilder2 = FileDescriptorProto.newBuilder(); + file2.copyHeadingTo(protoBuilder2); + FileDescriptorProto toProto2 = protoBuilder2.build(); + assertThat(toProto2.getName()).isEqualTo("foo.proto"); + assertThat(toProto2.getPackage()).isEqualTo("foo.bar.baz"); + assertThat(toProto2.getSyntax()).isEqualTo("proto2"); + assertThat(toProto2.getOptions().getJavaPackage()).isEqualTo("foo.bar.baz"); + assertThat(toProto2.getMessageTypeList()).isEmpty(); + + protoBuilder.setSyntax("proto3"); + FileDescriptor file3 = + Descriptors.FileDescriptor.buildFrom(protoBuilder.build(), new FileDescriptor[0]); + FileDescriptorProto.Builder protoBuilder3 = FileDescriptorProto.newBuilder(); + file3.copyHeadingTo(protoBuilder3); + FileDescriptorProto toProto3 = protoBuilder3.build(); + assertThat(toProto3.getName()).isEqualTo("foo.proto"); + assertThat(toProto3.getPackage()).isEqualTo("foo.bar.baz"); + assertThat(toProto3.getSyntax()).isEqualTo("proto3"); + assertThat(toProto2.getOptions().getJavaPackage()).isEqualTo("foo.bar.baz"); + assertThat(toProto3.getMessageTypeList()).isEmpty(); + } + @Test public void testDescriptor() throws Exception { Descriptor messageType = TestAllTypes.getDescriptor();