1 package org.simantics.scl.compiler.types;
3 import gnu.trove.map.hash.THashMap;
4 import gnu.trove.map.hash.TObjectIntHashMap;
5 import gnu.trove.set.hash.THashSet;
7 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.TForAllAst;
12 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
13 import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
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;
20 public class TForAll extends Type {
21 public final TVar var;
22 public final Type type;
24 TForAll(TVar var, Type type) {
26 if(var == null || type == null)
27 throw new NullPointerException();
33 private TForAll create(Type type) {
37 return new TForAll(var, type);
41 public TForAll replace(TVar var, Type replacement) {
43 if(replacement instanceof TVar) {
44 return new TForAll((TVar)replacement, type.replace(var, replacement));
47 throw new IllegalStateException("Tried to replace a variable that is not free in the type.");
50 return create(type.replace(var, replacement));
54 public TypeAst toTypeAst(TypeUnparsingContext context) {
55 ArrayList<String> vars = new ArrayList<String>();
56 vars.add(context.getName(var));
57 Type cur = Types.canonical(type);
58 while(cur instanceof TForAll) {
59 TForAll forAll = (TForAll)cur;
60 vars.add(context.getName(forAll.var));
61 cur = Types.canonical(forAll.type);
63 return new TForAllAst(
64 vars.toArray(new String[vars.size()]),
65 cur.toTypeAst(context));
69 public void updateHashCode(TypeHashCodeContext context) {
70 context.append(TypeHashCodeContext.FORALL);
71 TObjectIntHashMap<TVar> varHashCode = context.createVarHashCode();
72 varHashCode.put(var, varHashCode.size());
73 type.updateHashCode(context);
74 varHashCode.remove(var);
78 public void collectFreeVars(ArrayList<TVar> vars) {
79 type.collectFreeVars(vars);
84 public void collectMetaVars(ArrayList<TMetaVar> vars) {
85 type.collectMetaVars(vars);
89 public void collectMetaVars(THashSet<TMetaVar> vars) {
90 type.collectMetaVars(vars);
94 public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
95 type.collectEffectMetaVars(vars);
99 public boolean contains(TMetaVar other) {
100 return type.contains(other);
104 public Type convertMetaVarsToVars() {
105 Type newType = type.convertMetaVarsToVars();
109 return new TForAll(var, type);
113 public boolean isGround() {
114 return false; // The method is usually not called for quantified types
115 // so it is unclear what it should do here.
118 public Kind inferKind(Environment context) throws KindUnificationException {
119 type.checkKind(context, Kinds.STAR);
124 public boolean containsMetaVars() {
125 return type.containsMetaVars();
129 public void toName(TypeUnparsingContext context, StringBuilder b) {
130 type.toName(context, b);
134 public int getClassId() {
139 public void addPolarity(Polarity polarity) {
140 type.addPolarity(polarity);
149 public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
150 // Should never get here
151 return new TMetaVar(Kinds.STAR);