]> gerrit.simantics Code Review - simantics/platform.git/blob
49d010bceef46bff083648434ab92d6483e69ae1
[simantics/platform.git] /
1 package org.simantics.scl.compiler.elaboration.expressions;
2
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
4 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
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.elaboration.query.QExists;
9 import org.simantics.scl.compiler.elaboration.query.Query;
10 import org.simantics.scl.compiler.elaboration.query.compilation.EnforcingContext;
11 import org.simantics.scl.compiler.errors.Locations;
12 import org.simantics.scl.compiler.types.Type;
13 import org.simantics.scl.compiler.types.Types;
14 import org.simantics.scl.compiler.types.exceptions.MatchException;
15
16 import gnu.trove.map.hash.TObjectIntHashMap;
17 import gnu.trove.set.hash.THashSet;
18 import gnu.trove.set.hash.TIntHashSet;
19
20 public class EEnforce extends SimplifiableExpression {
21     
22     Query query;
23     
24     public EEnforce(Query query) {
25         this.query = query;
26     }
27     
28     public Query getQuery() {
29         return query;
30     }
31
32     @Override
33     public void collectRefs(TObjectIntHashMap<Object> allRefs,
34             TIntHashSet refs) {
35         query.collectRefs(allRefs, refs);
36     }
37
38     @Override
39     public void collectVars(TObjectIntHashMap<Variable> allVars,
40             TIntHashSet vars) {
41         query.collectVars(allVars, vars);
42     }
43     
44     @Override
45     public void collectEffects(THashSet<Type> effects) {
46         throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support collectEffects.");
47     }
48
49     @Override
50     protected void updateType() throws MatchException {
51         setType(Types.tupleConstructor(0));
52     }
53     
54     @Override
55     public Expression inferType(TypingContext context) {
56         query.checkType(context);
57         //context.declareEffect(location, query.getEffect(Query.W));
58         return compile(context);
59     }
60     
61     public Expression compile(TypingContext context) {
62         return query.generateEnforce(new EnforcingContext(context));
63     }
64
65     @Override
66     public void collectFreeVariables(THashSet<Variable> vars) {
67         query.collectFreeVariables(vars);
68     }
69
70     @Override
71     public Expression simplify(SimplificationContext context) {
72         /*query = query.simplify(context);
73         return query.generateEnforce(context);*/
74         throw new InternalCompilerError();
75     }
76
77     @Override
78     public Expression resolve(TranslationContext context) {
79         context.pushExistentialFrame();
80         query = query.resolve(context);
81         Variable[] variables = context.popExistentialFrame();
82         if(variables.length > 0)
83             query = new QExists(variables, query);
84         return this;
85     }
86     
87     @Override
88     public void setLocationDeep(long loc) {
89         if(location == Locations.NO_LOCATION) {
90             location = loc;
91             query.setLocationDeep(loc);
92         }
93     }
94     
95     @Override
96     public void accept(ExpressionVisitor visitor) {
97         visitor.visit(this);
98     }
99     
100     @Override
101     public Expression replace(ReplaceContext context) {
102         return new EEnforce(query.replace(context));
103     }
104     
105     @Override
106     public Expression accept(ExpressionTransformer transformer) {
107         return transformer.transform(this);
108     }
109
110 }