fix(protobuf): fix reseved field error in fields in nested messages (#9318)

This commit is contained in:
juhyun seo 2024-01-19 06:45:00 +09:00 committed by GitHub
parent cf200a32ae
commit 6cb3dc839c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 132 additions and 6 deletions

View File

@ -277,13 +277,18 @@ public class ProtobufField implements ProtobufElement {
messageType = messageType.getNestedType(value);
}
if (pathList.get(pathSize - 2) == DescriptorProto.FIELD_FIELD_NUMBER
&& pathList.get(pathSize - 1) != DescriptorProto.RESERVED_RANGE_FIELD_NUMBER
&& pathList.get(pathSize - 1) != DescriptorProto.RESERVED_NAME_FIELD_NUMBER) {
return messageType.getField(pathList.get(pathSize - 1));
} else {
return null;
int fieldIndex = pathList.get(pathList.size() - 1);
if (isFieldPath(pathList)
&& pathSize % 2 == 0
&& fieldIndex < messageType.getFieldList().size()) {
return messageType.getField(fieldIndex);
}
return null;
}
private boolean isFieldPath(List<Integer> pathList) {
return pathList.get(pathList.size() - 2) == DescriptorProto.FIELD_FIELD_NUMBER;
}
private boolean isEnumType(List<Integer> pathList) {

View File

@ -323,4 +323,36 @@ public class ProtobufFieldTest {
assertEquals("Zip code, alphanumeric", addressField.getDescription());
}
@Test
public void nestedTypeReservedFieldsTest() throws IOException {
ProtobufDataset test = getTestProtobufDataset("extended_protobuf", "messageD");
SchemaMetadata testMetadata = test.getSchemaMetadata();
SchemaField msg3Field13 =
testMetadata.getFields().stream()
.filter(
v ->
v.getFieldPath()
.equals(
"[version=2.0].[type=extended_protobuf_MyMsg]."
+ "[type=extended_protobuf_MyMsg_Msg3].field3.[type=google_protobuf_StringValue].msg3_13"))
.findFirst()
.orElseThrow();
assertEquals("test comment 13", msg3Field13.getDescription());
SchemaField msg3Field14 =
testMetadata.getFields().stream()
.filter(
v ->
v.getFieldPath()
.equals(
"[version=2.0].[type=extended_protobuf_MyMsg]."
+ "[type=extended_protobuf_MyMsg_Msg3].field3.[type=google_protobuf_StringValue].msg3_14"))
.findFirst()
.orElseThrow();
assertEquals("test comment 14", msg3Field14.getDescription());
}
}

View File

@ -0,0 +1,89 @@
syntax = "proto3";
package extended_protobuf;
import "google/protobuf/wrappers.proto";
/*
MyMsg Message
*/
message MyMsg {
/*
Message 1
*/
message Msg1 {
int32 msg1_id = 1;
}
Msg1 msg1_field = 1;
/*
Message 2
*/
message Msg2 {
int32 msg2_id = 1;
}
Msg2 msg2_field = 2;
/*
Message 3
*/
message Msg3 {
// test comment 1
google.protobuf.Int64Value msg3_1 = 1;
// test comment 2
google.protobuf.Int64Value msg3_2 = 2;
// test comment 3
google.protobuf.Int64Value msg3_3 = 3;
// test comment 4
google.protobuf.StringValue msg3_4 = 4;
// test comment 5
reserved 5;
// test comment 6
reserved 6;
message Msg4 {
// msg4_1 comment
google.protobuf.Int32Value msg4_1 = 1;
// msg4_2 reserved
reserved 2;
// msg4_3 comment
google.protobuf.Int32Value msg4_3 = 3;
message Msg5 {
// msg5_1 comment
google.protobuf.Int32Value msg5_1 = 1;
// msg5_2 comment
google.protobuf.Int32Value msg5_2 = 2;
// msg5_3 comment
google.protobuf.Int32Value msg5_3 = 3;
// msg5_4 comment
google.protobuf.Int32Value msg5_4 = 4;
// reserved comment
reserved 5;
// msg5_6 comment
google.protobuf.Int32Value msg5_6 = 6;
}
// msg5 comment
Msg5 msg5 = 4;
}
// test comment 7
Msg4 msg4 = 7;
// test comment 8
google.protobuf.StringValue msg3_8 = 8;
// test comment 9
google.protobuf.StringValue msg3_9 = 9;
// test comment 10
google.protobuf.StringValue msg3_10 = 10;
// test comment 11
reserved 11;
// test comment 12
google.protobuf.StringValue msg3_12 = 12;
// test comment 13
google.protobuf.StringValue msg3_13 = 13;
// test comment 14
google.protobuf.StringValue msg3_14 = 14;
// test comment 15
google.protobuf.StringValue msg3_15 = 15;
}
// field 3
Msg3 field3 = 3;
}