mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-246250 - refactoring of serial annotation inspections to prevent the code duplicates
GitOrigin-RevId: 8e1de91a18c39a4185b234335b33acc0303fe43f
This commit is contained in:
committed by
intellij-monorepo-bot
parent
eab67b1faa
commit
ac33fff3e6
+16
@@ -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;
|
||||
|
||||
+19
-33
@@ -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<PsiClass> 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<PsiClass> 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<PsiClass> 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);
|
||||
}
|
||||
|
||||
+3
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user