/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.typeresolution;
import java.util.Arrays;
import java.util.List;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.TypeNode;
import net.sourceforge.pmd.lang.java.symboltable.TypedNameDeclaration;
public final class TypeHelper {
private TypeHelper() {
// utility class
}
public static boolean isA(TypeNode n, Class<?> clazz) {
return subclasses(n, clazz);
}
public static boolean isEither(TypeNode n, Class<?> class1, Class<?> class2) {
return subclasses(n, class1) || subclasses(n, class2);
}
public static boolean isA(TypedNameDeclaration vnd, Class<?> clazz) {
Class<?> type = vnd.getType();
return type != null && type.equals(clazz) || type == null
&& (clazz.getSimpleName().equals(vnd.getTypeImage()) || clazz.getName().equals(vnd.getTypeImage()));
}
public static boolean isEither(TypedNameDeclaration vnd, Class<?> class1, Class<?> class2) {
return isA(vnd, class1) || isA(vnd, class2);
}
public static boolean isNeither(TypedNameDeclaration vnd, Class<?> class1, Class<?> class2) {
return !isA(vnd, class1) && !isA(vnd, class2);
}
public static boolean subclasses(TypeNode n, Class<?> clazz) {
Class<?> type = n.getType();
if (type == null) {
return clazz.getSimpleName().equals(((Node) n).getImage()) || clazz.getName().equals(((Node) n).getImage());
}
if (type.equals(clazz)) {
return true;
}
List<Class<?>> implementors = Arrays.asList(type.getInterfaces());
if (implementors.contains(clazz)) {
return true;
}
Class<?> superC = type.getSuperclass();
while (superC != null && !superC.equals(Object.class)) {
if (superC.equals(clazz)) {
return true;
}
superC = superC.getSuperclass();
}
return false;
}
}