Skip to content

Commit

Permalink
Fixing merge issues
Browse files Browse the repository at this point in the history
  • Loading branch information
mkruskal-google committed Sep 28, 2022
1 parent 082d4b7 commit 1245337
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
Expand Up @@ -418,10 +418,11 @@ public DynamicMessage buildPartial() {
}
}

fields.makeImmutable();
DynamicMessage result =
new DynamicMessage(
type,
fields.buildPartial(),
fields,
java.util.Arrays.copyOf(oneofCases, oneofCases.length),
unknownFields);
return result;
Expand Down
40 changes: 34 additions & 6 deletions java/core/src/main/java/com/google/protobuf/MessageReflection.java
Expand Up @@ -378,6 +378,7 @@ MergeTarget newEmptyTargetForField(
static class BuilderAdapter implements MergeTarget {

private final Message.Builder builder;
private boolean hasNestedBuilders = true;

@Override
public Descriptors.Descriptor getDescriptorForType() {
Expand All @@ -393,6 +394,17 @@ public Object getField(Descriptors.FieldDescriptor field) {
return builder.getField(field);
}

private Message.Builder getFieldBuilder(Descriptors.FieldDescriptor field) {
if (hasNestedBuilders) {
try {
return builder.getFieldBuilder(field);
} catch (UnsupportedOperationException e) {
hasNestedBuilders = false;
}
}
return null;
}

@Override
public boolean hasField(Descriptors.FieldDescriptor field) {
return builder.hasField(field);
Expand Down Expand Up @@ -536,11 +548,19 @@ public void mergeGroup(
Message defaultInstance)
throws IOException {
if (!field.isRepeated()) {
Message.Builder subBuilder;
if (hasField(field)) {
input.readGroup(field.getNumber(), builder.getFieldBuilder(field), extensionRegistry);
return;
subBuilder = getFieldBuilder(field);
if (subBuilder != null) {
input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
return;
} else {
subBuilder = newMessageFieldInstance(field, defaultInstance);
subBuilder.mergeFrom((Message) getField(field));
}
} else {
subBuilder = newMessageFieldInstance(field, defaultInstance);
}
Message.Builder subBuilder = newMessageFieldInstance(field, defaultInstance);
input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
Object unused = setField(field, subBuilder.buildPartial());
} else {
Expand All @@ -558,11 +578,19 @@ public void mergeMessage(
Message defaultInstance)
throws IOException {
if (!field.isRepeated()) {
Message.Builder subBuilder;
if (hasField(field)) {
input.readMessage(builder.getFieldBuilder(field), extensionRegistry);
return;
subBuilder = getFieldBuilder(field);
if (subBuilder != null) {
input.readMessage(subBuilder, extensionRegistry);
return;
} else {
subBuilder = newMessageFieldInstance(field, defaultInstance);
subBuilder.mergeFrom((Message) getField(field));
}
} else {
subBuilder = newMessageFieldInstance(field, defaultInstance);
}
Message.Builder subBuilder = newMessageFieldInstance(field, defaultInstance);
input.readMessage(subBuilder, extensionRegistry);
Object unused = setField(field, subBuilder.buildPartial());
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/google/protobuf/compiler/java/java_message_builder.cc
Expand Up @@ -673,7 +673,7 @@ void MessageBuilderGenerator::GenerateBuilderFieldParsingCase(
io::Printer* printer, const FieldDescriptor* field) {
uint32_t tag = WireFormatLite::MakeTag(
field->number(), WireFormat::WireTypeForFieldType(field->type()));
std::string tagString = absl::StrCat(static_cast<int32_t>(tag));
std::string tagString = StrCat(static_cast<int32_t>(tag));
printer->Print("case $tag$: {\n", "tag", tagString);
printer->Indent();

Expand All @@ -692,7 +692,7 @@ void MessageBuilderGenerator::GenerateBuilderPackedFieldParsingCase(
// packed version of this field regardless of field->options().packed().
uint32_t tag = WireFormatLite::MakeTag(
field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
std::string tagString = absl::StrCat(static_cast<int32_t>(tag));
std::string tagString = StrCat(static_cast<int32_t>(tag));
printer->Print("case $tag$: {\n", "tag", tagString);
printer->Indent();

Expand Down

0 comments on commit 1245337

Please sign in to comment.