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;