1 package net.sourceforge.pmd.typeresolution;
2
3 import java.util.Arrays;
4 import java.util.List;
5
6 import net.sourceforge.pmd.ast.SimpleNode;
7 import net.sourceforge.pmd.ast.TypeNode;
8 import net.sourceforge.pmd.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 isA(VariableNameDeclaration vnd, Class clazz) {
17 Class type = vnd.getType();
18 return ((type != null && type.equals(clazz)) || (type == null && (clazz.getSimpleName().equals(vnd.getTypeImage()) || clazz.getName().equals(vnd.getTypeImage()))));
19 }
20
21 public static boolean subclasses(TypeNode n, Class clazz) {
22 Class type = n.getType();
23 if (type == null) {
24 return (clazz.getSimpleName().equals(((SimpleNode) n).getImage()) || clazz.getName().equals(((SimpleNode) n).getImage()));
25 }
26
27 if (type.equals(clazz)) {
28 return Boolean.TRUE;
29 }
30
31 List<Class> implementors = Arrays.asList(type.getInterfaces());
32 if (implementors.contains(clazz)) {
33 return Boolean.TRUE;
34 }
35 Class superC = type.getSuperclass();
36 while (superC != null && !superC.equals(Object.class)) {
37 if (superC.equals(clazz)) {
38 return Boolean.TRUE;
39 }
40 superC = superC.getSuperclass();
41 }
42 return Boolean.FALSE;
43 }
44 }