]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/JavaTypeClassMethod.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / JavaTypeClassMethod.java
1 package org.simantics.scl.compiler.constants;
2
3 import java.util.Arrays;
4
5 import org.simantics.scl.compiler.elaboration.modules.MethodImplementation;
6 import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;
7 import org.simantics.scl.compiler.elaboration.modules.TypeClassMethod;
8 import org.simantics.scl.compiler.internal.codegen.references.IVal;
9 import org.simantics.scl.compiler.internal.codegen.references.Val;
10 import org.simantics.scl.compiler.internal.codegen.references.ValRef;
11 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
12 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
13 import org.simantics.scl.compiler.types.Type;
14 import org.simantics.scl.compiler.types.Types;
15
16 public class JavaTypeClassMethod extends JavaMethod {
17
18     TypeClassMethod method;
19     
20     public JavaTypeClassMethod(TypeClassMethod method, String className, String methodName,
21             Type effect, Type returnType, Type[] parameterTypes) {
22         super(false, className, methodName, effect, returnType, parameterTypes);
23         this.method = method;
24     }
25
26     public TypeClassMethod getMethod() {
27         return method;
28     }
29     
30     public void inline(SSASimplificationContext context, LetApply apply) {
31         //ValRef evidenceRef = apply.getParameters()[0];
32         //inline(context, apply, evidenceRef.getBinding(), evidenceRef.getTypeParameters());
33         
34         ValRef classRef = apply.getParameters()[0];
35         Val class_ = classRef.getBinding();
36         if(class_ instanceof JavaTypeInstanceConstructor) {
37             JavaTypeInstanceConstructor constr = (JavaTypeInstanceConstructor)class_;
38             TypeClassInstance instance = constr.getInstance();
39             MethodImplementation impl = 
40                     instance.methodImplementations.get(method.getName());
41             if(!impl.isDefault) {
42                 apply.getParameters()[0].remove();
43                 apply.setParameters(Arrays.copyOfRange(apply.getParameters(), 1, apply.getParameters().length));
44                 ValRef oldFunction = apply.getFunction();
45                 Type[] typeParameters = oldFunction.getTypeParameters();
46                 
47                 IVal newValue = context.getEnvironment().getValue(impl.name).getValue();
48                 
49                 typeParameters = Arrays.copyOfRange(typeParameters, 
50                         instance.typeClass.parameters.length,
51                         typeParameters.length);
52                 typeParameters = Types.concat(classRef.getTypeParameters(), typeParameters);                
53                 apply.setFunction(newValue.createOccurrence(typeParameters));
54                 oldFunction.remove();
55                 context.markModified("simplify-method");
56             }
57         }
58     }
59     
60     /*private void inline(SSASimplificationContext context, LetApply apply, Val evidence, Type[] typeParameters) {
61         if(evidence instanceof JavaTypeInstanceConstructor) {
62             JavaTypeInstanceConstructor evidence_ = (JavaTypeInstanceConstructor)evidence;
63             evidence_.
64         }
65         else if(evidence instanceof BoundVar) {
66             BoundVarBinder parent = ((BoundVar)evidence).parent;
67             if(!(parent instanceof LetApply))
68                 return;
69             LetApply parentApply = (LetApply)apply;
70         }
71                 
72     }*/
73     
74 }