1 package net.sourceforge.pmd.lang.java.typeresolution; 2 3 import java.util.Arrays; 4 import java.util.List; 5 6 import net.sourceforge.pmd.lang.ast.Node; 7 import net.sourceforge.pmd.lang.java.ast.TypeNode; 8 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration; 9 10 public class TypeHelper { 11 12 public static boolean isA(TypeNode n, Class<?> clazz) { 13 return subclasses(n, clazz); 14 } 15 16 public static boolean isEither(TypeNode n, Class<?> class1, Class<?> class2) { 17 return subclasses(n, class1) || subclasses(n, class2); 18 } 19 20 public static boolean isA(VariableNameDeclaration vnd, Class<?> clazz) { 21 Class<?> type = vnd.getType(); 22 return type != null && type.equals(clazz) || type == null 23 && (clazz.getSimpleName().equals(vnd.getTypeImage()) || clazz.getName().equals(vnd.getTypeImage())); 24 } 25 26 public static boolean isEither(VariableNameDeclaration vnd, Class<?> class1, Class<?> class2) { 27 return isA(vnd, class1) || isA(vnd, class2); 28 } 29 30 public static boolean isNeither(VariableNameDeclaration vnd, Class<?> class1, Class<?> class2) { 31 return !isA(vnd, class1) && !isA(vnd, class2); 32 } 33 34 public static boolean subclasses(TypeNode n, Class<?> clazz) { 35 Class type = n.getType(); 36 if (type == null) { 37 return clazz.getSimpleName().equals(((Node) n).getImage()) || clazz.getName().equals(((Node) n).getImage()); 38 } 39 40 if (type.equals(clazz)) { 41 return true; 42 } 43 44 List<Class> implementors = Arrays.asList(type.getInterfaces()); 45 if (implementors.contains(clazz)) { 46 return true; 47 } 48 Class<?> superC = type.getSuperclass(); 49 while (superC != null && !superC.equals(Object.class)) { 50 if (superC.equals(clazz)) { 51 return true; 52 } 53 superC = superC.getSuperclass(); 54 } 55 return false; 56 } 57 }