--- /dev/null
+package org.simantics.scl.compiler.elaboration.chr.plan;\r
+\r
+import org.simantics.scl.compiler.compilation.CompilationContext;\r
+import org.simantics.scl.compiler.constants.BooleanConstant;\r
+import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;\r
+import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
+import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
+import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
+import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
+\r
+public class AccessFactOp extends PlanOp {\r
+\r
+ Expression inputFact;\r
+ CHRConstraint constraint;\r
+ Variable[] variables;\r
+ boolean killAfterMatch;\r
+ \r
+ public AccessFactOp(long location, Expression inputFact, CHRConstraint constraint, Variable[] variables,\r
+ boolean killAfterMatch) {\r
+ super(location);\r
+ this.inputFact = inputFact;\r
+ this.constraint = constraint;\r
+ this.variables = variables;\r
+ this.killAfterMatch = killAfterMatch;\r
+ }\r
+\r
+ @Override\r
+ public void toString(StringBuilder b) {\r
+ b.append("ACCESS ");\r
+ if(killAfterMatch)\r
+ b.append("- ");\r
+ b.append(constraint);\r
+ for(Variable variable : variables)\r
+ b.append(' ').append(variable);\r
+ b.append(" = ").append(inputFact);\r
+ }\r
+\r
+ @Override\r
+ public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {\r
+ IVal inputVal = inputFact.toVal(context.environment, w);\r
+ for(int i=0;i<variables.length;++i)\r
+ variables[i].setVal(w.apply(location, constraint.accessComponent(i), inputVal));\r
+ IVal activeId = w.apply(location, constraint.accessId, inputVal);\r
+ CodeWriter end = constraint.mayBeRemoved() ? w.createBlock() : null;\r
+ planContext.partnerFacts.add(new PartnerFact(true, activeId, constraint, inputVal, constraint.mayBeRemoved(), killAfterMatch, null, null, end == null ? null : end.getContinuation()));\r
+ planContext.nextOp(w);\r
+ if(end != null)\r
+ end.return_(BooleanConstant.FALSE);\r
+ }\r
+\r
+}\r