Update 25.x GeneratedMessageV3 and nested classes to inherit from GeneratedMessage that passes 25.x //java/... and //compatability/... bazel build and tests
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java index d3ff341..0bb5b43 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
@@ -325,17 +325,6 @@ /** TODO: remove this together with GeneratedMessage.BuilderParent. */ protected abstract Message.Builder newBuilderForType(BuilderParent parent); - @Override - protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) { - return newBuilderForType( - new BuilderParent() { - @Override - public void markDirty() { - parent.markDirty(); - } - }); - } - @SuppressWarnings("unchecked") public abstract static class Builder<BuilderType extends Builder<BuilderType>> extends AbstractMessage.Builder<BuilderType> { @@ -592,7 +581,7 @@ } @Override - public final UnknownFieldSet getUnknownFields() { + public UnknownFieldSet getUnknownFields() { return unknownFields; } @@ -1908,7 +1897,7 @@ * Users should ignore this class. This class provides the implementation with access to the * fields of a message object using Java reflection. */ - public static final class FieldAccessorTable { + public static class FieldAccessorTable { /** * Construct a FieldAccessorTable for a particular message class. Only one FieldAccessorTable
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java index 9c4980f..38762bf 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
@@ -53,7 +53,7 @@ * * @author kenton@google.com Kenton Varda */ -public abstract class GeneratedMessageV3 extends AbstractMessage implements Serializable { +public abstract class GeneratedMessageV3 extends GeneratedMessage implements Serializable { private static final long serialVersionUID = 1L; /** @@ -537,27 +537,23 @@ * * <p>TODO: Remove at breaking change since b/29368482 was fixed in 2020 */ - protected interface BuilderParent extends AbstractMessage.BuilderParent {} + protected interface BuilderParent extends GeneratedMessage.BuilderParent {} - /** TODO: remove this together with GeneratedMessageV3.BuilderParent. */ + // /** TODO: remove this together with GeneratedMessageV3.BuilderParent. */ protected abstract Message.Builder newBuilderForType(BuilderParent parent); - /** TODO: generated class should implement this directly */ @Override - protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) { - return newBuilderForType( - new BuilderParent() { - @Override - public void markDirty() { - parent.markDirty(); - } - }); + protected Message.Builder newBuilderForType(GeneratedMessage.BuilderParent parent) { + // if (parent instanceof GeneratedMessageV3.BuilderParent) { + return newBuilderForType((GeneratedMessageV3.BuilderParent) parent); + // } + // throw new UnsupportedOperationException("Should be overridden"); } /** Builder class for {@link GeneratedMessageV3}. */ @SuppressWarnings("unchecked") public abstract static class Builder<BuilderT extends Builder<BuilderT>> - extends AbstractMessage.Builder<BuilderT> { + extends GeneratedMessage.Builder<BuilderT> { private BuilderParent builderParent; @@ -913,18 +909,6 @@ return meAsParent; } - /** - * Called when a builder or one of its nested children has changed and any parent should be - * notified of its invalidation. - */ - protected final void onChanged() { - if (isClean && builderParent != null) { - builderParent.markDirty(); - - // Don't keep dispatching invalidations until build is called again. - isClean = false; - } - } /** * Gets the map field with the given field number. This method should be overridden in the @@ -2056,7 +2040,7 @@ * Users should ignore this class. This class provides the implementation with access to the * fields of a message object using Java reflection. */ - public static final class FieldAccessorTable { + public static final class FieldAccessorTable extends GeneratedMessage.FieldAccessorTable { /** * Construct a FieldAccessorTable for a particular message class. Only one FieldAccessorTable @@ -2082,6 +2066,7 @@ * FieldAccessors. */ public FieldAccessorTable(final Descriptor descriptor, final String[] camelCaseNames) { + super(descriptor, camelCaseNames); this.descriptor = descriptor; this.camelCaseNames = camelCaseNames; fields = new FieldAccessor[descriptor.getFields().size()]; @@ -2096,7 +2081,16 @@ * @param builderClass The builder type. * @return this */ + @Override + @SuppressWarnings("unchecked") public FieldAccessorTable ensureFieldAccessorsInitialized( + Class<? extends GeneratedMessage> messageClass, Class<? extends GeneratedMessage.Builder> builderClass) { + // if (messageClass.isAssignableFrom(GeneratedMessageV3.class)) + return ensureFieldAccessorsInitializedV3((Class<? extends GeneratedMessageV3>) messageClass, (Class<? extends Builder<?>>) builderClass); + } + + + public FieldAccessorTable ensureFieldAccessorsInitializedV3( Class<? extends GeneratedMessageV3> messageClass, Class<? extends Builder<?>> builderClass) { if (initialized) { return this;
diff --git a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java index b36794f..531c573 100644 --- a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java +++ b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
@@ -37,13 +37,14 @@ * @author jonp@google.com (Jon Perlow) */ public class RepeatedFieldBuilderV3< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, + MType extends GeneratedMessageV3, + BType extends GeneratedMessageV3.Builder, IType extends MessageOrBuilder> - implements AbstractMessage.BuilderParent { + extends RepeatedFieldBuilder<MType, BType, IType> + implements GeneratedMessageV3.BuilderParent { // Parent to send changes to. - private AbstractMessage.BuilderParent parent; + private GeneratedMessageV3.BuilderParent parent; // List of messages. Never null. It may be immutable, in which case // isMessagesListMutable will be false. See note below. @@ -104,12 +105,13 @@ public RepeatedFieldBuilderV3( List<MType> messages, boolean isMessagesListMutable, - AbstractMessage.BuilderParent parent, + GeneratedMessageV3.BuilderParent parent, boolean isClean) { - this.messages = messages; - this.isMessagesListMutable = isMessagesListMutable; - this.parent = parent; - this.isClean = isClean; + super(messages, isMessagesListMutable, parent, isClean); + // this.messages = messages; + // this.isMessagesListMutable = isMessagesListMutable; + // this.parent = parent; + // this.isClean = isClean; } public void dispose() { @@ -318,7 +320,7 @@ * @param values the messages to add * @return the builder */ - @CanIgnoreReturnValue + @CanIgnoreReturnValue public RepeatedFieldBuilderV3<MType, BType, IType> addAllMessages( Iterable<? extends MType> values) { for (final MType value : values) { @@ -551,8 +553,8 @@ * @param <IType> the common interface for the message and the builder */ private static class MessageExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, + MType extends GeneratedMessageV3, + BType extends GeneratedMessageV3.Builder, IType extends MessageOrBuilder> extends AbstractList<MType> implements List<MType>, RandomAccess { @@ -585,8 +587,8 @@ * @param <IType> the common interface for the message and the builder */ private static class BuilderExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, + MType extends GeneratedMessageV3, + BType extends GeneratedMessageV3.Builder, IType extends MessageOrBuilder> extends AbstractList<BType> implements List<BType>, RandomAccess { @@ -619,8 +621,8 @@ * @param <IType> the common interface for the message and the builder */ private static class MessageOrBuilderExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, + MType extends GeneratedMessageV3, + BType extends GeneratedMessageV3.Builder, IType extends MessageOrBuilder> extends AbstractList<IType> implements List<IType>, RandomAccess {
diff --git a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java index 0aff2b8..10a0598 100644 --- a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java +++ b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
@@ -30,13 +30,14 @@ * @author jonp@google.com (Jon Perlow) */ public class SingleFieldBuilderV3< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, + MType extends GeneratedMessageV3, + BType extends GeneratedMessageV3.Builder, IType extends MessageOrBuilder> - implements AbstractMessage.BuilderParent { + extends SingleFieldBuilder<MType, BType, IType> + implements GeneratedMessageV3.BuilderParent { // Parent to send changes to. - private AbstractMessage.BuilderParent parent; + private GeneratedMessageV3.BuilderParent parent; // Invariant: one of builder or message fields must be non-null. @@ -53,7 +54,8 @@ // to dispatch dirty invalidations. See AbstractMessage.BuilderListener. private boolean isClean; - public SingleFieldBuilderV3(MType message, AbstractMessage.BuilderParent parent, boolean isClean) { + public SingleFieldBuilderV3(MType message, GeneratedMessageV3.BuilderParent parent, boolean isClean) { + super(message, parent, isClean); this.message = checkNotNull(message); this.parent = parent; this.isClean = isClean;
diff --git a/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java b/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java index 8cc5527..9d452e2 100644 --- a/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java +++ b/java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java
@@ -161,7 +161,7 @@ } private RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder> - newRepeatedFieldBuilderV3(AbstractMessage.BuilderParent parent) { + newRepeatedFieldBuilderV3(GeneratedMessageV3.BuilderParent parent) { return new RepeatedFieldBuilderV3<TestAllTypes, TestAllTypes.Builder, TestAllTypesOrBuilder>( Collections.<TestAllTypes>emptyList(), false, parent, false); }
diff --git a/java/core/src/test/java/com/google/protobuf/TestUtil.java b/java/core/src/test/java/com/google/protobuf/TestUtil.java index 0f57ecc..18b4c99 100644 --- a/java/core/src/test/java/com/google/protobuf/TestUtil.java +++ b/java/core/src/test/java/com/google/protobuf/TestUtil.java
@@ -3871,7 +3871,7 @@ * * @author jonp@google.com (Jon Perlow) */ - public static class MockBuilderParent implements GeneratedMessage.BuilderParent { + public static class MockBuilderParent implements GeneratedMessageV3.BuilderParent { private int invalidations;