]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java
48969e77b77b770ea4c2366db7ffbb2b7b3204c0
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / ETypeAnnotation.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.internal.parsing.types.TypeAst;\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 ETypeAnnotation extends SimplifiableExpression {\r
17     Expression value;\r
18     Type type;\r
19     TypeAst typeAst;\r
20         \r
21     public ETypeAnnotation(Expression value, TypeAst typeAst) {\r
22         this.value = value;\r
23         this.typeAst = typeAst;\r
24     }\r
25 \r
26     public ETypeAnnotation(long loc, Expression value, Type type) {\r
27         super(loc);\r
28         this.value = value;\r
29         this.type = type;\r
30     }\r
31 \r
32         public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
33         value.collectRefs(allRefs, refs);\r
34     }\r
35         \r
36         @Override\r
37         public void collectVars(TObjectIntHashMap<Variable> allVars,\r
38                 TIntHashSet vars) {\r
39             value.collectVars(allVars, vars);\r
40         }\r
41 \r
42         @Override\r
43         protected void updateType() throws MatchException {\r
44             setType(type);\r
45         }\r
46 \r
47     @Override\r
48     public void collectFreeVariables(THashSet<Variable> vars) {\r
49         value.collectFreeVariables(vars);\r
50     }\r
51 \r
52     @Override\r
53     public Expression simplify(SimplificationContext context) {\r
54         return value.simplify(context);\r
55     }\r
56 \r
57     @Override\r
58     public Expression resolve(TranslationContext context) {\r
59         value = value.resolve(context);\r
60         type = context.toType(typeAst);\r
61         return this;\r
62     }\r
63     \r
64     @Override\r
65     public Expression resolveAsPattern(TranslationContext context) {\r
66         value = value.resolveAsPattern(context);\r
67         type = context.toType(typeAst);\r
68         return this;\r
69     }\r
70     \r
71     @Override\r
72     public Expression inferType(TypingContext context) {\r
73         return value.checkType(context, type);\r
74     }\r
75 \r
76     @Override\r
77     public Expression decorate(ExpressionDecorator decorator) {\r
78         value = value.decorate(decorator);\r
79         return decorator.decorate(this);\r
80     }\r
81 \r
82     @Override\r
83     public void collectEffects(THashSet<Type> effects) {\r
84         value.collectEffects(effects);\r
85     }\r
86     \r
87     @Override\r
88     public void setLocationDeep(long loc) {\r
89         if(location == Locations.NO_LOCATION) {\r
90             location = loc;\r
91             value.setLocationDeep(loc);\r
92         }\r
93     }\r
94     \r
95     @Override\r
96     public void accept(ExpressionVisitor visitor) {\r
97         visitor.visit(this);\r
98     }\r
99     \r
100     public Expression getValue() {\r
101         return value;\r
102     }\r
103 \r
104     @Override\r
105     public void forVariables(VariableProcedure procedure) {\r
106         value.forVariables(procedure);\r
107     }\r
108     \r
109     @Override\r
110     public Expression accept(ExpressionTransformer transformer) {\r
111         return transformer.transform(this);\r
112     }\r
113 \r
114 }\r