package org.python.pydev.parser.visitors;
import org.python.pydev.core.ITypeInfo;
import org.python.pydev.core.UnpackInfo;
import org.python.pydev.parser.jython.ast.ExtSlice;
import org.python.pydev.parser.jython.ast.Index;
import org.python.pydev.parser.jython.ast.Subscript;
import org.python.pydev.parser.jython.ast.exprType;
import org.python.pydev.parser.jython.ast.sliceType;
public class TypeInfo implements ITypeInfo {
private final String rep;
private final exprType expr;
/**
* Used when the info comes from a docstring.
*/
public TypeInfo(String rep) {
this.rep = rep;
this.expr = null;
}
/**
* Used when the info comes from typing with actual types.
*/
public TypeInfo(exprType expr) {
this.expr = expr;
this.rep = NodeUtils.getFullRepresentationString(expr);
}
/* (non-Javadoc)
* @see org.python.pydev.core.ITypeInfo#getActTok()
*/
@Override
public String getActTok() {
return rep;
}
/* (non-Javadoc)
* @see org.python.pydev.core.ITypeInfo#getPackedType()
*/
@Override
public TypeInfo getPackedType() {
return new TypeInfo(NodeUtils.getPackedTypeFromDocstring(rep));
}
@Override
public ITypeInfo getUnpacked(UnpackInfo unpackInfo) {
if (expr != null) {
if (expr instanceof Subscript) {
Subscript subscript = (Subscript) expr;
// ExtSlice is something as Dict[int, str]
if (subscript.slice instanceof ExtSlice) {
ExtSlice extSlice = (ExtSlice) subscript.slice;
if (extSlice.dims != null) {
int i = unpackInfo.getUnpackTuple(extSlice.dims.length);
if (i >= 0 && i < extSlice.dims.length) {
sliceType sliceType = extSlice.dims[i];
if (sliceType instanceof Index) {
Index index = (Index) sliceType;
exprType valExpr = index.value;
if (valExpr != null) {
return new TypeInfo(valExpr);
}
}
}
}
} else if (subscript.slice instanceof Index) {
// This is something as: List[str]
// As we have only a single entry, it doesn't matter which index
// is accessed!
Index index = (Index) subscript.slice;
exprType valExpr = index.value;
if (valExpr != null) {
return new TypeInfo(valExpr);
}
}
}
}
return new TypeInfo(NodeUtils.getUnpackedTypeFromTypeDocstring(rep, unpackInfo));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((rep == null) ? 0 : rep.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;
}
TypeInfo other = (TypeInfo) obj;
if (rep == null) {
if (other.rep != null) {
return false;
}
} else if (!rep.equals(other.rep)) {
return false;
}
return true;
}
}