1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.runners.model;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.GenericArrayType;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Method;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.ParameterizedType;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Type;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.TypeVariable;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.WildcardType;
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotclass NoGenericTypeParametersValidator {
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Method fMethod;
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	NoGenericTypeParametersValidator(Method method) {
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		this.fMethod = method;
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	void validate(List<Throwable> errors) {
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Type each : fMethod.getGenericParameterTypes())
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			validateNoTypeParameterOnType(each, errors);
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void validateNoTypeParameterOnType(Type type, List<Throwable> errors) {
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (type instanceof TypeVariable<?>) {
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			errors.add(new Exception("Method " + fMethod.getName()
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					+ "() contains unresolved type variable " + type));
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		} else if (type instanceof ParameterizedType)
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			validateNoTypeParameterOnParameterizedType((ParameterizedType) type, errors);
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		else if (type instanceof WildcardType)
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			validateNoTypeParameterOnWildcardType((WildcardType) type, errors);
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		else if (type instanceof GenericArrayType)
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			validateNoTypeParameterOnGenericArrayType((GenericArrayType) type, errors);
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void validateNoTypeParameterOnParameterizedType(ParameterizedType parameterized,
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			List<Throwable> errors) {
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Type each : parameterized.getActualTypeArguments())
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			validateNoTypeParameterOnType(each, errors);
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void validateNoTypeParameterOnWildcardType(WildcardType wildcard,
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			List<Throwable> errors) {
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Type each : wildcard.getUpperBounds())
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		    validateNoTypeParameterOnType(each, errors);
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Type each : wildcard.getLowerBounds())
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		    validateNoTypeParameterOnType(each, errors);
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void validateNoTypeParameterOnGenericArrayType(
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			GenericArrayType arrayType, List<Throwable> errors) {
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		validateNoTypeParameterOnType(arrayType.getGenericComponentType(), errors);
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}