5 public class SetInclusion extends Inclusion {
10 public String generatedresult = null;
11 public String generatedaddeditem = null;
13 public static boolean worklist = false;
14 public boolean dostore = true;
16 public String toString() {
18 str+=elementexpr.name()+" in "+set;
22 public SetInclusion(Expr elementexpr, SetDescriptor set) {
23 this.elementexpr = elementexpr;
27 public boolean usesDescriptor(Descriptor d) {
31 return elementexpr.usesDescriptor(d);
34 public Expr getExpr() {
38 public SetDescriptor getSet() {
42 public Set getTargetDescriptors() {
43 HashSet v = new HashSet();
48 public Set getRequiredDescriptors() {
49 return elementexpr.getRequiredDescriptors();
52 public void generate(CodeWriter writer) {
53 VarDescriptor vd = VarDescriptor.makeNew("element");
54 elementexpr.generate(writer, vd);
56 // allows access to the value of this set addition later
57 generatedresult = vd.getSafeSymbol();
59 String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
60 generatedaddeditem = addeditem; // allows access to the result of the set addition later.
62 // we set equal to one so that if dostore == false the guard in teh
63 // metainclusion generation for the subrules and sub quantifiers will go on
67 if (!Compiler.REPAIR) {
68 writer.outputline("int " + addeditem + " = 1;");
69 writer.outputline(addeditem + " = " + set.getSafeSymbol() + "_hash->add((int)" + vd.getSafeSymbol()
70 + ", (int)" + vd.getSafeSymbol() + ");");
72 Repair.generate_dispatch(writer, set, vd.getSafeSymbol());
75 if (SetInclusion.worklist) {
76 writer.outputline("if (" + addeditem + ")");
77 writer.startblock(); {
78 WorkList.generate_dispatch(writer, set, vd.getSafeSymbol());
85 public boolean typecheck(SemanticAnalyzer sa) {
86 TypeDescriptor td = elementexpr.typecheck(sa);
92 TypeDescriptor settype = set.getType();
94 if (!td.equals(settype)) {
95 sa.getErrorReporter().report(null, "Type mismatch: attempting to test for types '" + td.getSymbol() + "' in set of type '" + settype.getSymbol() + "'");