-package org.simantics.scl.compiler.elaboration.modules;\r
-\r
-import java.util.ArrayList;\r
-\r
-import org.cojen.classfile.TypeDesc;\r
-import org.simantics.scl.compiler.common.datatypes.Constructor;\r
-import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;\r
-import org.simantics.scl.compiler.types.TCon;\r
-import org.simantics.scl.compiler.types.TVar;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
-import org.simantics.scl.compiler.types.kinds.KArrow;\r
-import org.simantics.scl.compiler.types.kinds.Kind;\r
-import org.simantics.scl.compiler.types.kinds.Kinds;\r
-\r
-public abstract class TypeConstructor extends TypeDescriptor {\r
- public Kind kind;\r
- \r
- public TVar[] parameters;\r
- public Type type;\r
- \r
- public Constructor[] constructors = Constructor.EMPTY_ARRAY;\r
- public String documentation;\r
- \r
- /**\r
- * A data type is open if it can be constructed without\r
- * constructors listed above.\r
- */\r
- public boolean isOpen = true;\r
- \r
- public TypeConstructor(Kind kind) {\r
- super(null);\r
- this.kind = kind;\r
- }\r
- \r
- public TypeConstructor(TCon name, Kind kind) {\r
- super(name);\r
- this.kind = kind;\r
- \r
- ArrayList<TVar> vars = new ArrayList<TVar>(2);\r
- for(Kind cur = kind; cur instanceof KArrow;) {\r
- KArrow arrow = (KArrow)cur;\r
- vars.add(Types.var(arrow.domain));\r
- cur = arrow.range;\r
- }\r
- this.parameters = vars.toArray(new TVar[vars.size()]);\r
- this.type = Types.apply(name, parameters);\r
- }\r
- \r
- public TypeConstructor(TCon name, TVar ... parameters) {\r
- super(name);\r
- setType(name, parameters);\r
- Kind kind = Kinds.STAR;\r
- for(int i = parameters.length-1;i>=0;--i)\r
- kind = Kinds.arrow(parameters[i].getKind(), kind);\r
- this.kind = kind;\r
- }\r
- \r
- public void setType(TCon name, TVar ... parameters) {\r
- this.name = name;\r
- this.parameters = parameters;\r
- this.type = Types.apply(name, parameters);\r
- }\r
- \r
- public void setConstructors(Constructor ... constructors) {\r
- this.constructors = constructors;\r
- }\r
-\r
- public abstract TypeDesc construct(JavaTypeTranslator translator, Type[] parameters);\r
-\r
- @Override\r
- public void setDocumentation(String documentation) {\r
- this.documentation = documentation;\r
- }\r
- \r
- @Override\r
- public Kind getKind() {\r
- return kind;\r
- }\r
- \r
- @Override\r
- public String getDocumentation() {\r
- return documentation;\r
- }\r
-}\r
+package org.simantics.scl.compiler.elaboration.modules;
+
+import java.util.ArrayList;
+
+import org.cojen.classfile.TypeDesc;
+import org.simantics.scl.compiler.common.datatypes.Constructor;
+import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
+import org.simantics.scl.compiler.types.TCon;
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.kinds.KArrow;
+import org.simantics.scl.compiler.types.kinds.Kind;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+
+public abstract class TypeConstructor extends TypeDescriptor {
+ public Kind kind;
+
+ public TVar[] parameters;
+ public Type type;
+
+ public Constructor[] constructors = Constructor.EMPTY_ARRAY;
+ public String documentation;
+
+ /**
+ * A data type is open if it can be constructed without
+ * constructors listed above.
+ */
+ public boolean isOpen = true;
+
+ public TypeConstructor(Kind kind) {
+ super(null);
+ this.kind = kind;
+ }
+
+ public TypeConstructor(TCon name, Kind kind) {
+ super(name);
+ this.kind = kind;
+
+ ArrayList<TVar> vars = new ArrayList<TVar>(2);
+ for(Kind cur = kind; cur instanceof KArrow;) {
+ KArrow arrow = (KArrow)cur;
+ vars.add(Types.var(arrow.domain));
+ cur = arrow.range;
+ }
+ this.parameters = vars.toArray(new TVar[vars.size()]);
+ this.type = Types.apply(name, parameters);
+ }
+
+ public TypeConstructor(TCon name, TVar ... parameters) {
+ super(name);
+ setType(name, parameters);
+ Kind kind = Kinds.STAR;
+ for(int i = parameters.length-1;i>=0;--i)
+ kind = Kinds.arrow(parameters[i].getKind(), kind);
+ this.kind = kind;
+ }
+
+ public void setType(TCon name, TVar ... parameters) {
+ this.name = name;
+ this.parameters = parameters;
+ this.type = Types.apply(name, parameters);
+ }
+
+ public void setConstructors(Constructor ... constructors) {
+ this.constructors = constructors;
+ }
+
+ public abstract TypeDesc construct(JavaTypeTranslator translator, Type[] parameters);
+
+ @Override
+ public void setDocumentation(String documentation) {
+ this.documentation = documentation;
+ }
+
+ @Override
+ public Kind getKind() {
+ return kind;
+ }
+
+ @Override
+ public String getDocumentation() {
+ return documentation;
+ }
+}