1 package org.simantics.scl.compiler.constants.singletons;
3 import java.util.Arrays;
5 import org.simantics.scl.compiler.constants.FunctionValue;
6 import org.simantics.scl.compiler.internal.codegen.references.Val;
7 import org.simantics.scl.compiler.internal.codegen.references.ValRef;
8 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
9 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
10 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
11 import org.simantics.scl.compiler.types.TVar;
12 import org.simantics.scl.compiler.types.Type;
13 import org.simantics.scl.compiler.types.Types;
14 import org.simantics.scl.compiler.types.kinds.Kinds;
16 public class TypeOfConstant extends FunctionValue {
17 private static final TVar A = Types.var(Kinds.STAR);
18 public static final TypeOfConstant INSTANCE = new TypeOfConstant();
20 private TypeOfConstant() {
21 super(new TVar[] {A}, Types.NO_EFFECTS, Types.TYPE,
22 Types.pred(Types.TYPEABLE, A), A);
26 public Type applyExact(MethodBuilder mb, Val[] parameters) {
27 mb.push(parameters[0], Types.TYPE);
28 return getReturnType();
32 public String toString() {
37 public void inline(SSASimplificationContext context, LetApply apply) {
38 ValRef[] parameters = apply.getParameters();
39 if(parameters.length == 2) {
40 parameters[1].remove();
41 apply.setParameters(Arrays.copyOf(parameters, 1));
43 ValRef oldFunc = apply.getFunction();
44 apply.setFunction(TypeValueConstant.INSTANCE.createOccurrence(oldFunc.getTypeParameters()));
46 context.markModified("inline-typeOf");