]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EViewPattern.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EViewPattern.java
1 package org.simantics.scl.compiler.elaboration.expressions;\r
2 \r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
4 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
5 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
6 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
7 import org.simantics.scl.compiler.environment.Environment;\r
8 import org.simantics.scl.compiler.errors.Locations;\r
9 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
10 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
11 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
12 import org.simantics.scl.compiler.types.Type;\r
13 import org.simantics.scl.compiler.types.Types;\r
14 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
15 import org.simantics.scl.compiler.types.util.MultiFunction;\r
16 \r
17 import gnu.trove.map.hash.TObjectIntHashMap;\r
18 import gnu.trove.set.hash.THashSet;\r
19 import gnu.trove.set.hash.TIntHashSet;\r
20 \r
21 public class EViewPattern extends Expression {\r
22     public Expression expression;\r
23     public Expression pattern;\r
24     \r
25     public EViewPattern(Expression expression, Expression pattern) {\r
26         this.expression = expression;\r
27         this.pattern = pattern;\r
28     }\r
29 \r
30     @Override\r
31     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
32         expression.collectRefs(allRefs, refs);\r
33         pattern.collectRefs(allRefs, refs);\r
34     }\r
35 \r
36     @Override\r
37     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {\r
38         expression.collectVars(allVars, vars);\r
39         pattern.collectVars(allVars, vars);\r
40     }\r
41 \r
42     @Override\r
43     public void forVariables(VariableProcedure procedure) {\r
44         expression.forVariables(procedure);\r
45         pattern.forVariables(procedure);\r
46     }\r
47     \r
48     @Override\r
49     public Expression inferType(TypingContext context) {\r
50         context.setInPattern(false);\r
51         expression = expression.inferType(context);\r
52         context.setInPattern(true);\r
53         MultiFunction mfun;\r
54         try {\r
55             mfun = Types.matchFunction(expression.getType(), 1);\r
56         } catch (MatchException e) {\r
57             context.getErrorLog().log(expression.location, "Expected a function as a transformation expression.");\r
58             return new EError(location);\r
59         }\r
60         setType(mfun.parameterTypes[0]);\r
61         pattern.checkType(context, mfun.returnType);\r
62         return this;\r
63     }\r
64 \r
65     @Override\r
66     protected void updateType() throws MatchException {\r
67         MultiFunction mfun = Types.matchFunction(expression.getType(), 1);\r
68         setType(mfun.parameterTypes[0]);\r
69     }\r
70 \r
71     @Override\r
72     public IVal toVal(Environment env, CodeWriter w) {\r
73         throw new InternalCompilerError(location, "EViewPattern.toVal should not be invoked.");\r
74     }\r
75 \r
76     @Override\r
77     public void collectFreeVariables(THashSet<Variable> vars) {\r
78         throw new InternalCompilerError(location, "Cannot collect free variables for a pattern.");\r
79     }\r
80     \r
81     @Override\r
82     public void removeFreeVariables(THashSet<Variable> vars) {\r
83         expression.collectFreeVariables(vars);\r
84         pattern.removeFreeVariables(vars);\r
85     }\r
86 \r
87     @Override\r
88     public Expression resolve(TranslationContext context) {\r
89         context.getErrorLog().log("View pattern cannot occur only in patterns. Maybe you are missing '\\' in front of a lambda experssion?");\r
90         return new EError(location);\r
91     }\r
92 \r
93     @Override\r
94     public Expression resolveAsPattern(TranslationContext context) {\r
95         expression = expression.resolve(context);\r
96         pattern = pattern.resolveAsPattern(context);\r
97         return this;\r
98     }\r
99     \r
100     @Override\r
101     public void setLocationDeep(long loc) {\r
102         if(location == Locations.NO_LOCATION) {\r
103             location = loc; \r
104             expression.setLocationDeep(loc);\r
105             pattern.setLocationDeep(loc);\r
106         }\r
107     }\r
108 \r
109     @Override\r
110     public Expression decorate(ExpressionDecorator decorator) {\r
111         expression = expression.decorate(decorator);\r
112         return this;\r
113     }\r
114 \r
115     @Override\r
116     public void collectEffects(THashSet<Type> effects) {\r
117         expression.collectEffects(effects);\r
118     }\r
119 \r
120     @Override\r
121     public void accept(ExpressionVisitor visitor) {\r
122         visitor.visit(this);\r
123     }\r
124 \r
125     @Override\r
126     public Expression accept(ExpressionTransformer transformer) {\r
127         return transformer.transform(this);\r
128     }\r
129     \r
130     @Override\r
131     public Expression simplify(SimplificationContext context) {\r
132         expression = expression.simplify(context);\r
133         pattern = pattern.simplify(context);\r
134         return this;\r
135     }\r
136 \r
137 }\r