package org.simantics.scl.compiler.elaboration.query;
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TIntObjectHashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
import java.util.ArrayList;
import java.util.Set;
import org.simantics.scl.compiler.types.Type;
import org.simantics.scl.compiler.types.Types;
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
public class QAtom extends Query {
public SCLRelation relation;
public Type[] typeParameters;
public Expression[] parameters;
-
+
public QAtom(SCLRelation relation, Expression ... parameters) {
this.relation = relation;
this.parameters = parameters;
}
-
+
public QAtom(SCLRelation relation, Type[] typeParameters, Expression ... parameters) {
this.relation = relation;
this.typeParameters = typeParameters;
for(Expression parameter : parameters)
parameter.collectFreeVariables(vars);
}
-
+
@Override
public void checkType(TypingContext context) {
// Type parameters
typeParameters = new Type[typeVariables.length];
for(int i=0;i<typeVariables.length;++i)
typeParameters[i] = Types.metaVar(typeVariables[i].getKind());
-
+
// Check parameter types
Type[] parameterTypes = relation.getParameterTypes();
if(parameterTypes.length != parameters.length)
parameters[i] = parameters[i]
.checkType(context, parameterTypes[i].replace(typeVariables, typeParameters));
}
-
+
public Expression generateEnforce(EnforcingContext context) {
Variable[] variables = new Variable[parameters.length];
for(int i=0;i<variables.length;++i)
private static class VariableMaskProcedure implements VariableProcedure {
ConstraintCollectionContext context;
long requiredVariablesMask = 0L;
-
+
public VariableMaskProcedure(ConstraintCollectionContext context) {
this.context = context;
}
requiredVariablesMask |= 1L << id;
}
}
-
+
@Override
public void collectConstraints(ConstraintCollectionContext context) {
try {
}
}
}
-
+
// Combine required and optional variables
TIntHashSet allVariablesSet = new TIntHashSet();
for(int v : optionalVariableByParameter)
if(v >= 0)
allVariablesSet.add(v);
-
+
context.addConstraint(new RelationConstraint(allVariablesSet.toArray(), varParameters, this,
optionalVariableByParameter, procedure.requiredVariablesMask));
} catch(Exception e) {
context.getQueryCompilationContext().getTypingContext().getErrorLog().log(location, e);
}
}
-
+
private static void collectRefs(SCLRelation relation, TObjectIntHashMap<Object> allRefs,
TIntHashSet refs) {
if(relation instanceof CompositeRelation) {
for(Expression parameter : parameters)
parameter.collectRefs(allRefs, refs);
}
-
+
@Override
public void collectVars(TObjectIntHashMap<Variable> allVars,
TIntHashSet vars) {
return new Diff[] { new Diff(diffable.id, new QConjunction(eqs)) };
}
}
-
+
private static boolean containsReferenceTo(
CompositeRelation relation,
THashMap<SCLRelation, Diffable> diffables) {
else
return this;
}
-
+
@Override
public void setLocationDeep(long loc) {
if(location == Locations.NO_LOCATION) {
parameter.setLocationDeep(loc);
}
}
-
+
@Override
public void accept(QueryVisitor visitor) {
visitor.visit(this);
}
list.add(this);
}
-
+
@Override
public Query accept(QueryTransformer transformer) {
return transformer.transform(this);