/* * Copied from Gentyref project http://code.google.com/p/gentyref/ * Reformatted and moved to fit package structure */ package com.google.sitebricks.conversion.generics; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.lang.reflect.WildcardType; import java.util.HashMap; import java.util.Map; /** * Mapping between type variables and actual parameters. * * @author Wouter Coekaerts <wouter@coekaerts.be> */ class VarMap { private final Map<TypeVariable<?>, Type> map = new HashMap<TypeVariable<?>, Type>(); /** * Creates an empty VarMap */ VarMap() { } void add(TypeVariable<?> variable, Type value) { map.put(variable, value); } void addAll(TypeVariable<?>[] variables, Type[] values) { assert variables.length == values.length; for (int i = 0; i < variables.length; i++) { map.put(variables[i], values[i]); } } VarMap(TypeVariable<?>[] variables, Type[] values) { addAll(variables, values); } Type map(Type type) { if (type instanceof Class<?>) { return type; } else if (type instanceof TypeVariable<?>) { assert map.containsKey(type); return map.get(type); } else if (type instanceof ParameterizedType) { ParameterizedType pType = (ParameterizedType) type; return new ParameterizedTypeImpl((Class<?>) pType.getRawType(), map(pType .getActualTypeArguments()), pType.getOwnerType() == null ? pType.getOwnerType() : map(pType.getOwnerType())); } else if (type instanceof WildcardType) { WildcardType wType = (WildcardType) type; return new WildcardTypeImpl(map(wType.getUpperBounds()), map(wType.getLowerBounds())); } else if (type instanceof GenericArrayType) { return GenericArrayTypeImpl.createArrayType(map(((GenericArrayType) type) .getGenericComponentType())); } else { throw new RuntimeException("not implemented: mapping " + type.getClass() + " (" + type + ")"); } } Type[] map(Type[] types) { Type[] result = new Type[types.length]; for (int i = 0; i < types.length; i++) { result[i] = map(types[i]); } return result; } }