]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / modules / TypeClass.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java
new file mode 100755 (executable)
index 0000000..ef73ea6
--- /dev/null
@@ -0,0 +1,86 @@
+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