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