/*
* Copyright 2013. Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.java.classinfo;
import gw.lang.parser.TypeVarToTypeMap;
import gw.lang.reflect.IErrorType;
import gw.lang.reflect.IType;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.java.IJavaClassParameterizedType;
import gw.lang.reflect.java.IJavaClassType;
import gw.lang.reflect.module.IModule;
public class JavaParameterizedType implements IJavaClassParameterizedType {
private IJavaClassType[] _args;
private IJavaClassType _rawType;
public JavaParameterizedType( IJavaClassType[] args, IJavaClassType rawType ) {
if (rawType == null) {
throw new RuntimeException("Raw type of a parameterized type cannot be null");
}
for (IJavaClassType arg : args) {
if (arg == null) {
throw new RuntimeException("Arg type of a parameterized type cannot be null");
}
}
this._args = args;
this._rawType = rawType;
}
@Override
public IJavaClassType[] getActualTypeArguments() {
return _args;
}
@Override
public IType getActualType(TypeVarToTypeMap typeMap) {
return getActualType(typeMap, false);
}
@Override
public IType getActualType(TypeVarToTypeMap typeMap, boolean bKeepTypeVars) {
IType[] args = new IType[_args.length];
for (int i = 0; i < _args.length; i++) {
if (_args[i] != null) {
// TypeSystem.pushModule(_args[i].getModule());
// try {
args[i] = _args[i].getActualType(typeMap, bKeepTypeVars);
// } finally {
// TypeSystem.popModule(_args[i].getModule());
// }
} else {
args[i] = TypeSystem.getErrorType();
}
}
IType actualType = _rawType.getActualType(typeMap);
return actualType instanceof IErrorType ? actualType : actualType.getParameterizedType(args);
}
@Override
public IJavaClassType getConcreteType() {
return _rawType;
}
@Override
public String getName() {
String name = _rawType.getName() + "<";
for (int i = 0; i < _args.length; i++) {
IJavaClassType type = _args[i];
name += type.getName();
if (i < _args.length - 1) {
name += ",";
}
}
name += ">";
return name;
}
@Override
public String getSimpleName() {
return getName();
}
@Override
public IModule getModule() {
return _rawType.getModule();
}
@Override
public String getNamespace() {
return _rawType.getNamespace();
}
public String toString() {
String s = _rawType.getName() + "<";
for (int i = 0; i < _args.length; i++) {
s += _args[i].getName();
if (i != _args.length - 1) {
s += ", ";
}
}
return s + ">";
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof JavaParameterizedType)) {
return false;
}
JavaParameterizedType t1 = this;
JavaParameterizedType t2 = (JavaParameterizedType) obj;
if (!t1._rawType.equals(t2._rawType)) {
return false;
}
if (t1._args.length != t2._args.length) {
return false;
}
for (int i = 0; i < t1._args.length; i++) {
if (!t1._args[i].equals(t2._args[i])) {
return false;
}
}
return true;
}
@Override
public int hashCode() {
return super.hashCode();
}
}