--- /dev/null
+package org.simantics.scl.compiler.elaboration.modules;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.cojen.classfile.TypeDesc;\r
+import org.simantics.scl.compiler.constants.Constant;\r
+import org.simantics.scl.compiler.constants.JavaTypeClassSuper;\r
+import org.simantics.scl.compiler.elaboration.fundeps.Fundep;\r
+import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;\r
+import org.simantics.scl.compiler.types.TCon;\r
+import org.simantics.scl.compiler.types.TPred;\r
+import org.simantics.scl.compiler.types.TVar;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+import org.simantics.scl.compiler.types.kinds.Kinds;\r
+\r
+public class TypeClass extends TypeConstructor {\r
+ public final TPred[] context;\r
+ public final TCon name;\r
+ public final String javaName;\r
+ public final TVar[] parameters;\r
+ public final Fundep[] fundeps;\r
+ public final TPred class_; \r
+ public final ArrayList<String> methodNames = new ArrayList<String>(); \r
+ public final THashMap<String, TypeClassMethod> methods = \r
+ new THashMap<String, TypeClassMethod>();\r
+ public final Constant[] superGenerators;\r
+ public final TypeDesc typeDesc;\r
+ long locatable;\r
+ public String documentation;\r
+ \r
+ public TypeClass(long loc, TPred[] context, TCon name, String javaName, TVar[] parameters,\r
+ Fundep[] fundeps) {\r
+ super(Kinds.STAR);\r
+ this.locatable = loc;\r
+ this.context = context; \r
+ this.name = name;\r
+ this.javaName = javaName;\r
+ this.parameters = parameters;\r
+ this.fundeps = fundeps;\r
+ //this.typeDesc = TypeDesc.forClass(new JavaNamingPolicy(name.module).getTypeClassInterfaceName(name));\r
+ this.typeDesc = TypeDesc.forClass(javaName);\r
+ this.class_ = Types.pred(name, parameters);\r
+ this.superGenerators = new Constant[context.length];\r
+ for(int i=0;i<context.length;++i)\r
+ superGenerators[i] = new JavaTypeClassSuper(i, javaName, "super" + i, context[i], class_);\r
+ }\r
+\r
+ /*\r
+ public void toString(final StringBuilder b) {\r
+ final TypeUnparsingContext tuc = new TypeUnparsingContext();\r
+ b.append("class (");\r
+ for(int i=0;i<context.length;++i) {\r
+ if(i>0)\r
+ b.append(", ");\r
+ context[i].toString(tuc);\r
+ b.append(context[i]);\r
+ }\r
+ b.append(") => ");\r
+ b.append(class_.toString(tuc));\r
+ b.append(" where\n");\r
+ methods.forEachValue(new TObjectProcedure<TypeClassMethod>() { \r
+ @Override\r
+ public boolean execute(TypeClassMethod method) {\r
+ b.append(" ");\r
+ b.append(method.name);\r
+ b.append(" :: ");\r
+ b.append(method.baseType.toString(tuc));\r
+ b.append('\n');\r
+ return true;\r
+ }\r
+ });\r
+ }\r
+ */\r
+ \r
+ @Override\r
+ public TypeDesc construct(JavaTypeTranslator translator, Type[] parameters) {\r
+ return typeDesc;\r
+ }\r
+\r
+ public void setDocumentation(String documentation) {\r
+ this.documentation = documentation;\r
+ }\r
+}\r