package org.simantics.scl.compiler.elaboration.query.pre; import java.util.Arrays; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; 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.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