]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/ClaimOp.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / ClaimOp.java
1 package org.simantics.scl.compiler.elaboration.chr.plan;\r
2 \r
3 import org.simantics.scl.compiler.compilation.CompilationContext;\r
4 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;\r
5 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
6 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
7 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
8 \r
9 public class ClaimOp extends PlanOp {\r
10 \r
11     CHRConstraint constraint;\r
12     Expression[] parameters;\r
13 \r
14     public ClaimOp(long location, CHRConstraint constraint, Expression[] parameters) {\r
15         super(location);\r
16         this.constraint = constraint;\r
17         this.parameters = parameters;\r
18     }\r
19 \r
20     @Override\r
21     public void toString(StringBuilder b) {\r
22         b.append("CLAIM   ").append(constraint);\r
23         for (Expression parameter : parameters)\r
24             b.append(" (").append(parameter).append(')');\r
25     }\r
26 \r
27     @Override\r
28     public void generateCode(CompilationContext context, PlanContext planContext, CodeWriter w) {\r
29         IVal[] parameterVars = new IVal[parameters.length+1];\r
30         parameterVars[0] = planContext.generateNewId(location, w);\r
31         for(int i=0;i<parameters.length;++i)\r
32             parameterVars[i+1] = parameters[i].toVal(context.environment, w);\r
33         IVal newFact = w.apply(location, constraint.constructor, parameterVars);\r
34         w.apply(location, constraint.addProcedure, planContext.storeVar, newFact);\r
35         planContext.nextOp(w);\r
36     }\r
37 \r
38 }\r