]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/plan/AccessFactOp.java
Merge "Ensure GetElementClassRequest is not constructed without elementFactory"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / plan / AccessFactOp.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.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
10 \r
11 public class AccessFactOp extends PlanOp {\r
12 \r
13     Expression inputFact;\r
14     CHRConstraint constraint;\r
15     Variable[] variables;\r
16     boolean killAfterMatch;\r
17     \r
18     public AccessFactOp(long location, Expression inputFact, CHRConstraint constraint, Variable[] variables,\r
19             boolean killAfterMatch) {\r
20         super(location);\r
21         this.inputFact = inputFact;\r
22         this.constraint = constraint;\r
23         this.variables = variables;\r
24         this.killAfterMatch = killAfterMatch;\r
25     }\r
26 \r
27     @Override\r
28     public void toString(StringBuilder b) {\r
29         b.append("ACCESS  ");\r
30         if(killAfterMatch)\r
31             b.append("- ");\r
32         b.append(constraint);\r
33         for(Variable variable : variables)\r
34             b.append(' ').append(variable);\r
35         b.append(" = ").append(inputFact);\r
36     }\r
37 \r
38     @Override\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
47         if(end != null)\r
48             end.return_(BooleanConstant.FALSE);\r
49     }\r
50 \r
51 }\r