package org.aksw.sparqlify.type_system;
import java.util.Arrays;
import java.util.List;
/**
* FIXME FunctionSignature would be more concise
*
* TODO Maybe rename to something like TypeSignature, FunctionTypeSignature (preferred), TypeSignatureFunction.
*
* @author Claus Stadler <cstadler@informatik.uni-leipzig.de>
*
* @param <T>
*/
public class MethodSignature<T>
{
private T returnType;
private List<T> paramTypes;
private T varArgType;
public MethodSignature(T returnType, List<T> paramTypes, T varArgType) {
super();
this.returnType = returnType;
this.paramTypes = paramTypes;
this.varArgType = varArgType;
}
public T getReturnType() {
return returnType;
}
public List<T> getParameterTypes() {
return paramTypes;
}
public T getVarArgType() {
return varArgType;
}
public boolean isVararg() {
//return isVararg;
return varArgType != null;
}
public static <T> MethodSignature<T> create(T returnType, List<T> parameterTypes, T varArgType) {
return new MethodSignature<T>(returnType, parameterTypes, varArgType);
}
/*
public static <T> MethodSignature<T> create(T returnType, T... parameterTypes) {
return new MethodSignature<T>(returnType, Arrays.asList(parameterTypes), null);
}
*/
// public static <T> MethodSignature<T> create(T returnType, boolean isVarArg, List<T> parameterTypes) {
// return new MethodSignature<T>(returnType, parameterTypes, varArgType);
// }
/**
*
* @param returnType
* @param isVarArg If true, the last paramType becomes the vararg type
* @param paramTypes
* @return
*/
public static <T> MethodSignature<T> create(boolean isVarArg, T returnType, T... paramTypes) {
T varArgType = null;
List<T> fixedArgTypes = Arrays.asList(paramTypes);
if(isVarArg) {
if(paramTypes.length == 0) {
throw new RuntimeException("Need a type for varArgs");
}
int lastIndex = paramTypes.length - 1;
varArgType = paramTypes[lastIndex];
fixedArgTypes = fixedArgTypes.subList(0, lastIndex);
}
MethodSignature<T> result = create(returnType, fixedArgTypes, varArgType);
return result;
//return new MethodSignature<T>(returnType, fixedArgTypes, varArgType);
}
@Override
public String toString() {
return "MethodSignature [returnType=" + returnType + ", paramTypes="
+ paramTypes + ", varArgType=" + varArgType + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((paramTypes == null) ? 0 : paramTypes.hashCode());
result = prime * result
+ ((returnType == null) ? 0 : returnType.hashCode());
result = prime * result
+ ((varArgType == null) ? 0 : varArgType.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MethodSignature<?> other = (MethodSignature<?>) obj;
if (paramTypes == null) {
if (other.paramTypes != null)
return false;
} else if (!paramTypes.equals(other.paramTypes))
return false;
if (returnType == null) {
if (other.returnType != null)
return false;
} else if (!returnType.equals(other.returnType))
return false;
if (varArgType == null) {
if (other.varArgType != null)
return false;
} else if (!varArgType.equals(other.varArgType))
return false;
return true;
}
}