All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.sitebricks.conversion.generics.VarMap Maven / Gradle / Ivy

/*
 * 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 
 */
class VarMap
{
	private final Map, Type> map = new HashMap, 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;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy