1 package org.simantics.scl.compiler.constants;
3 import java.util.Arrays;
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;
16 public class JavaTypeClassMethod extends JavaMethod {
18 TypeClassMethod method;
20 public JavaTypeClassMethod(TypeClassMethod method, String className, String methodName,
21 Type effect, Type returnType, Type[] parameterTypes) {
22 super(false, className, methodName, effect, returnType, parameterTypes);
26 public TypeClassMethod getMethod() {
30 public void inline(SSASimplificationContext context, LetApply apply) {
31 //ValRef evidenceRef = apply.getParameters()[0];
32 //inline(context, apply, evidenceRef.getBinding(), evidenceRef.getTypeParameters());
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());
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();
47 IVal newValue = context.getEnvironment().getValue(impl.name).getValue();
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));
55 context.markModified("simplify-method");
60 /*private void inline(SSASimplificationContext context, LetApply apply, Val evidence, Type[] typeParameters) {
61 if(evidence instanceof JavaTypeInstanceConstructor) {
62 JavaTypeInstanceConstructor evidence_ = (JavaTypeInstanceConstructor)evidence;
65 else if(evidence instanceof BoundVar) {
66 BoundVarBinder parent = ((BoundVar)evidence).parent;
67 if(!(parent instanceof LetApply))
69 LetApply parentApply = (LetApply)apply;