1 package org.simantics.scl.compiler.elaboration.query;
3 import java.util.Arrays;
5 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
6 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
7 import org.simantics.scl.compiler.elaboration.expressions.EApply;
8 import org.simantics.scl.compiler.elaboration.expressions.EVar;
9 import org.simantics.scl.compiler.elaboration.expressions.Expression;
10 import org.simantics.scl.compiler.elaboration.query.pre.QPreExists;
11 import org.simantics.scl.compiler.elaboration.query.pre.QPreGuard;
12 import org.simantics.scl.compiler.errors.Locations;
14 public abstract class QAbstractCombiner extends Query {
15 public Query[] queries;
17 public QAbstractCombiner(Query[] queries) {
18 this.queries = queries;
22 public Query resolve(TranslationContext context) {
23 Query modifiedQuery = handleExistsStatement(context);
24 if(modifiedQuery != null)
25 return modifiedQuery.resolve(context);
27 for(int i=0;i<queries.length;++i)
28 queries[i] = queries[i].resolve(context);
32 private QPreExists handleExistsStatement(TranslationContext context) {
33 if(queries.length == 0)
35 if(!(queries[0] instanceof QPreGuard))
37 Expression exp = ((QPreGuard)queries[0]).guard;
38 if(!(exp instanceof EApply))
40 EApply apply = (EApply)exp;
41 if(!(apply.getFunction() instanceof EVar))
43 if(!((EVar)apply.getFunction()).name.equals("exists"))
46 queries = Arrays.copyOfRange(queries, 1, queries.length);
48 Expression[] pars = apply.getParameters();
49 String[] variableNames = new String[pars.length];
50 for(int i=0;i<pars.length;++i) {
51 if(pars[i] instanceof EVar)
52 variableNames[i] = ((EVar)pars[i]).name;
54 context.getErrorLog().log(pars[i].getLocation(), "Exists statement may only contain variables as parameters.");
58 return new QPreExists(variableNames, this);
62 public void checkType(TypingContext context) {
63 for(Query query : queries)
64 query.checkType(context);
68 public void setLocationDeep(long loc) {
69 if(location == Locations.NO_LOCATION) {
71 for(Query query : queries)
72 query.setLocationDeep(loc);