1 package org.simantics.scl.compiler.elaboration.chr.plan;
\r
3 import org.simantics.scl.compiler.compilation.CompilationContext;
\r
4 import org.simantics.scl.compiler.constants.BooleanConstant;
\r
5 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
\r
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
7 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
8 import org.simantics.scl.compiler.internal.codegen.references.IVal;
\r
9 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
\r
11 public class AccessFactOp extends PlanOp {
\r
13 Expression inputFact;
\r
14 CHRConstraint constraint;
\r
15 Variable[] variables;
\r
16 boolean killAfterMatch;
\r
18 public AccessFactOp(long location, Expression inputFact, CHRConstraint constraint, Variable[] variables,
\r
19 boolean killAfterMatch) {
\r
21 this.inputFact = inputFact;
\r
22 this.constraint = constraint;
\r
23 this.variables = variables;
\r
24 this.killAfterMatch = killAfterMatch;
\r
28 public void toString(StringBuilder b) {
\r
29 b.append("ACCESS ");
\r
32 b.append(constraint);
\r
33 for(Variable variable : variables)
\r
34 b.append(' ').append(variable);
\r
35 b.append(" = ").append(inputFact);
\r
39 public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {
\r
40 IVal inputVal = inputFact.toVal(context.environment, w);
\r
41 for(int i=0;i<variables.length;++i)
\r
42 variables[i].setVal(w.apply(location, constraint.accessComponent(i), inputVal));
\r
43 IVal activeId = w.apply(location, constraint.accessId, inputVal);
\r
44 CodeWriter end = constraint.mayBeRemoved() ? w.createBlock() : null;
\r
45 planContext.partnerFacts.add(new PartnerFact(true, activeId, constraint, inputVal, constraint.mayBeRemoved(), killAfterMatch, null, null, end == null ? null : end.getContinuation()));
\r
46 planContext.nextOp(w);
\r
48 end.return_(BooleanConstant.FALSE);
\r