package org.overture.codegen.vdm2jml.predgen.info;
import java.util.LinkedList;
import java.util.List;
import org.overture.codegen.vdm2jml.JmlGenerator;
import org.overture.codegen.vdm2jml.runtime.V2J;
import org.overture.codegen.vdm2jml.util.NameGen;
public class TupleInfo extends AbstractTypeInfo
{
public static final String IS_TUP_METHOD_NAME = "isTup";
public static final String GET_FIELD_METHOD_NAME = "field";
private List<AbstractTypeInfo> types;
public TupleInfo(boolean optional, List<AbstractTypeInfo> types)
{
super(optional);
this.types = types;
}
@Override
public List<LeafTypeInfo> getLeafTypesRecursively()
{
List<LeafTypeInfo> leaves = new LinkedList<>();
for (AbstractTypeInfo t : types)
{
leaves.addAll(t.getLeafTypesRecursively());
}
return leaves;
}
@Override
public String consCheckExp(String enclosingClass, String javaRootPackage,
String arg, NameGen nameGen)
{
StringBuilder sb = new StringBuilder();
int tupleSize = types.size();
// e.g. V2J.isTup(t)
sb.append(consSubjectCheckExtraArg(V2J.class.getSimpleName(), IS_TUP_METHOD_NAME, arg, tupleSize
+ ""));
for (int i = 0; i < types.size(); i++)
{
// e.g. V2J.field(t,2)
String fieldArg = consSubjectCheckExtraArg(V2J.class.getSimpleName(), GET_FIELD_METHOD_NAME, arg, i
+ "");
// e.g. Utils.is_nat1(V2J.field(t,2))
String fieldCheck = types.get(i).consCheckExp(enclosingClass, javaRootPackage, fieldArg, nameGen);
sb.append(JmlGenerator.JML_AND);
sb.append(fieldCheck);
}
String tupleCheck = "(" + sb.toString() + ")";
if (isOptional())
{
return "(" + consIsNullCheck(arg) + JmlGenerator.JML_OR + tupleCheck
+ ")";
} else
{
// e.g. (V2J.isTup(t) && Utils.is_nat1(V2J.field(t,1)) && Utils.is_bool(V2J.field(t,2)))
return tupleCheck;
}
}
}