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.util.NameGen;
public class UnionInfo extends AbstractTypeInfo
{
private List<AbstractTypeInfo> types;
public UnionInfo(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 enclosingModule, String javaRootPackage,
String arg, NameGen nameGen)
{
StringBuilder sb = new StringBuilder();
sb.append('(');
String orSep = "";
if (isOptional())
{
sb.append(consIsNullCheck(arg));
orSep = JmlGenerator.JML_OR;
}
for (AbstractTypeInfo currentType : types)
{
sb.append(orSep);
sb.append(currentType.consCheckExp(enclosingModule, javaRootPackage, arg, nameGen));
orSep = JmlGenerator.JML_OR;
}
sb.append(')');
return sb.toString();
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append('(');
if (isOptional())
{
sb.append("[");
}
String sep = "";
for (AbstractTypeInfo t : types)
{
sb.append(sep);
sb.append(t.toString());
sep = "|";
}
if (isOptional())
{
sb.append("]");
}
sb.append(')');
return sb.toString();
}
}