]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java
Added missing parts from SVN org.simantics.root project.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / types / TVar.java
1 package org.simantics.scl.compiler.types;
2
3 import gnu.trove.map.hash.THashMap;
4 import gnu.trove.map.hash.TObjectIntHashMap;
5 import gnu.trove.set.hash.THashSet;
6
7 import java.util.ArrayList;
8
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;
19
20
21 public class TVar extends Type {
22     public static final TVar[] EMPTY_ARRAY = new TVar[0];
23     
24     private Kind kind;
25     
26     TVar(Kind kind) {
27         this.kind = kind;
28     }
29     
30     public Kind getKind() {
31         if(kind instanceof KMetaVar)
32             kind = Kinds.canonical(kind);
33         return kind;
34     }
35
36     @Override
37     public Type replace(TVar var, Type replacement) {
38         if(this == var)
39             return replacement;
40         else
41             return this;
42     }
43
44     @Override
45     public TypeAst toTypeAst(TypeUnparsingContext context) {
46         return new TVarAst(context.getName(this));
47     }
48     
49     @Override
50     public boolean equals(Object obj) {
51         while(obj instanceof TMetaVar) {
52             TMetaVar metaVar = (TMetaVar)obj;
53             if(metaVar.ref == null)
54                 return false;
55             else
56                 obj = metaVar.ref;
57         }
58         return this == obj;
59     }
60     
61     @Override
62     public int hashCode() {
63         return System.identityHashCode(this);
64     }
65     
66     @Override
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));
71         else
72             context.append(System.identityHashCode(this));
73     }
74
75     @Override
76     public void collectFreeVars(ArrayList<TVar> vars) {
77         if(!vars.contains(this))
78             vars.add(this);
79     }
80     
81     @Override
82     public void collectMetaVars(ArrayList<TMetaVar> vars) {
83     }
84     
85     @Override
86     public void collectMetaVars(THashSet<TMetaVar> vars) {
87     }
88     
89     @Override
90     public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
91     }
92
93     @Override
94     public boolean isGround() {
95         return false;
96     }
97
98         public Kind inferKind(Environment context) throws KindUnificationException {
99             if(kind == null)
100                 kind = Kinds.metaVar();
101         return kind;
102     }
103
104     @Override
105     public boolean containsMetaVars() {
106         return false;
107     }
108
109     @Override
110     public void toName(TypeUnparsingContext context, StringBuilder b) {
111         b.append(context.getName(this));
112     }
113     
114     @Override
115     public int getClassId() {
116         return VAR_ID;
117     }
118     
119     @Override
120     public boolean contains(TMetaVar other) {
121         return false;
122     }
123
124     @Override
125     public Type convertMetaVarsToVars() {
126         return this;
127     }
128
129     @Override
130     public void addPolarity(Polarity polarity) {
131     }
132
133     @Override
134     public Type head() {
135         return this;
136     }
137
138     @Override
139     public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
140         return this;
141     }
142 }