private void addConstructorDefinition(IConstructor result, Type type) {
IConstructor adt = (IConstructor) type.getAbstractDataType().accept(this);
IConstructor choice = definitions.get(adt);
ISetWriter alts = vf.setWriter();
if (choice != null) {
alts.insertAll((ISet) choice.get("alternatives"));
}
IListWriter w = vf.listWriter();
if (type.hasFieldNames()) {
for(int i = 0; i < type.getArity(); i++) {
w.append(vf.constructor(Factory.Symbol_Label, vf.string(type.getFieldName(i)), type.getFieldType(i).accept(this)));
}
}
else {
for (Type field : type.getFieldTypes()) {
w.append(field.accept(this));
}
}
IListWriter kwTypes = vf.listWriter();
IMapWriter kwDefaults = vf.mapWriter();
for (String key : type.getKeywordParameters()) {
kwTypes.insert(vf.constructor(Factory.Symbol_Label, vf.string(key), type.getKeywordParameterType(key).accept(this)));
}
alts.insert(vf.constructor(Factory.Production_Cons, vf.constructor(Factory.Symbol_Label, vf.string(type.getName()), adt), w.done(), kwTypes.done(), kwDefaults.done(), vf.set()));
choice = vf.constructor(Factory.Production_Choice, adt, alts.done());
definitions.put(adt, choice);
}