From f7dabfa2f2914e0c720b1929119690df736c6514 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Sun, 23 Aug 2026 07:11:17 -0700 Subject: [PATCH] Include `GeneratedMessageLite.ExtendableMessage` in `ImpossibleNullComparison` flag guard PiperOrigin-RevId: 969381879 --- .../bugpatterns/ImpossibleNullComparison.java | 27 +++++++++++- .../ImpossibleNullComparisonTest.java | 44 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/ImpossibleNullComparison.java b/core/src/main/java/com/google/errorprone/bugpatterns/ImpossibleNullComparison.java index 0caece85abc..929a217f0c9 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/ImpossibleNullComparison.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/ImpossibleNullComparison.java @@ -122,12 +122,33 @@ public final class ImpossibleNullComparison extends BugChecker private static final ImmutableSet COMPARISON_OPERATORS = Sets.immutableEnumSet(Kind.EQUAL_TO, Kind.NOT_EQUAL_TO); + private static final Matcher EXTENSION_METHODS_WITH_FIX_LEGACY = + instanceMethod() + .onDescendantOf(EXTENDABLE_MESSAGE_CLASS) + .named("getExtension") + .withParameters(EXTENSION_LITE_CLASS); + private static final Matcher EXTENSION_METHODS_WITH_FIX = instanceMethod() .onDescendantOfAny(EXTENDABLE_MESSAGE_CLASS, EXTENDABLE_MESSAGE_LITE_CLASS) .named("getExtension") .withParameters(EXTENSION_LITE_CLASS); + private static final Matcher EXTENSION_METHODS_WITH_NO_FIX_LEGACY = + anyOf( + instanceMethod() + .onDescendantOf(MESSAGE_OR_BUILDER_CLASS) + .named("getRepeatedField") + .withParameters(FIELD_DESCRIPTOR_CLASS, "int"), + instanceMethod() + .onDescendantOf(EXTENDABLE_MESSAGE_CLASS) + .named("getExtension") + .withParameters(EXTENSION_LITE_CLASS, "int"), + instanceMethod() + .onDescendantOf(MESSAGE_OR_BUILDER_CLASS) + .named("getField") + .withParameters(FIELD_DESCRIPTOR_CLASS)); + private static final Matcher EXTENSION_METHODS_WITH_NO_FIX = anyOf( instanceMethod() @@ -572,10 +593,12 @@ private String generateFix( if (!protoReceiver(checkOrBuilder).matches(tree, state)) { return null; } - if (EXTENSION_METHODS_WITH_NO_FIX.matches(tree, state)) { + if ((checkOrBuilder ? EXTENSION_METHODS_WITH_NO_FIX : EXTENSION_METHODS_WITH_NO_FIX_LEGACY) + .matches(tree, state)) { return GetterTypes::emptyFix; } - if (EXTENSION_METHODS_WITH_FIX.matches(tree, state)) { + if ((checkOrBuilder ? EXTENSION_METHODS_WITH_FIX : EXTENSION_METHODS_WITH_FIX_LEGACY) + .matches(tree, state)) { // If the extension represents a repeated field (i.e.: it's an ExtensionLite>), // the suggested fix from get->has isn't appropriate,so we shouldn't suggest a replacement diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/ImpossibleNullComparisonTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/ImpossibleNullComparisonTest.java index 80ed912d692..b4fa6fad017 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/ImpossibleNullComparisonTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/ImpossibleNullComparisonTest.java @@ -689,4 +689,48 @@ public void test(TestProtoMessageOrBuilder orBld) { """) .doTest(); } + + @Test + public void liteExtendableMessage_flagEnabled() { + compilationHelper + .addSourceLines( + "Test.java", + """ + import com.google.protobuf.ExtensionLite; + import com.google.protobuf.GeneratedMessageLite; + + public class Test { + public static , Type> + void test( + GeneratedMessageLite.ExtendableMessage msg, + ExtensionLite extension) { + // BUG: Diagnostic contains: msg.hasExtension(extension) + if (msg.getExtension(extension) != null) {} + } + } + """) + .doTest(); + } + + @Test + public void liteExtendableMessage_flagDisabled() { + compilationHelper + .setArgs("-XepOpt:ImpossibleNullComparison:CheckOrBuilder=false") + .addSourceLines( + "Test.java", + """ + import com.google.protobuf.ExtensionLite; + import com.google.protobuf.GeneratedMessageLite; + + public class Test { + public static , Type> + void test( + GeneratedMessageLite.ExtendableMessage msg, + ExtensionLite extension) { + if (msg.getExtension(extension) != null) {} + } + } + """) + .doTest(); + } }