]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRRuleset.java
e1495588adecf3cd8e5142da1b3be98f5f39913e
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / ECHRRuleset.java
1 package org.simantics.scl.compiler.elaboration.expressions;
2
3 import org.simantics.scl.compiler.compilation.CompilationContext;
4 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
5 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
6 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
7 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
8 import org.simantics.scl.compiler.errors.Locations;
9 import org.simantics.scl.compiler.internal.codegen.references.IVal;
10 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
11 import org.simantics.scl.compiler.internal.interpreted.IExpression;
12 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
13 import org.simantics.scl.compiler.types.exceptions.MatchException;
14
15 import gnu.trove.map.hash.TObjectIntHashMap;
16 import gnu.trove.set.hash.TIntHashSet;
17
18 public class ECHRRuleset extends Expression {
19     public CHRRuleset ruleset;
20     public Expression in;
21     
22     public ECHRRuleset(CHRRuleset ruleset, Expression in) {
23         this.ruleset = ruleset;
24         this.in = in;
25     }
26     
27     @Override
28     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
29         ruleset.collectVars(allVars, vars);
30         in.collectVars(allVars, vars);
31     }
32
33     @Override
34     protected void updateType() throws MatchException {
35         setType(in.getType());
36     }
37
38     @Override
39     public IVal toVal(CompilationContext context, CodeWriter w) {
40         ruleset.generateCode(w);
41         return in.toVal(context, w);
42     }
43
44     @Override
45     public Expression resolve(TranslationContext context) {
46         if(context.currentRuleset != null) {
47             context.getErrorLog().log(location, "Current version of SCL compiler does not support nested rulesets.");
48             return this;
49         }
50         context.currentRuleset = ruleset;
51         
52         context.pushFrame();
53         context.pushCHRConstraintFrame();
54         ruleset.resolve(context);
55         in = in.resolve(context);
56         context.popCHRConstraintFrame(ruleset.constraints);
57         context.popFrame();
58         
59         context.currentRuleset = null;
60         
61         return this;
62     }
63     @Override
64     public void setLocationDeep(long loc) {
65         if(location == Locations.NO_LOCATION) {
66             this.location = loc;
67             ruleset.setLocationDeep(loc);
68             in.setLocationDeep(loc);
69         }
70     }
71     
72     @Override
73     public void accept(ExpressionVisitor visitor) {
74         visitor.visit(this);
75     }
76     
77     @Override
78     public Expression inferType(TypingContext context) {
79         ruleset.checkType(context);
80         in = in.inferType(context);
81         return this;
82     }
83     
84     @Override
85     public Expression simplify(SimplificationContext context) {
86         ruleset.simplify(context);
87         ruleset.compile(context);
88         in = in.simplify(context);
89         return this;
90     }
91     
92     @Override
93     public Expression accept(ExpressionTransformer transformer) {
94         return transformer.transform(this);
95     }
96     
97     @Override
98     public IExpression toIExpression(ExpressionInterpretationContext context) {
99         throw new UnsupportedOperationException();
100     }
101
102 }