X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fquery%2FQMapping.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fquery%2FQMapping.java;h=fa0794fb4b037b0a727eeb8bba56f80af42ede61;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java new file mode 100644 index 000000000..fa0794fb4 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java @@ -0,0 +1,96 @@ +package org.simantics.scl.compiler.elaboration.query; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; +import org.simantics.scl.compiler.elaboration.contexts.TypingContext; +import org.simantics.scl.compiler.elaboration.expressions.Expression; +import org.simantics.scl.compiler.elaboration.expressions.QueryTransformer; +import org.simantics.scl.compiler.elaboration.expressions.Variable; +import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure; +import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext; +import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException; +import org.simantics.scl.compiler.elaboration.rules.MappingRelation; +import org.simantics.scl.compiler.errors.Locations; +import org.simantics.scl.compiler.types.Type; + +public class QMapping extends Query { + public final MappingRelation mappingRelation; + public final Expression[] parameters; + + public QMapping(MappingRelation mappingRelation, Expression[] parameters) { + this.mappingRelation = mappingRelation; + this.parameters = parameters; + } + + @Override + public void collectFreeVariables(THashSet vars) { + for(Expression parameter : parameters) + parameter.collectFreeVariables(vars); + } + + @Override + public void collectRefs(TObjectIntHashMap allRefs, + TIntHashSet refs) { + for(Expression parameter : parameters) + parameter.collectRefs(allRefs, refs); + } + + @Override + public void collectVars(TObjectIntHashMap allVars, + TIntHashSet vars) { + for(Expression parameter : parameters) + parameter.collectVars(allVars, vars); + } + + @Override + public void checkType(TypingContext context) { + // Check parameter types + Type[] parameterTypes = mappingRelation.parameterTypes; + if(parameterTypes.length != parameters.length) + context.getErrorLog().log(location, "Relation is applied with wrong number of parameters."); + else + for(int i=0;i