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%2Fpre%2FQPreGuard.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fquery%2Fpre%2FQPreGuard.java;h=287f89919236559366bc50017d207974c07122df;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/pre/QPreGuard.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/QPreGuard.java new file mode 100644 index 000000000..287f89919 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/QPreGuard.java @@ -0,0 +1,115 @@ +package org.simantics.scl.compiler.elaboration.query.pre; + +import java.util.Arrays; + +import org.simantics.scl.compiler.constants.BooleanConstant; +import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; +import org.simantics.scl.compiler.elaboration.expressions.EApply; +import org.simantics.scl.compiler.elaboration.expressions.EEntityTypeAnnotation; +import org.simantics.scl.compiler.elaboration.expressions.ELiteral; +import org.simantics.scl.compiler.elaboration.expressions.ESimpleLet; +import org.simantics.scl.compiler.elaboration.expressions.EVar; +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.java.CheckRelation; +import org.simantics.scl.compiler.elaboration.query.QAtom; +import org.simantics.scl.compiler.elaboration.query.QMapping; +import org.simantics.scl.compiler.elaboration.query.Query; +import org.simantics.scl.compiler.elaboration.relations.SCLRelation; +import org.simantics.scl.compiler.elaboration.relations.TransitiveClosureRelation; +import org.simantics.scl.compiler.elaboration.rules.MappingRelation; +import org.simantics.scl.compiler.environment.AmbiguousNameException; +import org.simantics.scl.compiler.environment.Environments; +import org.simantics.scl.compiler.errors.Locations; + +public class QPreGuard extends PreQuery { + public Expression guard; + + public QPreGuard(Expression guard) { + super(); + this.guard = guard; + } + + private static Query resolveAsQuery(TranslationContext context, Expression function, + Expression[] parameters) { + if(function instanceof EVar) { + String relationName = ((EVar)function).name; + if(relationName.equals("tc") && parameters.length > 0) { + Query query_ = resolveAsQuery(context, parameters[0], + Arrays.copyOfRange(parameters, 1, parameters.length)); + if(query_ == null) + return null; + if(!(query_ instanceof QAtom)) { + context.getErrorLog().log(query_.location, "Cannot form a transitive relation."); + return null; + } + QAtom query = (QAtom)query_; + query.relation = new TransitiveClosureRelation(query.relation); + return query; + } + + MappingRelation mappingRelation; + try { + mappingRelation = Environments.getMappingRelation( + context.getEnvironment(), relationName); + } catch (AmbiguousNameException e) { + context.getErrorLog().log(function.location, e.getMessage()); + return null; + } + if(mappingRelation != null) { + if(parameters.length != 2) + context.getErrorLog().log(function.location, + "An arity of mapping relation should always be 2."); + for(int i=0;i