]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/AccessFactOp.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / AccessFactOp.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/AccessFactOp.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/AccessFactOp.java
new file mode 100644 (file)
index 0000000..befcfdd
--- /dev/null
@@ -0,0 +1,51 @@
+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