1 package org.simantics.scl.compiler.elaboration.java;
3 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
4 import org.simantics.scl.compiler.elaboration.expressions.Variable;
5 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext;
6 import org.simantics.scl.compiler.elaboration.relations.AbstractRelation;
7 import org.simantics.scl.compiler.types.TVar;
8 import org.simantics.scl.compiler.types.Type;
9 import org.simantics.scl.compiler.types.Types;
10 import org.simantics.scl.compiler.types.kinds.Kinds;
12 public class EqRelation extends AbstractRelation {
13 public static final EqRelation INSTANCE = new EqRelation();
15 private EqRelation() {}
17 private static final TVar A = Types.var(Kinds.STAR);
19 private static final TVar[] TYPE_VARIABLES = new TVar[] {A};
22 public TVar[] getTypeVariables() {
23 return TYPE_VARIABLES;
26 private static final Type[] PARAMETER_TYPES = new Type[] {A, A};
29 public Type[] getParameterTypes() {
30 return PARAMETER_TYPES;
34 public int getPhase() {
39 public double getSelectivity(int boundVariables) {
40 switch(boundVariables) {
41 case FF: return Double.POSITIVE_INFINITY;
45 default: throw new IllegalArgumentException();
50 public int getRequiredVariablesMask() {
55 public void generate(long location,
56 QueryCompilationContext context,
57 Type[] typeParameters, Variable[] parameters, int boundVariables) {
58 switch(boundVariables) {
60 context.let(parameters[1], new EVariable(parameters[0]));
63 context.let(parameters[0], new EVariable(parameters[1]));
66 context.equalityCondition(location,
67 new EVariable(parameters[0]),
68 new EVariable(parameters[1]));
70 default: throw new IllegalArgumentException();
75 public String toString() {