]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambdaType.java
(refs #7375) Replaced collectVars method by a visitor
[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;
2
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
4 import org.simantics.scl.compiler.compilation.CompilationContext;
5 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
6 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
7 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
8 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
9 import org.simantics.scl.compiler.errors.Locations;
10 import org.simantics.scl.compiler.internal.codegen.references.IVal;
11 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
12 import org.simantics.scl.compiler.internal.interpreted.IExpression;
13 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
14 import org.simantics.scl.compiler.types.TVar;
15 import org.simantics.scl.compiler.types.Types;
16 import org.simantics.scl.compiler.types.exceptions.MatchException;
17
18 public class ELambdaType extends Expression {
19     public TVar[] parameters;
20     public Expression value;
21     
22     public ELambdaType(TVar[] parameters, Expression value) {
23         super(value.getLocation());
24         this.parameters = parameters;
25         this.value = value;
26     }
27
28     @Override
29     protected void updateType() throws MatchException {
30         setType(Types.forAll(parameters, value.getType()));
31     }
32
33     @Override
34     public IVal toVal(CompilationContext context, CodeWriter w) {
35         return lambdaToVal(context, w);
36     }
37
38     @Override
39     public Expression simplify(SimplificationContext context) {
40         value = value.simplify(context);
41         return this;
42     }
43
44     @Override
45     public Expression resolve(TranslationContext context) {
46         value = value.resolve(context);
47         return this;
48     }
49
50     @Override
51     public Expression replace(ReplaceContext context) {
52         TVar[] newParameters = new TVar[parameters.length];
53         for(int i=0;i<parameters.length;++i) {
54             TVar var = Types.var(parameters[i].getKind());
55             newParameters[i] = var;
56             context.tvarMap.put(parameters[i], var);
57         }
58             
59         ELambdaType result = new ELambdaType(newParameters, value.replace(context));
60         for(int i=0;i<parameters.length;++i)
61             context.tvarMap.remove(parameters[i]);
62         return result;
63     }
64     
65     @Override
66     public IExpression toIExpression(ExpressionInterpretationContext target) {
67         return value.toIExpression(target);
68     }
69     
70     @Override
71     public Expression inferType(TypingContext context) {
72         throw new InternalCompilerError("Should not type check " + getClass().getSimpleName() + ".");
73     }
74     
75     @Override
76     public void setLocationDeep(long loc) {
77         if(location == Locations.NO_LOCATION) {
78             location = loc;
79             value.setLocationDeep(loc);
80         }
81     }
82     
83     @Override
84     public void accept(ExpressionVisitor visitor) {
85         visitor.visit(this);
86     }
87     
88     @Override
89     public Expression accept(ExpressionTransformer transformer) {
90         return transformer.transform(this);
91     }
92     
93     @Override
94     public int getSyntacticFunctionArity() {
95         return value.getSyntacticFunctionArity();
96     }
97
98 }