]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeConstructor.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / modules / TypeConstructor.java
1 package org.simantics.scl.compiler.elaboration.modules;
2
3 import java.util.ArrayList;
4
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;
15
16 public abstract class TypeConstructor extends TypeDescriptor {
17     public Kind kind;
18     
19     public TVar[] parameters;
20     public Type type;
21     
22     public Constructor[] constructors = Constructor.EMPTY_ARRAY;
23     public String documentation;
24     
25     /**
26      * A data type is open if it can be constructed without
27      * constructors listed above.
28      */
29     public boolean isOpen = true;
30     
31     public TypeConstructor(Kind kind) {
32         super(null);
33         this.kind = kind;
34     }
35     
36     public TypeConstructor(TCon name, Kind kind) {
37         super(name);
38         this.kind = kind;
39         
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));
44             cur = arrow.range;
45         }
46         this.parameters = vars.toArray(new TVar[vars.size()]);
47         this.type = Types.apply(name, parameters);
48     }
49     
50     public TypeConstructor(TCon name, TVar ... parameters) {
51         super(name);
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);
56         this.kind = kind;
57     }
58     
59     public void setType(TCon name, TVar ... parameters) {
60         this.name = name;
61         this.parameters = parameters;
62         this.type = Types.apply(name, parameters);
63     }
64         
65     public void setConstructors(Constructor ... constructors) {
66         this.constructors = constructors;
67     }
68
69     public abstract TypeDesc construct(JavaTypeTranslator translator, Type[] parameters);
70
71     @Override
72     public void setDocumentation(String documentation) {
73         this.documentation = documentation;
74     }
75     
76     @Override
77     public Kind getKind() {
78         return kind;
79     }
80     
81     @Override
82     public String getDocumentation() {
83         return documentation;
84     }
85 }