1 package org.simantics.scl.compiler.elaboration.modules;
3 import java.util.ArrayList;
5 import org.cojen.classfile.TypeDesc;
6 import org.simantics.scl.compiler.common.datatypes.Constructor;
7 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
8 import org.simantics.scl.compiler.types.TCon;
9 import org.simantics.scl.compiler.types.TVar;
10 import org.simantics.scl.compiler.types.Type;
11 import org.simantics.scl.compiler.types.Types;
12 import org.simantics.scl.compiler.types.kinds.KArrow;
13 import org.simantics.scl.compiler.types.kinds.Kind;
14 import org.simantics.scl.compiler.types.kinds.Kinds;
16 public abstract class TypeConstructor extends TypeDescriptor {
19 public TVar[] parameters;
22 public Constructor[] constructors = Constructor.EMPTY_ARRAY;
23 public String documentation;
26 * A data type is open if it can be constructed without
27 * constructors listed above.
29 public boolean isOpen = true;
31 public TypeConstructor(Kind kind) {
36 public TypeConstructor(TCon name, Kind kind) {
40 ArrayList<TVar> vars = new ArrayList<TVar>(2);
41 for(Kind cur = kind; cur instanceof KArrow;) {
42 KArrow arrow = (KArrow)cur;
43 vars.add(Types.var(arrow.domain));
46 this.parameters = vars.toArray(new TVar[vars.size()]);
47 this.type = Types.apply(name, parameters);
50 public TypeConstructor(TCon name, TVar ... parameters) {
52 setType(name, parameters);
53 Kind kind = Kinds.STAR;
54 for(int i = parameters.length-1;i>=0;--i)
55 kind = Kinds.arrow(parameters[i].getKind(), kind);
59 public void setType(TCon name, TVar ... parameters) {
61 this.parameters = parameters;
62 this.type = Types.apply(name, parameters);
65 public void setConstructors(Constructor ... constructors) {
66 this.constructors = constructors;
69 public abstract TypeDesc construct(JavaTypeTranslator translator, Type[] parameters);
72 public void setDocumentation(String documentation) {
73 this.documentation = documentation;
77 public Kind getKind() {
82 public String getDocumentation() {