From ac33fff3e656e98b5bdf505f308686affb5b8722 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Wed, 19 Aug 2020 13:16:58 +0700 Subject: [PATCH] IDEA-246250 - refactoring of serial annotation inspections to prevent the code duplicates GitOrigin-RevId: 8e1de91a18c39a4185b234335b33acc0303fe43f --- .../siyeh/ig/psiutils/SerializationUtils.java | 16 ++++++ .../MissingSerialAnnotationInspection.java | 52 +++++++------------ ...AnnotationUsedOnWrongMemberInspection.java | 7 ++- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SerializationUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SerializationUtils.java index f292a6648d6e..641a43ab69fa 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SerializationUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SerializationUtils.java @@ -20,6 +20,9 @@ import com.intellij.psi.util.InheritanceUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static com.intellij.psi.CommonClassNames.SERIAL_VERSION_UID_FIELD_NAME; +import static com.intellij.psi.PsiModifier.*; + public final class SerializationUtils { private SerializationUtils() {} @@ -108,6 +111,19 @@ public final class SerializationUtils { return MethodUtils.simpleMethodMatches(method, null, CommonClassNames.JAVA_LANG_OBJECT, "writeReplace"); } + public static boolean isSerialVersionUid(@NotNull PsiField field) { + return isConstant(field) && field.getName().equals(SERIAL_VERSION_UID_FIELD_NAME) && field.getType().equals(PsiType.LONG); + } + + public static boolean isSerialPersistentFields(@NotNull PsiField field) { + return isConstant(field) && field.getName().equals("serialPersistentFields") && + field.getType().equalsToText("java.io.ObjectStreamField[]"); + } + + private static boolean isConstant(@NotNull PsiField field) { + return field.hasModifierProperty(PRIVATE) && field.hasModifierProperty(STATIC) && field.hasModifierProperty(FINAL); + } + public static boolean isProbablySerializable(PsiType type) { if (type instanceof PsiWildcardType) { return true; diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/MissingSerialAnnotationInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/MissingSerialAnnotationInspection.java index 30bf2d1efb73..50cdf49317c4 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/MissingSerialAnnotationInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/MissingSerialAnnotationInspection.java @@ -15,11 +15,8 @@ import com.siyeh.ig.psiutils.SerializationUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Optional; - import static com.intellij.psi.CommonClassNames.JAVA_IO_SERIAL; -import static com.intellij.psi.CommonClassNames.SERIAL_VERSION_UID_FIELD_NAME; -import static com.intellij.psi.PsiModifier.*; +import static com.intellij.psi.PsiModifier.PRIVATE; public class MissingSerialAnnotationInspection extends BaseInspection { @@ -43,18 +40,19 @@ public class MissingSerialAnnotationInspection extends BaseInspection { @Override public void visitField(PsiField field) { super.visitField(field); - if (field.hasAnnotation(JAVA_IO_SERIAL) || !isConstant(field)) return; + if (field.hasAnnotation(JAVA_IO_SERIAL)) return; - Optional pClass = getSerializablePsiClass(field); - if (pClass.isEmpty()) return; + PsiClass pClass = getSerializablePsiClass(field); + if (pClass == null) return; boolean candidateToBeAnnotated; - if (pClass.get().isRecord()) { - candidateToBeAnnotated = isSerialFieldInExternalizable(field); + if (pClass.isRecord()) { + candidateToBeAnnotated = SerializationUtils.isSerialVersionUid(field); } else { - candidateToBeAnnotated = SerializationUtils.isExternalizable(pClass.get()) ? isSerialFieldInExternalizable(field) - : isSerialFieldInSerializable(field); + candidateToBeAnnotated = SerializationUtils.isExternalizable(pClass) ? SerializationUtils.isSerialVersionUid(field) + : SerializationUtils.isSerialVersionUid(field) || + SerializationUtils.isSerialPersistentFields(field); } if (candidateToBeAnnotated) { registerError(field.getNameIdentifier(), field); @@ -66,16 +64,16 @@ public class MissingSerialAnnotationInspection extends BaseInspection { super.visitMethod(method); if (method.hasAnnotation(JAVA_IO_SERIAL)) return; - Optional pClass = getSerializablePsiClass(method); - if (pClass.isEmpty()) return; + PsiClass pClass = getSerializablePsiClass(method); + if (pClass == null) return; boolean candidateToBeAnnotated; - if (pClass.get().isRecord()) { + if (pClass.isRecord()) { candidateToBeAnnotated = isSerialMethodInExternalizable(method); } else { - candidateToBeAnnotated = SerializationUtils.isExternalizable(pClass.get()) ? isSerialMethodInExternalizable(method) - : isSerialMethodInSerializable(method); + candidateToBeAnnotated = SerializationUtils.isExternalizable(pClass) ? isSerialMethodInExternalizable(method) + : isSerialMethodInSerializable(method); } if (candidateToBeAnnotated) { PsiIdentifier methodIdentifier = method.getNameIdentifier(); @@ -83,21 +81,13 @@ public class MissingSerialAnnotationInspection extends BaseInspection { registerError(methodIdentifier, method); } } - - private static Optional getSerializablePsiClass(@NotNull PsiElement psiElement) { - PsiClass psiClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class); - if (psiClass == null) return Optional.empty(); - return !psiClass.isEnum() && SerializationUtils.isSerializable(psiClass) ? Optional.of(psiClass) : Optional.empty(); - } } - static boolean isConstant(@NotNull PsiField field) { - return field.hasModifierProperty(PRIVATE) && field.hasModifierProperty(STATIC) && field.hasModifierProperty(FINAL); - } - - static boolean isSerialFieldInSerializable(@NotNull PsiField field) { - return isSerialFieldInExternalizable(field) || - (field.getName().equals("serialPersistentFields") && field.getType().equalsToText("java.io.ObjectStreamField[]")); + @Nullable + static PsiClass getSerializablePsiClass(@NotNull PsiElement psiElement) { + PsiClass psiClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class); + if (psiClass == null) return null; + return !psiClass.isEnum() && SerializationUtils.isSerializable(psiClass) ? psiClass : null; } static boolean isSerialMethodInSerializable(@NotNull PsiMethod method) { @@ -111,10 +101,6 @@ public class MissingSerialAnnotationInspection extends BaseInspection { return isSerialMethodInExternalizable(method); } - static boolean isSerialFieldInExternalizable(@NotNull PsiField field) { - return field.getName().equals(SERIAL_VERSION_UID_FIELD_NAME) && field.getType().equals(PsiType.LONG); - } - static boolean isSerialMethodInExternalizable(@NotNull PsiMethod method) { return SerializationUtils.isWriteReplace(method) || SerializationUtils.isReadResolve(method); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerialAnnotationUsedOnWrongMemberInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerialAnnotationUsedOnWrongMemberInspection.java index 8abf2efc9d2e..9be115f5d0c2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerialAnnotationUsedOnWrongMemberInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerialAnnotationUsedOnWrongMemberInspection.java @@ -74,13 +74,12 @@ public class SerialAnnotationUsedOnWrongMemberInspection extends BaseInspection boolean isWellAnnotatedElement; if (SerializationUtils.isExternalizable(psiClass)) { isWellAnnotatedElement = psiField == null ? MissingSerialAnnotationInspection.isSerialMethodInExternalizable(psiMethod) - : MissingSerialAnnotationInspection.isConstant(psiField) && - MissingSerialAnnotationInspection.isSerialFieldInExternalizable(psiField); + : SerializationUtils.isSerialVersionUid(psiField); } else { isWellAnnotatedElement = psiField == null ? MissingSerialAnnotationInspection.isSerialMethodInSerializable(psiMethod) - : MissingSerialAnnotationInspection.isConstant(psiField) && - MissingSerialAnnotationInspection.isSerialFieldInSerializable(psiField); + : SerializationUtils.isSerialVersionUid(psiField) || + SerializationUtils.isSerialPersistentFields(psiField); } if (!isWellAnnotatedElement) { registerError(annotation, annotation);