1 package org.simantics.scl.compiler.types;
3 import gnu.trove.map.hash.THashMap;
4 import gnu.trove.set.hash.THashSet;
6 import java.util.ArrayList;
9 import org.simantics.scl.compiler.environment.Environment;
10 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
11 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
12 import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
13 import org.simantics.scl.compiler.types.kinds.KMetaVar;
14 import org.simantics.scl.compiler.types.kinds.Kind;
15 import org.simantics.scl.compiler.types.kinds.Kinds;
16 import org.simantics.scl.compiler.types.util.Polarity;
17 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
22 * This class represents the types of variables and constants in SCL.
23 * It is not meant to be extended outside of this package.
25 * @author Hannu Niemistö
27 public abstract class Type {
29 public static final boolean NULL_CHECKS = true;
30 public static final Type[] EMPTY_ARRAY = new Type[0];
32 public static final int FUN_ID = 0;
33 public static final int APPLY_ID = 1;
34 public static final int CON_ID = 2;
35 public static final int FORALL_ID = 3;
36 public static final int PRED_ID = 4;
37 public static final int METAVAR_ID = 5;
38 public static final int VAR_ID = 6;
39 public static final int UNION_ID = 7;
40 public static final int ALIAS_ID = 8;
44 * This class is not meant to be extended outside of this package.
50 * Recursively replace a type variable with a type in this type expression.
51 * @param var A type variable to be replaced
52 * @param replacement A the replacement type
53 * @return A new type instance, or this, if no changes are necessary
55 public abstract Type replace(TVar var, Type replacement);
57 public Type replace(TVar[] var, Type[] replacement) {
59 for(int i=0;i<var.length;++i)
60 cur = cur.replace(var[i], replacement[i]);
64 public <T extends Type> Type replace(THashMap<TVar, T> substitution) {
66 for(Map.Entry<TVar, T> entry : substitution.entrySet())
67 cur = cur.replace(entry.getKey(), entry.getValue());
71 abstract TypeAst toTypeAst(TypeUnparsingContext context);
74 public String toString() {
75 return toString(new TypeUnparsingContext());
78 public String toString(TypeUnparsingContext context) {
79 return toTypeAst(context).toString();
82 public void toString(TypeUnparsingContext context, StringBuilder b) {
83 toTypeAst(context).toString(b);
86 public void toString(TypeUnparsingContext context, StringBuilder b, int precedence) {
87 toTypeAst(context).toString(b, precedence);
90 public String toName() {
91 TypeUnparsingContext context = new TypeUnparsingContext();
92 StringBuilder b = new StringBuilder();
97 public abstract void toName(TypeUnparsingContext context, StringBuilder b);
100 public boolean equals(Object obj) {
103 if(obj == null || !(obj instanceof Type))
105 return Types.equals(this, (Type)obj);
109 public int hashCode() {
110 TypeHashCodeContext context = new TypeHashCodeContext();
111 updateHashCode(context);
112 return context.getResult();
115 public abstract void updateHashCode(TypeHashCodeContext context);
117 public abstract void collectFreeVars(ArrayList<TVar> vars);
119 public abstract void collectMetaVars(ArrayList<TMetaVar> vars);
120 public abstract void collectMetaVars(THashSet<TMetaVar> vars);
121 public abstract void collectEffectMetaVars(ArrayList<TMetaVar> vars);
123 public abstract boolean contains(TMetaVar other);
125 public abstract Type convertMetaVarsToVars();
127 public abstract boolean isGround();
129 public Kind inferKind(Environment context) throws KindUnificationException {
130 KMetaVar var = Kinds.metaVar();
131 checkKind(context, var);
132 return Kinds.canonical(var);
135 public void checkKind(Environment context, Kind requiredKind) throws KindUnificationException {
136 Kind kind = inferKind(context);
137 Kinds.unify(kind, requiredKind);
140 public abstract boolean containsMetaVars();
142 public abstract int getClassId();
144 public boolean isMinimal() {
148 public boolean isMaximal() {
152 public abstract void addPolarity(Polarity polarity);
154 public void collectConcreteEffects(ArrayList<TCon> concreteEffects) {
157 public abstract Type head();
160 * Creates an independent copy of the type, but replaces all effects by metavars
162 public abstract Type copySkeleton(THashMap<TMetaVar,TMetaVar> metaVarMap);