package soottocfg.cfg.type;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import soottocfg.cfg.variable.ClassVariable;
import soottocfg.cfg.variable.Variable;
/**
* @author schaef
* @author rodykers
*
*/
public class ReferenceType extends Type {
public static final String RefFieldName = "$Ref";
public static final String TypeFieldName = "$Type";
private static final long serialVersionUID = 4056715121602313972L;
private final ClassVariable classVariable;
private final Map<String, Type> elementTypes;
public ReferenceType(ClassVariable var) {
classVariable = var;
elementTypes = new LinkedHashMap<String, Type>();
elementTypes.put(RefFieldName, IntType.instance() );
elementTypes.put(TypeFieldName, new TypeType());
if (classVariable != null) {
for (Variable finalField : classVariable.getFinalFields()) {
// TODO: don't look for final - look for all fields that
// are only written to once, and the rhs is a constant.
elementTypes.put(finalField.getName(), finalField.getType());
}
}
}
private static ReferenceType instance = new ReferenceType(null);
public static Type instance() {
return instance;
}
public ClassVariable getClassVariable() {
return classVariable;
}
public Map<String, Type> getElementTypes() {
return this.elementTypes;
}
public List<Type> getElementTypeList() {
return new LinkedList<Type>(this.elementTypes.values());
}
public String toString() {
if (classVariable == null) {
return "Null";
} else {
return classVariable.getName().replace('/', '.');
}
}
public boolean isNull() {
return (classVariable == null);
}
}