1 package org.simantics.scl.compiler.elaboration.modules;
3 import java.util.ArrayList;
5 import org.cojen.classfile.TypeDesc;
6 import org.simantics.scl.compiler.constants.Constant;
7 import org.simantics.scl.compiler.constants.JavaTypeClassSuper;
8 import org.simantics.scl.compiler.elaboration.fundeps.Fundep;
9 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
10 import org.simantics.scl.compiler.types.TCon;
11 import org.simantics.scl.compiler.types.TPred;
12 import org.simantics.scl.compiler.types.TVar;
13 import org.simantics.scl.compiler.types.Type;
14 import org.simantics.scl.compiler.types.Types;
15 import org.simantics.scl.compiler.types.kinds.Kinds;
17 import gnu.trove.map.hash.THashMap;
19 public class TypeClass extends TypeConstructor {
20 public final TPred[] context;
21 public final TCon name;
22 public final String javaName;
23 public final TVar[] parameters;
24 public final Fundep[] fundeps;
25 public final TPred class_;
26 public final ArrayList<String> methodNames = new ArrayList<String>();
27 public final THashMap<String, TypeClassMethod> methods =
28 new THashMap<String, TypeClassMethod>();
29 public final Constant[] superGenerators;
30 public final TypeDesc typeDesc;
32 public String documentation;
34 public TypeClass(long loc, TPred[] context, TCon name, String javaName, TVar[] parameters,
38 this.context = context;
40 this.javaName = javaName;
41 this.parameters = parameters;
42 this.fundeps = fundeps;
43 //this.typeDesc = TypeDesc.forClass(new JavaNamingPolicy(name.module).getTypeClassInterfaceName(name));
44 this.typeDesc = TypeDesc.forClass(javaName);
45 this.class_ = Types.pred(name, parameters);
46 this.superGenerators = new Constant[context.length];
47 for(int i=0;i<context.length;++i)
48 superGenerators[i] = new JavaTypeClassSuper(i, javaName, "super" + i, context[i], class_);
52 public void toString(final StringBuilder b) {
53 final TypeUnparsingContext tuc = new TypeUnparsingContext();
55 for(int i=0;i<context.length;++i) {
58 context[i].toString(tuc);
62 b.append(class_.toString(tuc));
64 methods.forEachValue(new TObjectProcedure<TypeClassMethod>() {
66 public boolean execute(TypeClassMethod method) {
68 b.append(method.name);
70 b.append(method.baseType.toString(tuc));
79 public TypeDesc construct(JavaTypeTranslator translator, Type[] parameters) {
83 public void setDocumentation(String documentation) {
84 this.documentation = documentation;