]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / query / QMapping.java
1 package org.simantics.scl.compiler.elaboration.query;
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.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.expressions.Variable;
9 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
10 import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext;
11 import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException;
12 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
13 import org.simantics.scl.compiler.errors.Locations;
14 import org.simantics.scl.compiler.types.Type;
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 QMapping extends Query {
21     public final MappingRelation mappingRelation;
22     public final Expression[] parameters;
23     
24     public QMapping(MappingRelation mappingRelation, Expression[] parameters) {
25         this.mappingRelation = mappingRelation;
26         this.parameters = parameters;
27     }
28
29     @Override
30     public void collectFreeVariables(THashSet<Variable> vars) {
31         for(Expression parameter : parameters)
32             parameter.collectFreeVariables(vars);
33     }
34
35     @Override
36     public void collectRefs(TObjectIntHashMap<Object> allRefs,
37             TIntHashSet refs) {
38         for(Expression parameter : parameters)
39             parameter.collectRefs(allRefs, refs);
40     }
41
42     @Override
43     public void collectVars(TObjectIntHashMap<Variable> allVars,
44             TIntHashSet vars) {
45         for(Expression parameter : parameters)
46             parameter.collectVars(allVars, vars);
47     }
48
49     @Override
50     public void checkType(TypingContext context) {
51         // Check parameter types
52         Type[] parameterTypes = mappingRelation.parameterTypes;
53         if(parameterTypes.length != parameters.length)
54             context.getErrorLog().log(location, "Relation is applied with wrong number of parameters.");
55         else
56             for(int i=0;i<parameters.length;++i)
57                 parameters[i] = parameters[i].checkType(context, parameterTypes[i]);
58     }
59
60     @Override
61     public void collectConstraints(ConstraintCollectionContext context)
62             throws UnsolvableQueryException {
63         throw new InternalCompilerError();
64     }
65
66     @Override
67     public Query replace(ReplaceContext context) {
68         return new QMapping(mappingRelation,
69                 Expression.replace(context, parameters));
70     }
71
72     @Override
73     public void setLocationDeep(long loc) {
74         if(location == Locations.NO_LOCATION) {
75             location = loc;
76             for(Expression parameter : parameters)
77                 parameter.setLocationDeep(loc);
78         }
79     }
80
81     @Override
82     public void accept(QueryVisitor visitor) {
83         visitor.visit(this);
84     }
85
86     @Override
87     public void forVariables(VariableProcedure procedure) {
88         for(Expression parameter : parameters)
89             parameter.forVariables(procedure);
90     }
91     
92     @Override
93     public Query accept(QueryTransformer transformer) {
94         return transformer.transform(this);
95     }
96 }