]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EGetConstraint.java
5f9a1eb59adbe1002189f376dd19092d3b8199b5
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EGetConstraint.java
1 package org.simantics.scl.compiler.elaboration.expressions;
2
3 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
4 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
5 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
6 import org.simantics.scl.compiler.errors.Locations;
7 import org.simantics.scl.compiler.types.TPred;
8 import org.simantics.scl.compiler.types.Type;
9 import org.simantics.scl.compiler.types.exceptions.MatchException;
10
11 import gnu.trove.map.hash.TObjectIntHashMap;
12 import gnu.trove.set.hash.THashSet;
13 import gnu.trove.set.hash.TIntHashSet;
14
15 public class EGetConstraint extends SimplifiableExpression {
16     TPred constraint;
17     EVariable evidence;
18         
19     public EGetConstraint(long loc, TPred constraint) {
20         super(loc);
21         this.constraint = constraint;
22     }
23
24     @Override
25     public void collectRefs(TObjectIntHashMap<Object> allRefs,
26             TIntHashSet refs) {
27     }
28     
29     @Override
30     public void collectVars(TObjectIntHashMap<Variable> allVars,
31             TIntHashSet vars) {
32         if(evidence != null)
33             evidence.collectVars(allVars, vars);        
34     }
35     
36     @Override
37     public Expression inferType(TypingContext context) {
38         Variable variable = new Variable("evidence");
39         variable.setType(constraint);
40         evidence = new EVariable(getLocation(), variable);
41         evidence.setType(variable.getType());
42         context.addConstraintDemand(evidence);
43         return this;
44     }
45     
46     @Override
47     protected void updateType() throws MatchException {
48         setType(constraint);
49     }
50     
51     @Override
52     public void collectFreeVariables(THashSet<Variable> vars) {
53         if(evidence != null)
54             evidence.collectFreeVariables(vars);
55     }
56     
57     @Override
58     public Expression simplify(SimplificationContext context) {
59         return evidence.simplify(context);
60     }
61     
62     @Override
63     public Expression resolve(TranslationContext context) {
64         return this;
65     }
66     
67     @Override
68     public void collectEffects(THashSet<Type> effects) {
69     }
70     
71     @Override
72     public void setLocationDeep(long loc) {
73         if(location == Locations.NO_LOCATION) {
74             location = loc;
75             if(evidence != null)
76                 evidence.setLocationDeep(loc);
77         }
78     }
79     
80     @Override
81     public void accept(ExpressionVisitor visitor) {
82         visitor.visit(this);
83     }
84     
85     @Override
86     public Expression accept(ExpressionTransformer transformer) {
87         return transformer.transform(this);
88     }
89
90 }