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

org.evosuite.utils.generic.VarMap Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
/**
 * 
 */
package org.evosuite.utils.generic;

import org.evosuite.runtime.util.Inputs;
import org.evosuite.utils.ParameterizedTypeImpl;

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.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Mapping between type variables and actual parameters.
 * 
 */
public class VarMap {

	private final Map, Type> map = new LinkedHashMap<>();

	/**
	 * Creates an empty VarMap
	 */
	public VarMap() {
	}

	public void add(TypeVariable variable, Type value) {
		map.put(variable, value);
	}

	public void addAll(TypeVariable[] variables, Type[] values) throws IllegalArgumentException{
		Inputs.checkNull(variables,values);
		if(variables.length != values.length) {
			throw new IllegalArgumentException("Array length mismatch");
		}

		for (int i = 0; i < variables.length; i++) {
			add(variables[i], values[i]);
		}
	}

	public void addAll(Map, GenericClass> variables) throws IllegalArgumentException{
		Inputs.checkNull(variables);
		for (Entry, GenericClass> entry : variables.entrySet()) {
			add(entry.getKey(), entry.getValue().getType());
		}
	}


	public Type map(Type type) throws IllegalArgumentException{
		Inputs.checkNull(type);

		if (type instanceof Class) {
			return type;
		} else if (type instanceof TypeVariable) {
			// TypeVariables may also come from generic methods!
			// assert map.containsKey(type);
			if (map.containsKey(type))
				return map.get(type);
			else {
				//FIXME: (wrong) tmp workaround, as WildcardTypeImpl does crash EvoSuite
				//return Object.class;
				// TODO: Bounds should be mapped, but might be recursive so we just use unbounded for now
				return new WildcardTypeImpl(new Type[]{Object.class}, new 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 IllegalArgumentException("not implemented: mapping " + type.getClass()
			        + " (" + type + ")");
		}
	}

	public Type[] map(Type[] types) throws IllegalArgumentException{
		Inputs.checkNull(types);
		Type[] result = new Type[types.length];
		for (int i = 0; i < types.length; i++) {
			result[i] = map(types[i]);
		}
		return result;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy