1 package org.simantics.scl.compiler.elaboration.query.pre;
3 import java.util.ArrayList;
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
6 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
7 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
8 import org.simantics.scl.compiler.elaboration.expressions.Variable;
9 import org.simantics.scl.compiler.elaboration.query.QConjunction;
10 import org.simantics.scl.compiler.elaboration.query.QExists;
11 import org.simantics.scl.compiler.elaboration.query.Query;
12 import org.simantics.scl.compiler.elaboration.query.QueryVisitor;
13 import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext;
16 * Query classes that may exist before resolving
18 public abstract class PreQuery extends Query {
20 public ArrayList<Variable> extraVariables = new ArrayList<Variable>(2);
21 public ArrayList<Query> sideQueries = new ArrayList<Query>(2);
24 public void checkType(TypingContext context) {
25 throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support checkType.");
29 public void collectConstraints(ConstraintCollectionContext context) {
30 throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support collectConstraints.");
34 public Query replace(ReplaceContext replaceContext) {
35 throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support replace.");
39 final public void accept(QueryVisitor visitor) {
40 throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support accept.");
43 protected Query withSideQueries(Query query) {
44 if(!sideQueries.isEmpty()) {
45 sideQueries.add(query);
46 query = new QConjunction(sideQueries.toArray(new Query[sideQueries.size()]));
48 if(!extraVariables.isEmpty())
49 query = new QExists(extraVariables.toArray(new Variable[extraVariables.size()]), query);