From a208e569d4b24af6e542a821aafec23da1e3c63d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 9 Feb 2023 17:44:31 +0100 Subject: [PATCH] Java: recognize readObjectNoData() as a serialization method (IDEA-286800) for "Unused declaration" inspection GitOrigin-RevId: 5b5c262ea38dceefde5eb565b9c01225d4bfb8ba --- .../UnusedDeclarationInspectionBase.java | 26 ++++++++++++++----- .../deadCode/serializable/src/Test.java | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java index d218f9798625..2dab07da825e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java @@ -179,7 +179,7 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { if (!equalsToText(parameters.get(0).getType(), "java.io.ObjectOutputStream")) return false; if (method.isStatic()) return false; UClass aClass = UDeclarationKt.getContainingDeclaration(method, UClass.class); - return !(aClass != null && !isSerializable(aClass, refClass)); + return aClass == null || isSerializable(aClass, refClass); } private static boolean isReadObjectMethod(@NotNull UMethod method, @Nullable RefClass refClass) { @@ -190,7 +190,17 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { if (!equalsToText(parameters.get(0).getType(), "java.io.ObjectInputStream")) return false; if (method.isStatic()) return false; UClass aClass = UDeclarationKt.getContainingDeclaration(method, UClass.class); - return !(aClass != null && !isSerializable(aClass, refClass)); + return aClass == null || isSerializable(aClass, refClass); + } + + private static boolean isReadObjectNoDataMethod(@NotNull UMethod method, @Nullable RefClass refClass) { + String name = method.getName(); + if (!"readObjectNoData".equals(name)) return false; + if (!method.getUastParameters().isEmpty()) return false; + if (!equalsToText(method.getReturnType(), PsiKeyword.VOID)) return false; + if (method.isStatic()) return false; + UClass aClass = UDeclarationKt.getContainingDeclaration(method, UClass.class); + return aClass == null || isSerializable(aClass, refClass); } private static boolean isWriteReplaceMethod(@NotNull UMethod method, @Nullable RefClass refClass) { @@ -201,7 +211,7 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { if (!equalsToText(method.getReturnType(), CommonClassNames.JAVA_LANG_OBJECT)) return false; if (method.isStatic()) return false; UClass aClass = UDeclarationKt.getContainingDeclaration(method, UClass.class); - return !(aClass != null && !isSerializable(aClass, refClass)); + return aClass == null || isSerializable(aClass, refClass); } private static boolean isReadResolveMethod(@NotNull UMethod method, @Nullable RefClass refClass) { @@ -212,7 +222,7 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { if (!equalsToText(method.getReturnType(), CommonClassNames.JAVA_LANG_OBJECT)) return false; if (method.isStatic()) return false; final UClass aClass = UDeclarationKt.getContainingDeclaration(method, UClass.class); - return !(aClass != null && !isSerializable(aClass, refClass)); + return aClass == null || isSerializable(aClass, refClass); } private static boolean equalsToText(PsiType type, String text) { @@ -509,8 +519,12 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { } private static boolean isSerializablePatternMethod(@NotNull UMethod psiMethod, @Nullable RefClass refClass) { - return isReadObjectMethod(psiMethod, refClass) || isWriteObjectMethod(psiMethod, refClass) || isReadResolveMethod(psiMethod, refClass) || - isWriteReplaceMethod(psiMethod, refClass) || isExternalizableNoParameterConstructor(psiMethod, refClass); + return isReadObjectMethod(psiMethod, refClass) || + isReadObjectNoDataMethod(psiMethod, refClass) || + isWriteObjectMethod(psiMethod, refClass) || + isReadResolveMethod(psiMethod, refClass) || + isWriteReplaceMethod(psiMethod, refClass) || + isExternalizableNoParameterConstructor(psiMethod, refClass); } private static boolean belongsToRepeatableAnnotationContainer(@NotNull UMethod uMethod, @Nullable RefClass ownerRefClass) { diff --git a/java/java-tests/testData/inspection/deadCode/serializable/src/Test.java b/java/java-tests/testData/inspection/deadCode/serializable/src/Test.java index 5afb0ecb21d5..5e9080c4ee6b 100644 --- a/java/java-tests/testData/inspection/deadCode/serializable/src/Test.java +++ b/java/java-tests/testData/inspection/deadCode/serializable/src/Test.java @@ -3,4 +3,5 @@ public class Test implements java.io.Serializable { private void readObject(java.io.ObjectInputStream in) {} public Object writeReplace() { return null; } public Object readResolve() { return null; } + public void readObjectNoData() {} } \ No newline at end of file