return TypeFactory.getInstance().tupleType(kwTypes, kwLabels);
}
public void declareConstructor(Data x, Environment env) {
TypeFactory tf = TypeFactory.getInstance();
// needs to be done just in case the declaration came
// from a shell instead of from a module
Type adt = declareAbstractDataType(x.getUser(), env);
List<KeywordFormal> common = x.getCommonKeywordParameters().isPresent()
? x.getCommonKeywordParameters().getKeywordFormalList()
: Collections.<KeywordFormal>emptyList();
for (Variant var : x.getVariants()) {
String altName = Names.name(var.getName());
Type kwType = tf.voidType();
if (var.isNAryConstructor()) {
List<KeywordFormal> local = var.getKeywordArguments().hasKeywordFormalList() ? var.getKeywordArguments().getKeywordFormalList() : Collections.<KeywordFormal>emptyList();
List<KeywordFormal> kws = new ArrayList<>(common.size() + local.size());
if (var.getKeywordArguments().isDefault()) {
kws.addAll(common);
kws.addAll(local);
kwType = computeKeywordParametersType(kws, eval);
}
else if (!common.isEmpty()) {
kwType = computeKeywordParametersType(common, eval);
kws = common;
}
List<TypeArg> args = var.getArguments();
int nAllArgs = args.size();
Type[] fields = new Type[nAllArgs];
String[] labels = new String[nAllArgs];
for (int i = 0; i < args.size(); i++) {
TypeArg arg = args.get(i);
fields[i] = arg.getType().typeOf(env, true, eval);
if (fields[i] == null) {
throw new UndeclaredType(arg.hasName() ? Names.name(arg.getName()) : "?", arg);
}
if (arg.hasName()) {
labels[i] = Names.name(arg.getName());
} else {
labels[i] = "arg" + java.lang.Integer.toString(i);
}
}
Type children = tf.tupleType(fields, labels);
try {
ConstructorFunction cons = env.constructorFromTuple(var, eval, adt, altName, children, kwType, kws);
cons.setPublic(true); // TODO: implement declared visibility
} catch (org.eclipse.imp.pdb.facts.exceptions.RedeclaredConstructorException e) {