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.codegen.utils.NameMangling;
10 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
11 import org.simantics.scl.compiler.internal.types.ast.TConAst;
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.util.Polarity;
16 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
19 * This class represents an SCL type constant with a name given in a module.
21 public class TCon extends Type {
22 public final String module;
23 public final String name;
25 TCon(String module, String name) {
27 if(module == null || name == null)
28 throw new NullPointerException();
35 public TCon replace(TVar var, Type replacement) {
36 // Constants don't include type variables
41 public TypeAst toTypeAst(TypeUnparsingContext context) {
42 if(module == Types.BUILTIN) {
43 char c = name.charAt(0);
44 if(Character.isLetter(c) || c == '(' || name.equals("[]"))
45 return new TConAst(name);
47 return new TConAst("(" + name + ")");
50 return new TConAst(name.length() <= 1 ? simplifiedModuleName(module) + "." + name : name);
53 private static String simplifiedModuleName(String name) {
54 int p = name.lastIndexOf('/');
58 return name.substring(p+1);
62 public boolean equals(Object obj) {
63 while(obj instanceof TMetaVar) {
64 TMetaVar metaVar = (TMetaVar)obj;
65 if(metaVar.ref == null)
74 public int hashCode() {
75 return System.identityHashCode(this);
79 public void updateHashCode(TypeHashCodeContext context) {
80 context.append(System.identityHashCode(this));
84 public void collectFreeVars(ArrayList<TVar> vars) {
88 public void collectMetaVars(ArrayList<TMetaVar> vars) {
92 public void collectMetaVars(THashSet<TMetaVar> vars) {
96 public void collectEffectMetaVars(ArrayList<TMetaVar> vars) {
100 public boolean isGround() {
104 public Kind inferKind(Environment context) throws KindUnificationException {
105 return context.getTypeConstructor(this).kind;
109 public boolean containsMetaVars() {
114 public void toName(TypeUnparsingContext context, StringBuilder b) {
115 b.append(NameMangling.mangle(name));
119 public int getClassId() {
124 public boolean contains(TMetaVar other) {
129 public Type convertMetaVarsToVars() {
134 public void addPolarity(Polarity polarity) {
138 public void collectConcreteEffects(ArrayList<TCon> concreteEffects) {
139 concreteEffects.add(this);
148 public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {