1 package org.simantics.scl.compiler.elaboration.query;
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.TypingContext;
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
7 import org.simantics.scl.compiler.elaboration.expressions.QueryTransformer;
8 import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext;
9 import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException;
10 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
11 import org.simantics.scl.compiler.errors.Locations;
12 import org.simantics.scl.compiler.types.Type;
14 public class QMapping extends Query {
15 public final MappingRelation mappingRelation;
16 public final Expression[] parameters;
18 public QMapping(MappingRelation mappingRelation, Expression[] parameters) {
19 this.mappingRelation = mappingRelation;
20 this.parameters = parameters;
24 public void checkType(TypingContext context) {
25 // Check parameter types
26 Type[] parameterTypes = mappingRelation.parameterTypes;
27 if(parameterTypes.length != parameters.length)
28 context.getErrorLog().log(location, "Relation is applied with wrong number of parameters.");
30 for(int i=0;i<parameters.length;++i)
31 parameters[i] = parameters[i].checkType(context, parameterTypes[i]);
35 public void collectConstraints(ConstraintCollectionContext context)
36 throws UnsolvableQueryException {
37 throw new InternalCompilerError();
41 public Query replace(ReplaceContext context) {
42 return new QMapping(mappingRelation,
43 Expression.replace(context, parameters));
47 public void setLocationDeep(long loc) {
48 if(location == Locations.NO_LOCATION) {
50 for(Expression parameter : parameters)
51 parameter.setLocationDeep(loc);
56 public void accept(QueryVisitor visitor) {
61 public Query accept(QueryTransformer transformer) {
62 return transformer.transform(this);