]> gerrit.simantics Code Review - simantics/platform.git/blob
8534f462409fc2b131e1059774fe3ee8300d0e75
[simantics/platform.git] /
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 collectVars(TObjectIntHashMap<Variable> allVars,
26             TIntHashSet vars) {
27         if(evidence != null)
28             evidence.collectVars(allVars, vars);        
29     }
30     
31     @Override
32     public Expression inferType(TypingContext context) {
33         Variable variable = new Variable("evidence");
34         variable.setType(constraint);
35         evidence = new EVariable(getLocation(), variable);
36         evidence.setType(variable.getType());
37         context.addConstraintDemand(evidence);
38         return this;
39     }
40     
41     @Override
42     protected void updateType() throws MatchException {
43         setType(constraint);
44     }
45     
46     @Override
47     public void collectFreeVariables(THashSet<Variable> vars) {
48         if(evidence != null)
49             evidence.collectFreeVariables(vars);
50     }
51     
52     @Override
53     public Expression simplify(SimplificationContext context) {
54         return evidence.simplify(context);
55     }
56     
57     @Override
58     public Expression resolve(TranslationContext context) {
59         return this;
60     }
61     
62     @Override
63     public void collectEffects(THashSet<Type> effects) {
64     }
65     
66     @Override
67     public void setLocationDeep(long loc) {
68         if(location == Locations.NO_LOCATION) {
69             location = loc;
70             if(evidence != null)
71                 evidence.setLocationDeep(loc);
72         }
73     }
74     
75     @Override
76     public void accept(ExpressionVisitor visitor) {
77         visitor.visit(this);
78     }
79     
80     @Override
81     public Expression accept(ExpressionTransformer transformer) {
82         return transformer.transform(this);
83     }
84
85 }