]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / modules / TypeClass.java
1 package org.simantics.scl.compiler.elaboration.modules;
2
3 import java.util.ArrayList;
4
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;
16
17 import gnu.trove.map.hash.THashMap;
18
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;
31     long locatable;
32     public String documentation;
33     
34     public TypeClass(long loc, TPred[] context, TCon name, String javaName, TVar[] parameters,
35             Fundep[] fundeps) {
36         super(Kinds.STAR);
37         this.locatable = loc;
38         this.context = context;        
39         this.name = name;
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_);
49     }
50
51     /*
52     public void toString(final StringBuilder b) {
53         final TypeUnparsingContext tuc = new TypeUnparsingContext();
54         b.append("class (");
55         for(int i=0;i<context.length;++i) {
56             if(i>0)
57                 b.append(", ");
58             context[i].toString(tuc);
59             b.append(context[i]);
60         }
61         b.append(") => ");
62         b.append(class_.toString(tuc));
63         b.append(" where\n");
64         methods.forEachValue(new TObjectProcedure<TypeClassMethod>() {            
65             @Override
66             public boolean execute(TypeClassMethod method) {
67                 b.append("    ");
68                 b.append(method.name);
69                 b.append(" :: ");
70                 b.append(method.baseType.toString(tuc));
71                 b.append('\n');
72                 return true;
73             }
74         });
75     }
76     */
77     
78     @Override
79     public TypeDesc construct(JavaTypeTranslator translator, Type[] parameters) {
80         return typeDesc;
81     }
82
83     public void setDocumentation(String documentation) {
84         this.documentation = documentation;
85     }
86 }