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;
8 import org.simantics.scl.compiler.environment.Environment;
9 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
10 import org.simantics.scl.compiler.internal.types.ast.TApplyAst;
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.Kind;
14 import org.simantics.scl.compiler.types.kinds.Kinds;
15 import org.simantics.scl.compiler.types.util.Polarity;
16 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
20 public class TPred extends Type {
22 public static final TPred[] EMPTY_ARRAY = new TPred[0];
24 public final TCon typeClass;
25 public final Type[] parameters;
27 TPred(TCon typeClass, Type ... parameters) {
29 if(typeClass == null || parameters == null)
30 throw new NullPointerException();
31 for(Type parameter : parameters)
33 throw new NullPointerException();
35 this.typeClass = typeClass;
36 this.parameters = parameters;
40 public TPred replace(TVar var, Type replacement) {
41 for(int i=0;i<parameters.length;++i) {
42 Type parameter = parameters[i];
43 Type newParameter = parameter.replace(var, replacement);
44 if(parameter != newParameter) {
45 Type[] newParameters = new Type[parameters.length];
47 newParameters[j] = parameters[j];
48 newParameters[i] = newParameter;
49 for(int j=i+1;j<parameters.length;++j)
50 newParameters[j] = parameters[j].replace(var, replacement);
51 return new TPred(typeClass, newParameters);
58 public TypeAst toTypeAst(TypeUnparsingContext context) {
59 TypeAst ast = typeClass.toTypeAst(context);
60 for(Type parameter : parameters)
61 ast = new TApplyAst(ast, parameter.toTypeAst(context));
66 public void updateHashCode(TypeHashCodeContext context) {
67 typeClass.updateHashCode(context);
68 for(Type parameter : parameters)
69 parameter.updateHashCode(context);
73 public void collectFreeVars(ArrayList<TVar> vars) {
74 for(Type parameter : parameters)
75 parameter.collectFreeVars(vars);
79 public void collectMetaVars(ArrayList<TMetaVar> vars) {
80 for(Type parameter : parameters)
81 parameter.collectMetaVars(vars);
85 public void collectMetaVars(THashSet<TMetaVar> vars) {
86 for(Type parameter : parameters)
87 parameter.collectMetaVars(vars);
91 public boolean contains(TMetaVar other) {
92 for(Type parameter : parameters)
93 if(parameter.contains(other))
99 public Type convertMetaVarsToVars() {
100 for(int i=0;i<parameters.length;++i) {
101 Type parameter = parameters[i];
102 Type temp = parameter.convertMetaVarsToVars();
103 if(temp != parameter) {
104 Type[] newParameters = new Type[parameters.length];
106 newParameters[j] = parameters[j];
107 newParameters[i] = temp;
108 for(int j=i+1;j<parameters.length;++j)
109 newParameters[j] = parameters[j].convertMetaVarsToVars();
110 return new TPred(typeClass, parameters);
117 public boolean isGround() {
118 for(Type parameter : parameters)
119 if(!parameter.isGround())
125 public Kind inferKind(Environment context) throws KindUnificationException {
130 public boolean containsMetaVars() {
131 for(Type parameter : parameters)
132 if(parameter.containsMetaVars())
138 public void toName(TypeUnparsingContext context, StringBuilder b) {
139 typeClass.toName(context, b);
140 for(Type parameter : parameters) {
142 parameter.toName(context, b);
147 public int getClassId() {
152 public void addPolarity(Polarity polarity) {
153 for(Type parameter : parameters)
154 parameter.addPolarity(Polarity.BIPOLAR);
158 public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
159 for(Type parameter : parameters)
160 parameter.collectEffectMetaVars(vars);
165 throw new UnsupportedOperationException();
169 public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
170 Type[] newParameters = new Type[parameters.length];
171 for(int i=0;i<parameters.length;++i)
172 newParameters[i] = parameters[i].copySkeleton(metaVarMap);
173 return new TPred(typeClass, parameters);