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