]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EqRelation.java
(refs #7375) Fixed implementation of collectEffects
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / EqRelation.java
1 package org.simantics.scl.compiler.elaboration.java;
2
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;
11
12 public class EqRelation extends AbstractRelation {
13     public static final EqRelation INSTANCE = new EqRelation();
14     
15     private EqRelation() {}
16     
17     private static final TVar A = Types.var(Kinds.STAR);
18     
19     private static final TVar[] TYPE_VARIABLES = new TVar[] {A};
20     
21     @Override
22     public TVar[] getTypeVariables() {
23         return TYPE_VARIABLES;
24     }
25
26     private static final Type[] PARAMETER_TYPES = new Type[] {A, A};
27     
28     @Override
29     public Type[] getParameterTypes() {
30         return PARAMETER_TYPES;
31     }
32     
33     @Override
34     public int getPhase() {
35         return 0;
36     }
37     
38     @Override
39     public double getSelectivity(int boundVariables) {
40         switch(boundVariables) {
41         case FF: return Double.POSITIVE_INFINITY;
42         case BF:
43         case FB: return 1.0;
44         case BB: return 0.1;
45         default: throw new IllegalArgumentException();
46         }
47     }
48     
49     @Override
50     public int getRequiredVariablesMask() {
51         return FF;
52     }
53
54     @Override
55     public void generate(long location,
56             QueryCompilationContext context,
57             Type[] typeParameters, Variable[] parameters, int boundVariables) {
58         switch(boundVariables) {
59         case BF:
60             context.let(parameters[1], new EVariable(parameters[0]));
61             break;
62         case FB:
63             context.let(parameters[0], new EVariable(parameters[1]));
64             break;
65         case BB:            
66             context.equalityCondition(location, 
67                         new EVariable(parameters[0]),
68                         new EVariable(parameters[1]));
69             break;
70         default: throw new IllegalArgumentException();
71         }
72     }
73
74     @Override
75     public String toString() {
76         return "=";
77     }
78
79     @Override
80     public Type getEnforceEffect() {
81         return Types.NO_EFFECTS;
82     }
83
84     @Override
85     public Type getQueryEffect() {
86         return Types.NO_EFFECTS;
87     }
88 }