package org.simantics.scl.compiler.constants; import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance; import org.simantics.scl.compiler.internal.codegen.references.IVal; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.references.ValRef; import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; public class JavaTypeClassSuper extends JavaMethod { int superId; public JavaTypeClassSuper(int superId, String className, String methodName, Type returnType, Type ... parameterTypes) { super(false, className, methodName, Types.NO_EFFECTS, returnType, parameterTypes); this.superId = superId; } public void inline(SSASimplificationContext context, LetApply apply) { ValRef classRef = apply.getParameters()[0]; Val class_ = classRef.getBinding(); if(class_ instanceof JavaTypeInstanceConstructor) { JavaTypeInstanceConstructor constr = (JavaTypeInstanceConstructor)class_; TypeClassInstance instance = constr.getInstance(); IVal newVal = instance.superExpressions[superId].getValue(); apply.getTarget().replaceBy(newVal.createOccurrence()); apply.remove(); } } }