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.TVarAst;
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.KMetaVar;
15 import org.simantics.scl.compiler.types.kinds.Kind;
16 import org.simantics.scl.compiler.types.kinds.Kinds;
17 import org.simantics.scl.compiler.types.util.Polarity;
18 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
21 public class TVar extends Type {
22 public static final TVar[] EMPTY_ARRAY = new TVar[0];
30 public Kind getKind() {
31 if(kind instanceof KMetaVar)
32 kind = Kinds.canonical(kind);
37 public Type replace(TVar var, Type replacement) {
45 public TypeAst toTypeAst(TypeUnparsingContext context) {
46 return new TVarAst(context.getName(this));
50 public boolean equals(Object obj) {
51 while(obj instanceof TMetaVar) {
52 TMetaVar metaVar = (TMetaVar)obj;
53 if(metaVar.ref == null)
62 public int hashCode() {
63 return System.identityHashCode(this);
67 public void updateHashCode(TypeHashCodeContext context) {
68 TObjectIntHashMap<TVar> varHashCode = context.getVarHashCode();
69 if(varHashCode != null && varHashCode.containsKey(this))
70 context.append(varHashCode.get(this));
72 context.append(System.identityHashCode(this));
76 public void collectFreeVars(ArrayList<TVar> vars) {
77 if(!vars.contains(this))
82 public void collectMetaVars(ArrayList<TMetaVar> vars) {
86 public void collectMetaVars(THashSet<TMetaVar> vars) {
90 public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
94 public boolean isGround() {
98 public Kind inferKind(Environment context) throws KindUnificationException {
100 kind = Kinds.metaVar();
105 public boolean containsMetaVars() {
110 public void toName(TypeUnparsingContext context, StringBuilder b) {
111 b.append(context.getName(this));
115 public int getClassId() {
120 public boolean contains(TMetaVar other) {
125 public Type convertMetaVarsToVars() {
130 public void addPolarity(Polarity polarity) {
139 public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {