Skip to content

Commit 66013df

Browse files
committed
handle nested message types
1 parent 0444f21 commit 66013df

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

protoc-gen-java-optional-test/src/test/java/DataTypesTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.junit.jupiter.api.Test;
55
import org.test.datatypes.TestEnum;
66
import org.test.datatypes.TestMessage;
7+
import org.test.datatypes.TestMessage.NestedTestMessage;
8+
import org.test.datatypes.TestMessage.NestedTestMessage.DeepNestedTestMessage;
79
import org.test.datatypes.TestSubMessage;
810

911
class DataTypesTest {
@@ -182,6 +184,39 @@ void should_have_empty_optional_on_no_data_in_builder() {
182184
assertThat(builder.getOptionalSubMessage()).isEmpty();
183185
}
184186

187+
@Test
188+
void should_have_optional_methods_in_nested_types() {
189+
NestedTestMessage nestedTestMessage = NestedTestMessage.getDefaultInstance();
190+
DeepNestedTestMessage deepNestedTestMessage = DeepNestedTestMessage.getDefaultInstance();
191+
192+
assertThat(nestedTestMessage.getOptionalOptionalString()).isEmpty();
193+
assertThat(nestedTestMessage.getOptionalSubMessage()).isEmpty();
194+
assertThat(deepNestedTestMessage.getOptionalOptionalString()).isEmpty();
195+
assertThat(deepNestedTestMessage.getOptionalSubMessage()).isEmpty();
196+
}
197+
198+
@Test
199+
void should_have_optional_builder_methods_in_nested_types() {
200+
NestedTestMessage.Builder nestedTestMessageBuilder = NestedTestMessage.newBuilder();
201+
DeepNestedTestMessage.Builder deepNestedTestMessageBuilder = DeepNestedTestMessage.newBuilder();
202+
203+
assertThat(nestedTestMessageBuilder.getOptionalOptionalString()).isEmpty();
204+
assertThat(nestedTestMessageBuilder.getOptionalSubMessage()).isEmpty();
205+
assertThat(deepNestedTestMessageBuilder.getOptionalOptionalString()).isEmpty();
206+
assertThat(deepNestedTestMessageBuilder.getOptionalSubMessage()).isEmpty();
207+
}
208+
209+
@Test
210+
void should_have_set_or_clear_builder_methods_in_nested_types() {
211+
NestedTestMessage.Builder nestedTestMessageBuilder = NestedTestMessage.newBuilder();
212+
DeepNestedTestMessage.Builder deepNestedTestMessageBuilder = DeepNestedTestMessage.newBuilder();
213+
214+
assertThat(nestedTestMessageBuilder.setOrClearOptionalString(null)).isSameAs(nestedTestMessageBuilder);
215+
assertThat(nestedTestMessageBuilder.setOrClearSubMessage(null)).isSameAs(nestedTestMessageBuilder);
216+
assertThat(deepNestedTestMessageBuilder.setOrClearOptionalString(null)).isSameAs(deepNestedTestMessageBuilder);
217+
assertThat(deepNestedTestMessageBuilder.setOrClearSubMessage(null)).isSameAs(deepNestedTestMessageBuilder);
218+
}
219+
185220
private static TestMessage.Builder populatedTestMessage() {
186221
return TestMessage.newBuilder()
187222
.setOneofString("one-of")

protoc-gen-java-optional-test/src/test/resources/data-types.proto

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,22 @@ message TestMessage {
2121
value2 = 2;
2222
}
2323

24+
message NestedTestMessage {
25+
message DeepNestedTestMessage {
26+
string string = 1;
27+
optional string optional_string = 2;
28+
TestSubMessage sub_message = 3;
29+
}
30+
31+
string string = 1;
32+
optional string optional_string = 2;
33+
TestSubMessage sub_message = 3;
34+
}
35+
2436
string string = 1;
2537
int32 int32 = 2;
2638
bool bool = 3;
27-
TestSubMessage subMessage = 5;
39+
TestSubMessage sub_message = 5;
2840
double double = 6;
2941
float float = 7;
3042
bytes bytes = 8;
@@ -60,7 +72,7 @@ message RepeatedTestMessage {
6072
repeated string string = 1;
6173
repeated int32 int32 = 2;
6274
repeated bool bool = 3;
63-
repeated TestSubMessage subMessage = 5;
75+
repeated TestSubMessage sub_message = 5;
6476
repeated double double = 6;
6577
repeated float float = 7;
6678
repeated bytes bytes = 8;

protoc-gen-java-optional/src/main/java/org/grpcmock/protoc/plugin/OptionalGenerator.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,29 @@ private Stream<File> handleProtoFile(FileDescriptorProto fileDescriptor) {
9494
: protoPackage;
9595

9696
return fileDescriptor.getMessageTypeList().stream()
97-
.flatMap(messageDescriptor -> handleMessage(messageDescriptor, protoPackage, javaPackage));
97+
.flatMap(descriptor -> handleMessageProto(descriptor, descriptor.getName(), protoPackage, javaPackage));
9898
}
9999

100-
private Stream<File> handleMessage(DescriptorProto messageDescriptor, String protoPackage, String javaPackage) {
101-
String fileName = javaPackage.replace(".", DIR_SEPARATOR) + DIR_SEPARATOR + messageDescriptor.getName() + JAVA_EXTENSION;
100+
private Stream<File> handleMessageProto(
101+
DescriptorProto messageDescriptor,
102+
String fileName,
103+
String protoPackage,
104+
String javaPackage
105+
) {
106+
String filePath = javaPackage.replace(".", DIR_SEPARATOR) + DIR_SEPARATOR + fileName + JAVA_EXTENSION;
102107
String fullMethodName = protoPackage + "." + messageDescriptor.getName();
103108

109+
return Stream.concat(
110+
handleMessage(messageDescriptor, filePath, fullMethodName),
111+
messageDescriptor.getNestedTypeList().stream()
112+
.filter(nestedDescriptor -> !nestedDescriptor.getOptions().getMapEntry())
113+
.flatMap(nestedDescriptor -> handleMessageProto(nestedDescriptor, fileName, fullMethodName, javaPackage)));
114+
}
115+
116+
private Stream<File> handleMessage(DescriptorProto messageDescriptor, String filePath, String fullMethodName) {
104117
return Stream.of(
105-
createFile(messageDescriptor, fileName, fullMethodName, BUILDER_SCOPE, this::createBuilderMethods),
106-
createFile(messageDescriptor, fileName, fullMethodName, CLASS_SCOPE, this::createClassMethods))
118+
createFile(messageDescriptor, filePath, fullMethodName, BUILDER_SCOPE, this::createBuilderMethods),
119+
createFile(messageDescriptor, filePath, fullMethodName, CLASS_SCOPE, this::createClassMethods))
107120
.filter(Optional::isPresent)
108121
.map(Optional::get);
109122
}

0 commit comments

Comments
 (0)