blob: f039dd34f7727259f54f62c1b34bd1eb364e9cfe [file] [log] [blame]
/*
* Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.siyeh.ig.psiutils;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class SerializationUtils {
private SerializationUtils() {}
public static boolean isSerializable(@Nullable PsiClass aClass) {
return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_SERIALIZABLE);
}
public static boolean isExternalizable(@Nullable PsiClass aClass) {
return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_EXTERNALIZABLE);
}
public static boolean isDirectlySerializable(@NotNull PsiClass aClass) {
final PsiReferenceList implementsList = aClass.getImplementsList();
if (implementsList == null) {
return false;
}
final PsiJavaCodeReferenceElement[] interfaces = implementsList.getReferenceElements();
for (PsiJavaCodeReferenceElement aInterfaces : interfaces) {
final PsiClass implemented = (PsiClass)aInterfaces.resolve();
if (implemented == null) {
continue;
}
final String name = implemented.getQualifiedName();
if (CommonClassNames.JAVA_IO_SERIALIZABLE.equals(name)) {
return true;
}
}
return false;
}
public static boolean hasReadObject(@NotNull PsiClass aClass) {
final PsiMethod[] methods = aClass.findMethodsByName("readObject", false);
for (final PsiMethod method : methods) {
if (isReadObject(method)) {
return true;
}
}
return false;
}
public static boolean hasReadResolve(@NotNull PsiClass aClass) {
final PsiMethod[] methods = aClass.findMethodsByName("readResolve", true);
for (PsiMethod method : methods) {
if (isReadResolve(method)) {
return true;
}
}
return false;
}
public static boolean hasWriteObject(@NotNull PsiClass aClass) {
final PsiMethod[] methods = aClass.findMethodsByName("writeObject", false);
for (final PsiMethod method : methods) {
if (isWriteObject(method)) {
return true;
}
}
return false;
}
public static boolean hasWriteReplace(@NotNull PsiClass aClass) {
final PsiMethod[] methods = aClass.findMethodsByName("writeReplace", true);
for (PsiMethod method : methods) {
if (isWriteReplace(method)) {
return true;
}
}
return false;
}
public static boolean isReadObject(@NotNull PsiMethod method) {
final PsiClassType type = TypeUtils.getType("java.io.ObjectInputStream", method);
return MethodUtils.methodMatches(method, null, PsiType.VOID, "readObject", type);
}
public static boolean isWriteObject(@NotNull PsiMethod method) {
final PsiClassType type = TypeUtils.getType("java.io.ObjectOutputStream", method);
return MethodUtils.methodMatches(method, null, PsiType.VOID, "writeObject", type);
}
public static boolean isReadResolve(@NotNull PsiMethod method) {
return MethodUtils.simpleMethodMatches(method, null, CommonClassNames.JAVA_LANG_OBJECT, "readResolve");
}
public static boolean isWriteReplace(@NotNull PsiMethod method) {
return MethodUtils.simpleMethodMatches(method, null, CommonClassNames.JAVA_LANG_OBJECT, "writeReplace");
}
public static boolean isProbablySerializable(PsiType type) {
if (type instanceof PsiWildcardType) {
return true;
}
if (type instanceof PsiPrimitiveType) {
return true;
}
if (type instanceof PsiArrayType) {
final PsiArrayType arrayType = (PsiArrayType)type;
final PsiType componentType = arrayType.getComponentType();
return isProbablySerializable(componentType);
}
if (type instanceof PsiClassType) {
final PsiClassType classTYpe = (PsiClassType)type;
final PsiClass psiClass = classTYpe.resolve();
if (isSerializable(psiClass)) {
return true;
}
if (isExternalizable(psiClass)) {
return true;
}
if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_COLLECTION) ||
InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_MAP)) {
final PsiType[] parameters = classTYpe.getParameters();
for (PsiType parameter : parameters) {
if (!isProbablySerializable(parameter)) {
return false;
}
}
return true;
}
return false;
}
return false;
}
}