Skip to content

Commit ea33ae8

Browse files
Restore ABI compatibility for extension methods which was previously (knowingly) broken with 4.x: 94a2a44
Having overloads of the subtypes is unnecessary for source compatibility (where javac will resolve the type to the base type method), but removal of them an ABI break if .class files compiled against PBJ 3.x are used with PBJ 4.x. PiperOrigin-RevId: 805035553
1 parent f2257f5 commit ea33ae8

File tree

2 files changed

+70
-133
lines changed

2 files changed

+70
-133
lines changed

java/core/src/main/java/com/google/protobuf/GeneratedMessage.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,14 +949,58 @@ public interface ExtendableMessageOrBuilder<MessageT extends ExtendableMessage<M
949949
/** Check if a singular extension is present. */
950950
<T> boolean hasExtension(ExtensionLite<? extends MessageT, T> extension);
951951

952+
/**
953+
* hasExtension() overload for {@link Extension} instances. Since {@link Extension} is a subtype
954+
* of {@link ExtensionLite}, this is redundant for source-compatibility, but exists here to
955+
* maintain ABI compatibility with .class files which dispatch to a method of the concrete type.
956+
*/
957+
default <T> boolean hasExtension(Extension<? extends MessageT, T> extension) {
958+
return hasExtension((ExtensionLite<? extends MessageT, T>) extension);
959+
}
960+
961+
/** Overload to maintain ABI compatibility. See {@link #hasExtension(ExtensionLite)}. */
962+
default <T> boolean hasExtension(GeneratedExtension<? extends MessageT, T> extension) {
963+
return hasExtension((ExtensionLite<? extends MessageT, T>) extension);
964+
}
965+
952966
/** Get the number of elements in a repeated extension. */
953967
<T> int getExtensionCount(ExtensionLite<? extends MessageT, List<T>> extension);
954968

969+
/** Overload to maintain ABI compatibility. See {@link #getExtensionCount(ExtensionLite)}. */
970+
default <T> int getExtensionCount(Extension<? extends MessageT, List<T>> extension) {
971+
return getExtensionCount((ExtensionLite<? extends MessageT, List<T>>) extension);
972+
}
973+
974+
/** Overload to maintain ABI compatibility. See {@link #getExtensionCount(ExtensionLite)}. */
975+
default <T> int getExtensionCount(GeneratedExtension<MessageT, List<T>> extension) {
976+
return getExtensionCount((ExtensionLite<? extends MessageT, List<T>>) extension);
977+
}
978+
955979
/** Get the value of an extension. */
956980
<T> T getExtension(ExtensionLite<? extends MessageT, T> extension);
957981

982+
/** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
983+
default <T> T getExtension(Extension<? extends MessageT, T> extension) {
984+
return getExtension((ExtensionLite<? extends MessageT, T>) extension);
985+
}
986+
987+
/** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
988+
default <T> T getExtension(GeneratedExtension<MessageT, T> extension) {
989+
return getExtension((ExtensionLite<? extends MessageT, T>) extension);
990+
}
991+
958992
/** Get one element of a repeated extension. */
959993
<T> T getExtension(ExtensionLite<? extends MessageT, List<T>> extension, int index);
994+
995+
/** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
996+
default <T> T getExtension(Extension<? extends MessageT, List<T>> extension, int index) {
997+
return getExtension((ExtensionLite<? extends MessageT, List<T>>) extension, index);
998+
}
999+
1000+
/** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
1001+
default <T> T getExtension(GeneratedExtension<MessageT, List<T>> extension, int index) {
1002+
return getExtension((ExtensionLite<? extends MessageT, List<T>>) extension, index);
1003+
}
9601004
}
9611005

9621006
/**
@@ -1484,6 +1528,12 @@ public final <T> T getExtension(
14841528
extension.singularFromReflectionType(extensions.getRepeatedField(descriptor, index));
14851529
}
14861530

1531+
/** Overload to maintain ABI compatibility. See {@link #setExtension(ExtensionLite, Object)}. */
1532+
public final <T> BuilderT setExtension(
1533+
final Extension<? extends MessageT, T> extension, final T value) {
1534+
return setExtension((ExtensionLite<? extends MessageT, T>) extension, value);
1535+
}
1536+
14871537
/** Set the value of an extension. */
14881538
public final <T> BuilderT setExtension(
14891539
final ExtensionLite<? extends MessageT, T> extensionLite, final T value) {
@@ -1497,6 +1547,15 @@ public final <T> BuilderT setExtension(
14971547
return (BuilderT) this;
14981548
}
14991549

1550+
/**
1551+
* Overload to maintain ABI compatibility. See {@link #setExtension(ExtensionLite, int,
1552+
* Object)}.
1553+
*/
1554+
public final <T> BuilderT setExtension(
1555+
final Extension<? extends MessageT, List<T>> extension, final int index, final T value) {
1556+
return setExtension((ExtensionLite<? extends MessageT, List<T>>) extension, index, value);
1557+
}
1558+
15001559
/** Set the value of one element of a repeated extension. */
15011560
public final <T> BuilderT setExtension(
15021561
final ExtensionLite<? extends MessageT, List<T>> extensionLite,
@@ -1512,6 +1571,12 @@ public final <T> BuilderT setExtension(
15121571
return (BuilderT) this;
15131572
}
15141573

1574+
/** Overload to maintain ABI compatibility. See {@link #addExtension(ExtensionLite, Object)}. */
1575+
public final <T> BuilderT addExtension(
1576+
final Extension<? extends MessageT, List<T>> extension, final T value) {
1577+
return addExtension((ExtensionLite<? extends MessageT, List<T>>) extension, value);
1578+
}
1579+
15151580
/** Append a value to a repeated extension. */
15161581
public final <T> BuilderT addExtension(
15171582
final ExtensionLite<? extends MessageT, List<T>> extensionLite, final T value) {
@@ -1525,6 +1590,11 @@ public final <T> BuilderT addExtension(
15251590
return (BuilderT) this;
15261591
}
15271592

1593+
/** Overload to maintain ABI compatibility. See {@link #clearExtension(ExtensionLite)}. */
1594+
public final <T> BuilderT clearExtension(final Extension<? extends MessageT, T> extension) {
1595+
return clearExtension((ExtensionLite<? extends MessageT, T>) extension);
1596+
}
1597+
15281598
/** Clear an extension. */
15291599
public final <T> BuilderT clearExtension(
15301600
final ExtensionLite<? extends MessageT, T> extensionLite) {

java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -327,41 +327,6 @@ protected BuilderParent getParentForChildren() {
327327
public interface ExtendableMessageOrBuilder<MessageT extends ExtendableMessage<MessageT>>
328328
extends GeneratedMessage.ExtendableMessageOrBuilder<GeneratedMessageV3> {
329329

330-
/* Removed from GeneratedMessage.ExtendableMessageOrBuilder in
331-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
332-
*
333-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
334-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
335-
*/
336-
@Deprecated
337-
<T> boolean hasExtension(GeneratedExtension<MessageT, T> extension);
338-
339-
/* Removed from GeneratedMessage.ExtendableMessageOrBuilder in
340-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
341-
*
342-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
343-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
344-
*/
345-
@Deprecated
346-
<T> int getExtensionCount(GeneratedExtension<MessageT, List<T>> extension);
347-
348-
/* Removed from GeneratedMessage.ExtendableMessageOrBuilder in
349-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
350-
*
351-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
352-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
353-
*/
354-
@Deprecated
355-
<T> T getExtension(GeneratedExtension<MessageT, T> extension);
356-
357-
/* Removed from GeneratedMessage.ExtendableMessageOrBuilder in
358-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
359-
*
360-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
361-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
362-
*/
363-
@Deprecated
364-
<T> T getExtension(GeneratedExtension<MessageT, List<T>> extension, int index);
365330
}
366331

367332
/**
@@ -388,55 +353,6 @@ protected ExtendableMessage(ExtendableBuilder<MessageT, ?> builder) {
388353
super(builder);
389354
}
390355

391-
/* Removed from GeneratedMessage.ExtendableMessage in
392-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
393-
*
394-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
395-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
396-
*/
397-
@Deprecated
398-
@Override
399-
public final <T> boolean hasExtension(final GeneratedExtension<MessageT, T> extension) {
400-
return hasExtension((ExtensionLite<MessageT, T>) extension);
401-
}
402-
403-
/* Removed from GeneratedMessage.ExtendableMessage in
404-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
405-
*
406-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
407-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
408-
*/
409-
@Deprecated
410-
@Override
411-
public final <T> int getExtensionCount(final GeneratedExtension<MessageT, List<T>> extension) {
412-
return getExtensionCount((ExtensionLite<MessageT, List<T>>) extension);
413-
}
414-
415-
/* Removed from GeneratedMessage.ExtendableMessage in
416-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
417-
*
418-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
419-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
420-
*/
421-
@Deprecated
422-
@Override
423-
public final <T> T getExtension(final GeneratedExtension<MessageT, T> extension) {
424-
return getExtension((ExtensionLite<MessageT, T>) extension);
425-
}
426-
427-
/* Removed from GeneratedMessage.ExtendableMessage in
428-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
429-
*
430-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
431-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
432-
*/
433-
@Deprecated
434-
@Override
435-
public final <T> T getExtension(
436-
final GeneratedExtension<MessageT, List<T>> extension, final int index) {
437-
return getExtension((ExtensionLite<MessageT, List<T>>) extension, index);
438-
}
439-
440356
/* Overrides abstract GeneratedMessage.ExtendableMessage.internalGetFieldAccessorTable().
441357
*
442358
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
@@ -516,55 +432,6 @@ protected ExtendableBuilder(BuilderParent parent) {
516432
super(parent);
517433
}
518434

519-
/* Removed from GeneratedMessage.ExtendableBuilder in
520-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
521-
*
522-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
523-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
524-
*/
525-
@Deprecated
526-
@Override
527-
public final <T> boolean hasExtension(final GeneratedExtension<MessageT, T> extension) {
528-
return hasExtension((ExtensionLite<MessageT, T>) extension);
529-
}
530-
531-
/* Removed from GeneratedMessage.ExtendableBuilder in
532-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
533-
*
534-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
535-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
536-
*/
537-
@Deprecated
538-
@Override
539-
public final <T> int getExtensionCount(final GeneratedExtension<MessageT, List<T>> extension) {
540-
return getExtensionCount((ExtensionLite<MessageT, List<T>>) extension);
541-
}
542-
543-
/* Removed from GeneratedMessage.ExtendableBuilder in
544-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
545-
*
546-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
547-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
548-
*/
549-
@Deprecated
550-
@Override
551-
public final <T> T getExtension(final GeneratedExtension<MessageT, T> extension) {
552-
return getExtension((ExtensionLite<MessageT, T>) extension);
553-
}
554-
555-
/* Removed from GeneratedMessage.ExtendableBuilder in
556-
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
557-
*
558-
* @deprecated This method is deprecated, and slated for removal in the next Java breaking
559-
* change (5.x). Users should update gencode to >= 4.26.x which no longer overrides this method.
560-
*/
561-
@Deprecated
562-
@Override
563-
public final <T> T getExtension(
564-
final GeneratedExtension<MessageT, List<T>> extension, final int index) {
565-
return getExtension((ExtensionLite<MessageT, List<T>>) extension, index);
566-
}
567-
568435
/* Removed from GeneratedMessage.ExtendableBuilder in
569436
* https://github.com/protocolbuffers/protobuf/commit/94a2a448518403341b8aa71335ab1123fbdcccd8
570437
*

0 commit comments

Comments
 (0)