001    /* This file was generated with JastAdd2 (http://jastadd.org) version R20130213 */
002    package AST;
003    
004    import java.util.HashSet;
005    import java.io.File;
006    import java.util.*;
007    import beaver.*;
008    import java.util.ArrayList;
009    import java.util.zip.*;
010    import java.io.*;
011    import java.io.FileNotFoundException;
012    import java.util.Collection;
013    /**
014     * @production AndLogicalExpr : {@link LogicalExpr};
015     * @ast node
016     * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/java.ast:172
017     */
018    public class AndLogicalExpr extends LogicalExpr implements Cloneable {
019      /**
020       * @apilevel low-level
021       */
022      public void flushCache() {
023      }
024      /**
025       * @apilevel internal
026       */
027      public void flushCollectionCache() {
028      }
029      /**
030       * @apilevel internal
031       */
032      @SuppressWarnings({"unchecked", "cast"})
033      public AndLogicalExpr clone() throws CloneNotSupportedException {
034        AndLogicalExpr node = (AndLogicalExpr)super.clone();
035        node.isDAafterTrue_Variable_values = null;
036        node.isDAafterFalse_Variable_values = null;
037        node.isDAafter_Variable_values = null;
038        node.isDUafter_Variable_values = null;
039        node.next_test_label_computed = false;
040        node.in$Circle(false);
041        node.is$Final(false);
042        return node;
043      }
044    /**
045     * @apilevel internal
046     */
047      @SuppressWarnings({"unchecked", "cast"})
048    public AndLogicalExpr copy() {
049      
050      try {
051        AndLogicalExpr node = (AndLogicalExpr) clone();
052        node.parent = null;
053        if(children != null)
054          node.children = (ASTNode[]) children.clone();
055        
056        return node;
057      } catch (CloneNotSupportedException e) {
058        throw new Error("Error: clone not supported for " + getClass().getName());
059      }
060      
061    }/**
062     * Create a deep copy of the AST subtree at this node.
063     * The copy is dangling, i.e. has no parent.
064     * @return dangling copy of the subtree at this node
065     * @apilevel low-level
066     */
067      @SuppressWarnings({"unchecked", "cast"})
068    public AndLogicalExpr fullCopy() {
069      
070      AndLogicalExpr tree = (AndLogicalExpr) copy();
071      if (children != null) {
072        for (int i = 0; i < children.length; ++i) {
073          
074          ASTNode child = (ASTNode) children[i];
075          if(child != null) {
076            child = child.fullCopy();
077            tree.setChild(child, i);
078          }
079        }
080      }
081      return tree;
082      
083    }  /**
084       * @ast method 
085       * @aspect CreateBCode
086       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1086
087       */
088      public void emitEvalBranch(CodeGeneration gen) {
089        getLeftOperand().emitEvalBranch(gen);
090        gen.addLabel(next_test_label());
091        if(getLeftOperand().canBeTrue()) {
092          getRightOperand().emitEvalBranch(gen);
093          if(getRightOperand().canBeTrue())
094            gen.emitGoto(true_label());
095        }
096      }
097      /**
098       * @ast method 
099       * 
100       */
101      public AndLogicalExpr() {
102        super();
103    
104    
105      }
106      /**
107       * Initializes the child array to the correct size.
108       * Initializes List and Opt nta children.
109       * @apilevel internal
110       * @ast method
111       * @ast method 
112       * 
113       */
114      public void init$Children() {
115        children = new ASTNode[2];
116      }
117      /**
118       * @ast method 
119       * 
120       */
121      public AndLogicalExpr(Expr p0, Expr p1) {
122        setChild(p0, 0);
123        setChild(p1, 1);
124      }
125      /**
126       * @apilevel low-level
127       * @ast method 
128       * 
129       */
130      protected int numChildren() {
131        return 2;
132      }
133      /**
134       * @apilevel internal
135       * @ast method 
136       * 
137       */
138      public boolean mayHaveRewrite() {
139        return false;
140      }
141      /**
142       * Replaces the LeftOperand child.
143       * @param node The new node to replace the LeftOperand child.
144       * @apilevel high-level
145       * @ast method 
146       * 
147       */
148      public void setLeftOperand(Expr node) {
149        setChild(node, 0);
150      }
151      /**
152       * Retrieves the LeftOperand child.
153       * @return The current node used as the LeftOperand child.
154       * @apilevel high-level
155       * @ast method 
156       * 
157       */
158      public Expr getLeftOperand() {
159        return (Expr)getChild(0);
160      }
161      /**
162       * Retrieves the LeftOperand child.
163       * <p><em>This method does not invoke AST transformations.</em></p>
164       * @return The current node used as the LeftOperand child.
165       * @apilevel low-level
166       * @ast method 
167       * 
168       */
169      public Expr getLeftOperandNoTransform() {
170        return (Expr)getChildNoTransform(0);
171      }
172      /**
173       * Replaces the RightOperand child.
174       * @param node The new node to replace the RightOperand child.
175       * @apilevel high-level
176       * @ast method 
177       * 
178       */
179      public void setRightOperand(Expr node) {
180        setChild(node, 1);
181      }
182      /**
183       * Retrieves the RightOperand child.
184       * @return The current node used as the RightOperand child.
185       * @apilevel high-level
186       * @ast method 
187       * 
188       */
189      public Expr getRightOperand() {
190        return (Expr)getChild(1);
191      }
192      /**
193       * Retrieves the RightOperand child.
194       * <p><em>This method does not invoke AST transformations.</em></p>
195       * @return The current node used as the RightOperand child.
196       * @apilevel low-level
197       * @ast method 
198       * 
199       */
200      public Expr getRightOperandNoTransform() {
201        return (Expr)getChildNoTransform(1);
202      }
203      /**
204       * @attribute syn
205       * @aspect ConstantExpression
206       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/ConstantExpression.jrag:91
207       */
208      public Constant constant() {
209        ASTNode$State state = state();
210        try {  return Constant.create(left().constant().booleanValue() && right().constant().booleanValue());  }
211        finally {
212        }
213      }
214      protected java.util.Map isDAafterTrue_Variable_values;
215      /**
216       * @attribute syn
217       * @aspect DA
218       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:362
219       */
220      @SuppressWarnings({"unchecked", "cast"})
221      public boolean isDAafterTrue(Variable v) {
222        Object _parameters = v;
223        if(isDAafterTrue_Variable_values == null) isDAafterTrue_Variable_values = new java.util.HashMap(4);
224        if(isDAafterTrue_Variable_values.containsKey(_parameters)) {
225          return ((Boolean)isDAafterTrue_Variable_values.get(_parameters)).booleanValue();
226        }
227          ASTNode$State state = state();
228      int num = state.boundariesCrossed;
229      boolean isFinal = this.is$Final();
230        boolean isDAafterTrue_Variable_value = isDAafterTrue_compute(v);
231      if(isFinal && num == state().boundariesCrossed){ isDAafterTrue_Variable_values.put(_parameters, Boolean.valueOf(isDAafterTrue_Variable_value)); }
232            return isDAafterTrue_Variable_value;
233      }
234      /**
235       * @apilevel internal
236       */
237      private boolean isDAafterTrue_compute(Variable v) {  return getRightOperand().isDAafterTrue(v) || isFalse();  }
238      protected java.util.Map isDAafterFalse_Variable_values;
239      /**
240       * @attribute syn
241       * @aspect DA
242       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:364
243       */
244      @SuppressWarnings({"unchecked", "cast"})
245      public boolean isDAafterFalse(Variable v) {
246        Object _parameters = v;
247        if(isDAafterFalse_Variable_values == null) isDAafterFalse_Variable_values = new java.util.HashMap(4);
248        if(isDAafterFalse_Variable_values.containsKey(_parameters)) {
249          return ((Boolean)isDAafterFalse_Variable_values.get(_parameters)).booleanValue();
250        }
251          ASTNode$State state = state();
252      int num = state.boundariesCrossed;
253      boolean isFinal = this.is$Final();
254        boolean isDAafterFalse_Variable_value = isDAafterFalse_compute(v);
255      if(isFinal && num == state().boundariesCrossed){ isDAafterFalse_Variable_values.put(_parameters, Boolean.valueOf(isDAafterFalse_Variable_value)); }
256            return isDAafterFalse_Variable_value;
257      }
258      /**
259       * @apilevel internal
260       */
261      private boolean isDAafterFalse_compute(Variable v) {  return (getLeftOperand().isDAafterFalse(v) && getRightOperand().isDAafterFalse(v)) || isTrue();  }
262      protected java.util.Map isDAafter_Variable_values;
263      /**
264       * @attribute syn
265       * @aspect DA
266       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:370
267       */
268      @SuppressWarnings({"unchecked", "cast"})
269      public boolean isDAafter(Variable v) {
270        Object _parameters = v;
271        if(isDAafter_Variable_values == null) isDAafter_Variable_values = new java.util.HashMap(4);
272        if(isDAafter_Variable_values.containsKey(_parameters)) {
273          return ((Boolean)isDAafter_Variable_values.get(_parameters)).booleanValue();
274        }
275          ASTNode$State state = state();
276      int num = state.boundariesCrossed;
277      boolean isFinal = this.is$Final();
278        boolean isDAafter_Variable_value = isDAafter_compute(v);
279      if(isFinal && num == state().boundariesCrossed){ isDAafter_Variable_values.put(_parameters, Boolean.valueOf(isDAafter_Variable_value)); }
280            return isDAafter_Variable_value;
281      }
282      /**
283       * @apilevel internal
284       */
285      private boolean isDAafter_compute(Variable v) {  return isDAafterTrue(v) && isDAafterFalse(v);  }
286      /**
287       * @attribute syn
288       * @aspect DU
289       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:702
290       */
291      public boolean isDUafterTrue(Variable v) {
292        ASTNode$State state = state();
293        try {  return getRightOperand().isDUafterTrue(v);  }
294        finally {
295        }
296      }
297      /**
298       * @attribute syn
299       * @aspect DU
300       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:703
301       */
302      public boolean isDUafterFalse(Variable v) {
303        ASTNode$State state = state();
304        try {  return getLeftOperand().isDUafterFalse(v) && getRightOperand().isDUafterFalse(v);  }
305        finally {
306        }
307      }
308      protected java.util.Map isDUafter_Variable_values;
309      /**
310       * @attribute syn
311       * @aspect DU
312       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:806
313       */
314      @SuppressWarnings({"unchecked", "cast"})
315      public boolean isDUafter(Variable v) {
316        Object _parameters = v;
317        if(isDUafter_Variable_values == null) isDUafter_Variable_values = new java.util.HashMap(4);
318        if(isDUafter_Variable_values.containsKey(_parameters)) {
319          return ((Boolean)isDUafter_Variable_values.get(_parameters)).booleanValue();
320        }
321          ASTNode$State state = state();
322      int num = state.boundariesCrossed;
323      boolean isFinal = this.is$Final();
324        boolean isDUafter_Variable_value = isDUafter_compute(v);
325      if(isFinal && num == state().boundariesCrossed){ isDUafter_Variable_values.put(_parameters, Boolean.valueOf(isDUafter_Variable_value)); }
326            return isDUafter_Variable_value;
327      }
328      /**
329       * @apilevel internal
330       */
331      private boolean isDUafter_compute(Variable v) {  return isDUafterTrue(v) && isDUafterFalse(v);  }
332      /**
333       * @attribute syn
334       * @aspect PrettyPrint
335       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:400
336       */
337      public String printOp() {
338        ASTNode$State state = state();
339        try {  return " && ";  }
340        finally {
341        }
342      }
343      /**
344       * @attribute syn
345       * @aspect CreateBCode
346       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1007
347       */
348      public boolean canBeTrue() {
349        ASTNode$State state = state();
350        try {  return getLeftOperand().canBeTrue() && getRightOperand().canBeTrue();  }
351        finally {
352        }
353      }
354      /**
355       * @attribute syn
356       * @aspect CreateBCode
357       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1017
358       */
359      public boolean canBeFalse() {
360        ASTNode$State state = state();
361        try {  return getLeftOperand().canBeFalse() || getRightOperand().canBeFalse();  }
362        finally {
363        }
364      }
365      /**
366       * @apilevel internal
367       */
368      protected boolean next_test_label_computed = false;
369      /**
370       * @apilevel internal
371       */
372      protected int next_test_label_value;
373      /**
374       * @attribute syn
375       * @aspect CreateBCode
376       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1095
377       */
378      @SuppressWarnings({"unchecked", "cast"})
379      public int next_test_label() {
380        if(next_test_label_computed) {
381          return next_test_label_value;
382        }
383          ASTNode$State state = state();
384      int num = state.boundariesCrossed;
385      boolean isFinal = this.is$Final();
386        next_test_label_value = next_test_label_compute();
387      if(isFinal && num == state().boundariesCrossed){ next_test_label_computed = true; }
388            return next_test_label_value;
389      }
390      /**
391       * @apilevel internal
392       */
393      private int next_test_label_compute() {  return hostType().constantPool().newLabel();  }
394      /**
395       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:368
396       * @apilevel internal
397       */
398      public boolean Define_boolean_isDAbefore(ASTNode caller, ASTNode child, Variable v) {
399        if(caller == getRightOperandNoTransform()) {
400          return getLeftOperand().isDAafterTrue(v);
401        }
402        else if(caller == getLeftOperandNoTransform()) {
403          return isDAbefore(v);
404        }
405        else {      return super.Define_boolean_isDAbefore(caller, child, v);
406        }
407      }
408      /**
409       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:805
410       * @apilevel internal
411       */
412      public boolean Define_boolean_isDUbefore(ASTNode caller, ASTNode child, Variable v) {
413        if(caller == getRightOperandNoTransform()) {
414          return getLeftOperand().isDUafterTrue(v);
415        }
416        else if(caller == getLeftOperandNoTransform()) {
417          return isDUbefore(v);
418        }
419        else {      return super.Define_boolean_isDUbefore(caller, child, v);
420        }
421      }
422      /**
423       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:999
424       * @apilevel internal
425       */
426      public int Define_int_condition_false_label(ASTNode caller, ASTNode child) {
427        if(caller == getRightOperandNoTransform()) {
428          return false_label();
429        }
430        else if(caller == getLeftOperandNoTransform()) {
431          return false_label();
432        }
433        else {      return getParent().Define_int_condition_false_label(this, caller);
434        }
435      }
436      /**
437       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1000
438       * @apilevel internal
439       */
440      public int Define_int_condition_true_label(ASTNode caller, ASTNode child) {
441        if(caller == getRightOperandNoTransform()) {
442          return true_label();
443        }
444        else if(caller == getLeftOperandNoTransform()) {
445          return next_test_label();
446        }
447        else {      return getParent().Define_int_condition_true_label(this, caller);
448        }
449      }
450      /**
451       * @apilevel internal
452       */
453      public ASTNode rewriteTo() {
454        return super.rewriteTo();
455      }
456    }