]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / Case.java
1 package org.simantics.scl.compiler.elaboration.expressions;\r
2 \r
3 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\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.errors.Locations;\r
8 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
9 import org.simantics.scl.compiler.internal.parsing.Symbol;\r
10 import org.simantics.scl.compiler.types.Type;\r
11 \r
12 import gnu.trove.map.hash.TObjectIntHashMap;\r
13 import gnu.trove.set.hash.THashSet;\r
14 import gnu.trove.set.hash.TIntHashSet;\r
15 \r
16 public class Case extends Symbol {\r
17     public Expression[] patterns;\r
18     public Expression value;\r
19     \r
20     long lhs;\r
21     \r
22     public Case(Expression[] patterns, Expression value) {\r
23         this.patterns = patterns;\r
24         this.value = value;\r
25     }\r
26     \r
27     public Case(Expression pattern, Expression value) {\r
28         this(new Expression[] {pattern}, value);\r
29     }\r
30 \r
31     public void setLhs(long lhs) {\r
32         this.lhs = lhs;\r
33     }\r
34     \r
35     public long getLhs() {\r
36         return lhs;\r
37     }\r
38 \r
39         public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
40         value.collectRefs(allRefs, refs);\r
41     }\r
42 \r
43     public void collectVars(TObjectIntHashMap<Variable> allVars,\r
44             TIntHashSet vars) {\r
45         value.collectVars(allVars, vars);\r
46     }\r
47 \r
48     public void collectFreeVariables(THashSet<Variable> vars) {\r
49         value.collectFreeVariables(vars);\r
50         for(int i=patterns.length-1;i>=0;--i)\r
51             patterns[i].removeFreeVariables(vars);\r
52     }\r
53 \r
54     public void resolve(TranslationContext context) {\r
55         context.pushFrame();\r
56         for(int i=0;i<patterns.length;++i)\r
57             patterns[i] = patterns[i].resolveAsPattern(context);\r
58         value = value.resolve(context);\r
59         context.popFrame();\r
60     }\r
61 \r
62     public void simplify(SimplificationContext context) {\r
63         for(int i=0;i<patterns.length;++i)\r
64             patterns[i] = patterns[i].simplify(context);\r
65         value = value.simplify(context);\r
66     }\r
67 \r
68     public void setLocationDeep(long loc) {\r
69         if(location == Locations.NO_LOCATION) {\r
70             location = loc;\r
71             for(Expression pattern : patterns)\r
72                 pattern.setLocationDeep(loc);\r
73             value.setLocationDeep(loc);\r
74         }\r
75     }\r
76 \r
77     public Case replace(ReplaceContext context) {\r
78         Expression[] newPatterns = new Expression[patterns.length];        \r
79         for(int i=0;i<patterns.length;++i)\r
80             newPatterns[i] = patterns[i].replaceInPattern(context);\r
81         Expression newValue = value.replace(context);\r
82         Case result = new Case(newPatterns, newValue);\r
83         result.setLhs(lhs);\r
84         return result;\r
85     }\r
86 \r
87     public Expression[] getPatterns() {\r
88         return patterns;\r
89     }\r
90 \r
91     public void checkType(TypingContext context, Type[] parameterTypes,\r
92             Type requiredType) {\r
93         if(patterns.length != parameterTypes.length) {\r
94             context.getErrorLog().log(location, "This case has different arity ("+patterns.length+\r
95                     ") than than the first case (+"+parameterTypes.length+"+).");\r
96             return;\r
97         }\r
98         for(int i=0;i<patterns.length;++i)\r
99             patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]);\r
100         value = value.checkType(context, requiredType);\r
101     }\r
102     \r
103     public void checkIgnoredType(TypingContext context, Type[] parameterTypes) {\r
104         if(patterns.length != parameterTypes.length) {\r
105             context.getErrorLog().log(location, "This case has different arity ("+patterns.length+\r
106                     ") than than the first case (+"+parameterTypes.length+"+).");\r
107             return;\r
108         }\r
109         for(int i=0;i<patterns.length;++i)\r
110             patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]);\r
111         value = value.checkIgnoredType(context);\r
112     }\r
113         \r
114     public void decorate(ExpressionDecorator decorator) {\r
115         for(int i=0;i<patterns.length;++i)\r
116             patterns[i] = patterns[i].decorate(decorator);\r
117         value = value.decorate(decorator);\r
118     }\r
119 \r
120     public void forVariables(VariableProcedure procedure) {\r
121         value.forVariables(procedure);\r
122     }\r
123 }\r