]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambdaType.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / ELambdaType.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.ReplaceContext;\r
5 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
6 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
7 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
8 import org.simantics.scl.compiler.environment.Environment;\r
9 import org.simantics.scl.compiler.errors.Locations;\r
10 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
11 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
12 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
13 import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
14 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
15 import org.simantics.scl.compiler.types.TVar;\r
16 import org.simantics.scl.compiler.types.Type;\r
17 import org.simantics.scl.compiler.types.Types;\r
18 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
19 \r
20 import gnu.trove.map.hash.TObjectIntHashMap;\r
21 import gnu.trove.set.hash.THashSet;\r
22 import gnu.trove.set.hash.TIntHashSet;\r
23 \r
24 public class ELambdaType extends Expression {\r
25     public TVar[] parameters;\r
26     public Expression value;\r
27     \r
28     public ELambdaType(TVar[] parameters, Expression value) {\r
29         super(value.getLocation());\r
30         this.parameters = parameters;\r
31         this.value = value;\r
32     }\r
33 \r
34         public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
35         value.collectRefs(allRefs, refs);\r
36     }\r
37         \r
38         @Override\r
39         public void collectVars(TObjectIntHashMap<Variable> allVars,\r
40                 TIntHashSet vars) {\r
41             value.collectVars(allVars, vars);\r
42         }\r
43         \r
44         @Override\r
45         protected void updateType() throws MatchException {\r
46             setType(Types.forAll(parameters, value.getType()));\r
47         }\r
48 \r
49         @Override\r
50     public IVal toVal(Environment env, CodeWriter w) {\r
51         return lambdaToVal(env, w);\r
52     }\r
53 \r
54     @Override\r
55     public void collectFreeVariables(THashSet<Variable> vars) {\r
56         value.collectFreeVariables(vars);\r
57     }\r
58 \r
59     @Override\r
60     public Expression simplify(SimplificationContext context) {\r
61         value = value.simplify(context);\r
62         return this;\r
63     }\r
64 \r
65     @Override\r
66     public Expression resolve(TranslationContext context) {\r
67         value = value.resolve(context);\r
68         return this;\r
69     }\r
70 \r
71     @Override\r
72     public Expression replace(ReplaceContext context) {\r
73         TVar[] newParameters = new TVar[parameters.length];\r
74         for(int i=0;i<parameters.length;++i) {\r
75             TVar var = Types.var(parameters[i].getKind());\r
76             newParameters[i] = var;\r
77             context.tvarMap.put(parameters[i], var);\r
78         }\r
79             \r
80         ELambdaType result = new ELambdaType(newParameters, value.replace(context));\r
81         for(int i=0;i<parameters.length;++i)\r
82             context.tvarMap.remove(parameters[i]);\r
83         return result;\r
84     }\r
85     \r
86     @Override\r
87     public IExpression toIExpression(ExpressionInterpretationContext target) {\r
88         return value.toIExpression(target);\r
89     }\r
90     \r
91     @Override\r
92     public Expression inferType(TypingContext context) {\r
93         throw new InternalCompilerError("Should not type check " + getClass().getSimpleName() + ".");\r
94     }\r
95     \r
96     @Override\r
97     public Expression decorate(ExpressionDecorator decorator) {\r
98         value = value.decorate(decorator);\r
99         return decorator.decorate(this);\r
100     }\r
101 \r
102     @Override\r
103     public void collectEffects(THashSet<Type> effects) {\r
104     }\r
105     \r
106     @Override\r
107     public void setLocationDeep(long loc) {\r
108         if(location == Locations.NO_LOCATION) {\r
109             location = loc;\r
110             value.setLocationDeep(loc);\r
111         }\r
112     }\r
113     \r
114     @Override\r
115     public void accept(ExpressionVisitor visitor) {\r
116         visitor.visit(this);\r
117     }\r
118 \r
119     @Override\r
120     public void forVariables(VariableProcedure procedure) {\r
121         value.forVariables(procedure);\r
122     }\r
123     \r
124     @Override\r
125     public Expression accept(ExpressionTransformer transformer) {\r
126         return transformer.transform(this);\r
127     }\r
128 \r
129 }\r