]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/QPreExists.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / query / pre / QPreExists.java
1 package org.simantics.scl.compiler.elaboration.query.pre;
2
3 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
4 import org.simantics.scl.compiler.elaboration.expressions.QueryTransformer;
5 import org.simantics.scl.compiler.elaboration.expressions.Variable;
6 import org.simantics.scl.compiler.elaboration.query.QExists;
7 import org.simantics.scl.compiler.elaboration.query.Query;
8 import org.simantics.scl.compiler.errors.Locations;
9
10 public class QPreExists extends PreQuery {
11     String[] variables;
12     public Query query;
13     
14     public QPreExists(String[] variables, Query query) {
15         this.variables = variables;
16         this.query = query;
17     }
18
19     @Override
20     public Query resolve(TranslationContext context) {
21         context.pushFrame();
22         Variable[] newVariables = new Variable[variables.length];
23         for(int i=0;i<variables.length;++i)
24             newVariables[i] = context.newVariable(variables[i]);
25         Query newQuery = query.resolve(context);
26         context.popFrame();
27         
28         QExists result = new QExists(newVariables, newQuery);
29         result.location = location;
30         return result;
31     }
32     
33     @Override
34     public void setLocationDeep(long loc) {
35         if(location == Locations.NO_LOCATION) {
36             location = loc;
37             query.setLocationDeep(loc);
38         }
39     }
40     
41     @Override
42     public Query accept(QueryTransformer transformer) {
43         return transformer.transform(this);
44     }
45 }