From 6e6d0bce4a04fd13d50485c22ecc7e96d9a16000 Mon Sep 17 00:00:00 2001 From: Sandy Zhang Date: Tue, 14 Mar 2023 14:32:34 -0700 Subject: [PATCH] Add Java FileDescriptor.copyHeadingTo() which copies file-level settings (e.g. syntax, package, file options) to FileDescriptorProto.Builder PiperOrigin-RevId: 516635134 --- .../java/com/google/protobuf/Descriptors.java | 11 ++++++ .../com/google/protobuf/DescriptorsTest.java | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+) 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();