]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeConstructor.java
Merge "Ensure GetElementClassRequest is not constructed without elementFactory"
[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;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 import org.cojen.classfile.TypeDesc;\r
6 import org.simantics.scl.compiler.common.datatypes.Constructor;\r
7 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;\r
8 import org.simantics.scl.compiler.types.TCon;\r
9 import org.simantics.scl.compiler.types.TVar;\r
10 import org.simantics.scl.compiler.types.Type;\r
11 import org.simantics.scl.compiler.types.Types;\r
12 import org.simantics.scl.compiler.types.kinds.KArrow;\r
13 import org.simantics.scl.compiler.types.kinds.Kind;\r
14 import org.simantics.scl.compiler.types.kinds.Kinds;\r
15 \r
16 public abstract class TypeConstructor extends TypeDescriptor {\r
17     public Kind kind;\r
18     \r
19     public TVar[] parameters;\r
20     public Type type;\r
21     \r
22     public Constructor[] constructors = Constructor.EMPTY_ARRAY;\r
23     public String documentation;\r
24     \r
25     /**\r
26      * A data type is open if it can be constructed without\r
27      * constructors listed above.\r
28      */\r
29     public boolean isOpen = true;\r
30     \r
31     public TypeConstructor(Kind kind) {\r
32         super(null);\r
33         this.kind = kind;\r
34     }\r
35     \r
36     public TypeConstructor(TCon name, Kind kind) {\r
37         super(name);\r
38         this.kind = kind;\r
39         \r
40         ArrayList<TVar> vars = new ArrayList<TVar>(2);\r
41         for(Kind cur = kind; cur instanceof KArrow;) {\r
42             KArrow arrow = (KArrow)cur;\r
43             vars.add(Types.var(arrow.domain));\r
44             cur = arrow.range;\r
45         }\r
46         this.parameters = vars.toArray(new TVar[vars.size()]);\r
47         this.type = Types.apply(name, parameters);\r
48     }\r
49     \r
50     public TypeConstructor(TCon name, TVar ... parameters) {\r
51         super(name);\r
52         setType(name, parameters);\r
53         Kind kind = Kinds.STAR;\r
54         for(int i = parameters.length-1;i>=0;--i)\r
55             kind = Kinds.arrow(parameters[i].getKind(), kind);\r
56         this.kind = kind;\r
57     }\r
58     \r
59     public void setType(TCon name, TVar ... parameters) {\r
60         this.name = name;\r
61         this.parameters = parameters;\r
62         this.type = Types.apply(name, parameters);\r
63     }\r
64         \r
65     public void setConstructors(Constructor ... constructors) {\r
66         this.constructors = constructors;\r
67     }\r
68 \r
69     public abstract TypeDesc construct(JavaTypeTranslator translator, Type[] parameters);\r
70 \r
71     @Override\r
72     public void setDocumentation(String documentation) {\r
73         this.documentation = documentation;\r
74     }\r
75     \r
76     @Override\r
77     public Kind getKind() {\r
78         return kind;\r
79     }\r
80     \r
81     @Override\r
82     public String getDocumentation() {\r
83         return documentation;\r
84     }\r
85 }\r