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 }