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 abstract class AbstractCollectionInfo extends AbstractTypeInfo { public static final String ITE_VAR_NAME_PREFIX = "i"; public static final String SIZE__METHOD = "size"; public AbstractCollectionInfo(boolean optional) { super(optional); } @Override public List<LeafTypeInfo> getLeafTypesRecursively() { return new LinkedList<>(); } abstract public String consElementCheck(String enclosingClass, String javaRootPackage, String arg, NameGen nameGen, String iteVar); abstract public String consCollectionCheck(String arg); @Override public String consCheckExp(String enclosingClass, String javaRootPackage, String arg, NameGen nameGen) { String isColCheck = consCollectionCheck(arg); String sizeCall = consSubjectCheck(V2J.class.getSimpleName(), SIZE__METHOD, arg); String iteVar = nameGen.getName(ITE_VAR_NAME_PREFIX); String elementCheck = consElementCheck(enclosingClass, javaRootPackage, arg, nameGen, iteVar); StringBuilder sb = new StringBuilder(); sb.append(isColCheck); sb.append(JmlGenerator.JML_AND); sb.append('('); sb.append(String.format("\\forall int %1$s; 0 <= %1$s && %1$s < ", iteVar)); sb.append(sizeCall); sb.append("; "); sb.append(elementCheck); sb.append(')'); String seqCheckExp = "(" + sb.toString() + ")"; if (isOptional()) { return "(" + consIsNullCheck(arg) + JmlGenerator.JML_OR + seqCheckExp + ")"; } else { return seqCheckExp; } } }