001    /* This file was generated with JastAdd2 (http://jastadd.org) version 2.1.13-12-g880e696 */
002    package org.extendj.ast;
003    
004    import java.util.HashSet;
005    import java.io.File;
006    import java.util.Set;
007    import java.util.Collections;
008    import java.util.Collection;
009    import java.util.ArrayList;
010    import beaver.*;
011    import java.util.*;
012    import java.io.ByteArrayOutputStream;
013    import java.io.PrintStream;
014    import java.lang.reflect.InvocationTargetException;
015    import java.lang.reflect.Method;
016    import org.jastadd.util.*;
017    import java.util.zip.*;
018    import java.io.*;
019    import org.jastadd.util.PrettyPrintable;
020    import org.jastadd.util.PrettyPrinter;
021    import java.io.FileNotFoundException;
022    import java.io.BufferedInputStream;
023    import java.io.DataInputStream;
024    /**
025     * @ast node
026     * @declaredat /home/jesper/git/extendj/java4/grammar/Java.ast:128
027     * @production ParExpr : {@link PrimaryExpr} ::= <span class="component">{@link Expr}</span>;
028    
029     */
030    public class ParExpr extends PrimaryExpr implements Cloneable {
031      /**
032       * @aspect Java4PrettyPrint
033       * @declaredat /home/jesper/git/extendj/java4/frontend/PrettyPrint.jadd:146
034       */
035      public void prettyPrint(PrettyPrinter out) {
036        out.print("(");
037        out.print(getExpr());
038        out.print(")");
039      }
040      /**
041       * @aspect TypeCheck
042       * @declaredat /home/jesper/git/extendj/java4/frontend/TypeCheck.jrag:310
043       */
044      public void typeCheck() {
045        if (getExpr().isTypeAccess()) {
046          errorf("%s is a type and may not be used in parenthesized expression", getExpr().prettyPrint());
047        }
048      }
049      /**
050       * @aspect CreateBCode
051       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1125
052       */
053      public void branchTrue(CodeGeneration gen, int target) {
054        // branch when true
055        getExpr().branchTrue(gen, target);
056      }
057      /**
058       * @aspect CreateBCode
059       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1240
060       */
061      public void branchFalse(CodeGeneration gen, int target) {
062        // branch when false
063        getExpr().branchFalse(gen, target);
064      }
065      /**
066       * @declaredat ASTNode:1
067       */
068      public ParExpr() {
069        super();
070      }
071      /**
072       * Initializes the child array to the correct size.
073       * Initializes List and Opt nta children.
074       * @apilevel internal
075       * @ast method
076       * @declaredat ASTNode:10
077       */
078      public void init$Children() {
079        children = new ASTNode[1];
080      }
081      /**
082       * @declaredat ASTNode:13
083       */
084      public ParExpr(Expr p0) {
085        setChild(p0, 0);
086      }
087      /**
088       * @apilevel low-level
089       * @declaredat ASTNode:19
090       */
091      protected int numChildren() {
092        return 1;
093      }
094      /**
095       * @apilevel internal
096       * @declaredat ASTNode:25
097       */
098      public boolean mayHaveRewrite() {
099        return false;
100      }
101      /**
102       * @apilevel internal
103       * @declaredat ASTNode:31
104       */
105      public void flushAttrCache() {
106        super.flushAttrCache();
107        type_reset();
108        compatibleStrictContext_TypeDecl_reset();
109        compatibleLooseContext_TypeDecl_reset();
110        pertinentToApplicability_Expr_BodyDecl_int_reset();
111        moreSpecificThan_TypeDecl_TypeDecl_reset();
112        potentiallyCompatible_TypeDecl_BodyDecl_reset();
113        isBooleanExpression_reset();
114        isPolyExpression_reset();
115        assignConversionTo_TypeDecl_reset();
116      }
117      /**
118       * @apilevel internal
119       * @declaredat ASTNode:46
120       */
121      public void flushCollectionCache() {
122        super.flushCollectionCache();
123      }
124      /**
125       * @apilevel internal
126       * @declaredat ASTNode:52
127       */
128      public void flushRewriteCache() {
129        super.flushRewriteCache();
130      }
131      /**
132       * @apilevel internal
133       * @declaredat ASTNode:58
134       */
135      public ParExpr clone() throws CloneNotSupportedException {
136        ParExpr node = (ParExpr) super.clone();
137        return node;
138      }
139      /**
140       * @apilevel internal
141       * @declaredat ASTNode:65
142       */
143      public ParExpr copy() {
144        try {
145          ParExpr node = (ParExpr) clone();
146          node.parent = null;
147          if (children != null) {
148            node.children = (ASTNode[]) children.clone();
149          }
150          return node;
151        } catch (CloneNotSupportedException e) {
152          throw new Error("Error: clone not supported for " + getClass().getName());
153        }
154      }
155      /**
156       * Create a deep copy of the AST subtree at this node.
157       * The copy is dangling, i.e. has no parent.
158       * @return dangling copy of the subtree at this node
159       * @apilevel low-level
160       * @deprecated Please use treeCopy or treeCopyNoTransform instead
161       * @declaredat ASTNode:84
162       */
163      @Deprecated
164      public ParExpr fullCopy() {
165        return treeCopyNoTransform();
166      }
167      /**
168       * Create a deep copy of the AST subtree at this node.
169       * The copy is dangling, i.e. has no parent.
170       * @return dangling copy of the subtree at this node
171       * @apilevel low-level
172       * @declaredat ASTNode:94
173       */
174      public ParExpr treeCopyNoTransform() {
175        ParExpr tree = (ParExpr) copy();
176        if (children != null) {
177          for (int i = 0; i < children.length; ++i) {
178            ASTNode child = (ASTNode) children[i];
179            if (child != null) {
180              child = child.treeCopyNoTransform();
181              tree.setChild(child, i);
182            }
183          }
184        }
185        return tree;
186      }
187      /**
188       * Create a deep copy of the AST subtree at this node.
189       * The subtree of this node is traversed to trigger rewrites before copy.
190       * The copy is dangling, i.e. has no parent.
191       * @return dangling copy of the subtree at this node
192       * @apilevel low-level
193       * @declaredat ASTNode:114
194       */
195      public ParExpr treeCopy() {
196        doFullTraversal();
197        return treeCopyNoTransform();
198      }
199      /**
200       * @apilevel internal
201       * @declaredat ASTNode:121
202       */
203      protected boolean is$Equal(ASTNode node) {
204        return super.is$Equal(node);    
205      }
206      /**
207       * Replaces the Expr child.
208       * @param node The new node to replace the Expr child.
209       * @apilevel high-level
210       */
211      public void setExpr(Expr node) {
212        setChild(node, 0);
213      }
214      /**
215       * Retrieves the Expr child.
216       * @return The current node used as the Expr child.
217       * @apilevel high-level
218       */
219      @ASTNodeAnnotation.Child(name="Expr")
220      public Expr getExpr() {
221        return (Expr) getChild(0);
222      }
223      /**
224       * Retrieves the Expr child.
225       * <p><em>This method does not invoke AST transformations.</em></p>
226       * @return The current node used as the Expr child.
227       * @apilevel low-level
228       */
229      public Expr getExprNoTransform() {
230        return (Expr) getChildNoTransform(0);
231      }
232      /**
233       * @attribute syn
234       * @aspect ConstantExpression
235       * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:32
236       */
237      @ASTNodeAnnotation.Attribute
238      public Constant constant() {
239        Constant constant_value = getExpr().constant();
240    
241        return constant_value;
242      }
243      /**
244       * @attribute syn
245       * @aspect ConstantExpression
246       * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:254
247       */
248      @ASTNodeAnnotation.Attribute
249      public boolean isConstant() {
250        boolean isConstant_value = getExpr().isConstant();
251    
252        return isConstant_value;
253      }
254      /**
255       * @attribute syn
256       * @aspect ConstantExpression
257       * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:283
258       */
259      @ASTNodeAnnotation.Attribute
260      public boolean isTrue() {
261        boolean isTrue_value = getExpr().isTrue();
262    
263        return isTrue_value;
264      }
265      /**
266       * @attribute syn
267       * @aspect ConstantExpression
268       * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:284
269       */
270      @ASTNodeAnnotation.Attribute
271      public boolean isFalse() {
272        boolean isFalse_value = getExpr().isFalse();
273    
274        return isFalse_value;
275      }
276      /**
277       * @attribute syn
278       * @aspect DefiniteAssignment
279       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:81
280       */
281      @ASTNodeAnnotation.Attribute
282      public Variable varDecl() {
283        Variable varDecl_value = getExpr().varDecl();
284    
285        return varDecl_value;
286      }
287      /**
288       * @attribute syn
289       * @aspect DA
290       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:374
291       */
292      @ASTNodeAnnotation.Attribute
293      public boolean isDAafterTrue(Variable v) {
294        boolean isDAafterTrue_Variable_value = isFalse() || getExpr().isDAafterTrue(v);
295    
296        return isDAafterTrue_Variable_value;
297      }
298      /**
299       * @attribute syn
300       * @aspect DA
301       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:375
302       */
303      @ASTNodeAnnotation.Attribute
304      public boolean isDAafterFalse(Variable v) {
305        boolean isDAafterFalse_Variable_value = isTrue() || getExpr().isDAafterFalse(v);
306    
307        return isDAafterFalse_Variable_value;
308      }
309      /**
310       * @attribute syn
311       * @aspect DA
312       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:259
313       */
314      @ASTNodeAnnotation.Attribute
315      public boolean isDAafter(Variable v) {
316        boolean isDAafter_Variable_value = getExpr().isDAafter(v);
317    
318        return isDAafter_Variable_value;
319      }
320      /**
321       * @attribute syn
322       * @aspect DU
323       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:791
324       */
325      @ASTNodeAnnotation.Attribute
326      public boolean isDUafterTrue(Variable v) {
327        boolean isDUafterTrue_Variable_value = getExpr().isDUafterTrue(v);
328    
329        return isDUafterTrue_Variable_value;
330      }
331      /**
332       * @attribute syn
333       * @aspect DU
334       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:792
335       */
336      @ASTNodeAnnotation.Attribute
337      public boolean isDUafterFalse(Variable v) {
338        boolean isDUafterFalse_Variable_value = getExpr().isDUafterFalse(v);
339    
340        return isDUafterFalse_Variable_value;
341      }
342      /**
343       * @attribute syn
344       * @aspect DU
345       * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:783
346       */
347      @ASTNodeAnnotation.Attribute
348      public boolean isDUafter(Variable v) {
349        boolean isDUafter_Variable_value = getExpr().isDUafter(v);
350    
351        return isDUafter_Variable_value;
352      }
353      /**
354       * @attribute syn
355       * @aspect AccessTypes
356       * @declaredat /home/jesper/git/extendj/java4/frontend/ResolveAmbiguousNames.jrag:47
357       */
358      @ASTNodeAnnotation.Attribute
359      public boolean isSuperAccess() {
360        boolean isSuperAccess_value = getExpr().isSuperAccess();
361    
362        return isSuperAccess_value;
363      }
364      /**
365       * @attribute syn
366       * @aspect AccessTypes
367       * @declaredat /home/jesper/git/extendj/java4/frontend/ResolveAmbiguousNames.jrag:53
368       */
369      @ASTNodeAnnotation.Attribute
370      public boolean isThisAccess() {
371        boolean isThisAccess_value = getExpr().isThisAccess();
372    
373        return isThisAccess_value;
374      }
375      /**
376       * @apilevel internal
377       */
378      protected boolean type_computed = false;
379      /**
380       * @apilevel internal
381       */
382      protected TypeDecl type_value;
383      /**
384       * @apilevel internal
385       */
386      private void type_reset() {
387        type_computed = false;
388        type_value = null;
389      }
390      /**
391       * @attribute syn
392       * @aspect TypeAnalysis
393       * @declaredat /home/jesper/git/extendj/java4/frontend/TypeAnalysis.jrag:302
394       */
395      @ASTNodeAnnotation.Attribute
396      public TypeDecl type() {
397        ASTNode$State state = state();
398        if (type_computed) {
399          return type_value;
400        }
401        boolean intermediate = state.INTERMEDIATE_VALUE;
402        state.INTERMEDIATE_VALUE = false;
403        int num = state.boundariesCrossed;
404        boolean isFinal = this.is$Final();
405        type_value = getExpr().isTypeAccess() ? unknownType() : getExpr().type();
406        if (isFinal && num == state().boundariesCrossed) {
407          type_computed = true;
408        } else {
409        }
410        state.INTERMEDIATE_VALUE |= intermediate;
411    
412        return type_value;
413      }
414      /**
415       * @attribute syn
416       * @aspect TypeCheck
417       * @declaredat /home/jesper/git/extendj/java4/frontend/TypeCheck.jrag:36
418       */
419      @ASTNodeAnnotation.Attribute
420      public boolean isVariable() {
421        boolean isVariable_value = getExpr().isVariable();
422    
423        return isVariable_value;
424      }
425      /**
426       * @attribute syn
427       * @aspect TypeHierarchyCheck
428       * @declaredat /home/jesper/git/extendj/java4/frontend/TypeHierarchyCheck.jrag:199
429       */
430      @ASTNodeAnnotation.Attribute
431      public boolean staticContextQualifier() {
432        boolean staticContextQualifier_value = getExpr().staticContextQualifier();
433    
434        return staticContextQualifier_value;
435      }
436      /**
437       * @attribute syn
438       * @aspect CreateBCode
439       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:251
440       */
441      @ASTNodeAnnotation.Attribute
442      public boolean needsPop() {
443        boolean needsPop_value = getExpr().needsPop();
444    
445        return needsPop_value;
446      }
447      /**
448       * @attribute syn
449       * @aspect CreateBCode
450       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:263
451       */
452      @ASTNodeAnnotation.Attribute
453      public boolean isVarAccessWithAccessor() {
454        boolean isVarAccessWithAccessor_value = getExpr().isVarAccessWithAccessor();
455    
456        return isVarAccessWithAccessor_value;
457      }
458      /**
459       * @attribute syn
460       * @aspect CreateBCode
461       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1022
462       */
463      @ASTNodeAnnotation.Attribute
464      public boolean canBeTrue() {
465        boolean canBeTrue_value = getExpr().canBeTrue();
466    
467        return canBeTrue_value;
468      }
469      /**
470       * @attribute syn
471       * @aspect CreateBCode
472       * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1034
473       */
474      @ASTNodeAnnotation.Attribute
475      public boolean canBeFalse() {
476        boolean canBeFalse_value = getExpr().canBeFalse();
477    
478        return canBeFalse_value;
479      }
480      /**
481       * @attribute syn
482       * @aspect PreciseRethrow
483       * @declaredat /home/jesper/git/extendj/java7/frontend/PreciseRethrow.jrag:149
484       */
485      @ASTNodeAnnotation.Attribute
486      public boolean modifiedInScope(Variable var) {
487        boolean modifiedInScope_Variable_value = getExpr().modifiedInScope(var);
488    
489        return modifiedInScope_Variable_value;
490      }
491      /**
492       * @apilevel internal
493       */
494      protected java.util.Map compatibleStrictContext_TypeDecl_values;
495      /**
496       * @apilevel internal
497       */
498      private void compatibleStrictContext_TypeDecl_reset() {
499        compatibleStrictContext_TypeDecl_values = null;
500      }
501      /**
502       * @attribute syn
503       * @aspect MethodSignature18
504       * @declaredat /home/jesper/git/extendj/java8/frontend/MethodSignature.jrag:32
505       */
506      @ASTNodeAnnotation.Attribute
507      public boolean compatibleStrictContext(TypeDecl type) {
508        Object _parameters = type;
509        if (compatibleStrictContext_TypeDecl_values == null) compatibleStrictContext_TypeDecl_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
510        ASTNode$State state = state();
511        if (compatibleStrictContext_TypeDecl_values.containsKey(_parameters)) {
512          return (Boolean) compatibleStrictContext_TypeDecl_values.get(_parameters);
513        }
514        boolean intermediate = state.INTERMEDIATE_VALUE;
515        state.INTERMEDIATE_VALUE = false;
516        int num = state.boundariesCrossed;
517        boolean isFinal = this.is$Final();
518        boolean compatibleStrictContext_TypeDecl_value = getExpr().compatibleStrictContext(type);
519        if (isFinal && num == state().boundariesCrossed) {
520          compatibleStrictContext_TypeDecl_values.put(_parameters, compatibleStrictContext_TypeDecl_value);
521        } else {
522        }
523        state.INTERMEDIATE_VALUE |= intermediate;
524    
525        return compatibleStrictContext_TypeDecl_value;
526      }
527      /**
528       * @apilevel internal
529       */
530      protected java.util.Map compatibleLooseContext_TypeDecl_values;
531      /**
532       * @apilevel internal
533       */
534      private void compatibleLooseContext_TypeDecl_reset() {
535        compatibleLooseContext_TypeDecl_values = null;
536      }
537      /**
538       * @attribute syn
539       * @aspect MethodSignature18
540       * @declaredat /home/jesper/git/extendj/java8/frontend/MethodSignature.jrag:79
541       */
542      @ASTNodeAnnotation.Attribute
543      public boolean compatibleLooseContext(TypeDecl type) {
544        Object _parameters = type;
545        if (compatibleLooseContext_TypeDecl_values == null) compatibleLooseContext_TypeDecl_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
546        ASTNode$State state = state();
547        if (compatibleLooseContext_TypeDecl_values.containsKey(_parameters)) {
548          return (Boolean) compatibleLooseContext_TypeDecl_values.get(_parameters);
549        }
550        boolean intermediate = state.INTERMEDIATE_VALUE;
551        state.INTERMEDIATE_VALUE = false;
552        int num = state.boundariesCrossed;
553        boolean isFinal = this.is$Final();
554        boolean compatibleLooseContext_TypeDecl_value = getExpr().compatibleLooseContext(type);
555        if (isFinal && num == state().boundariesCrossed) {
556          compatibleLooseContext_TypeDecl_values.put(_parameters, compatibleLooseContext_TypeDecl_value);
557        } else {
558        }
559        state.INTERMEDIATE_VALUE |= intermediate;
560    
561        return compatibleLooseContext_TypeDecl_value;
562      }
563      /**
564       * @apilevel internal
565       */
566      protected java.util.Map pertinentToApplicability_Expr_BodyDecl_int_values;
567      /**
568       * @apilevel internal
569       */
570      private void pertinentToApplicability_Expr_BodyDecl_int_reset() {
571        pertinentToApplicability_Expr_BodyDecl_int_values = null;
572      }
573      /**
574       * @attribute syn
575       * @aspect MethodSignature18
576       * @declaredat /home/jesper/git/extendj/java8/frontend/MethodSignature.jrag:107
577       */
578      @ASTNodeAnnotation.Attribute
579      public boolean pertinentToApplicability(Expr access, BodyDecl decl, int argIndex) {
580        java.util.List _parameters = new java.util.ArrayList(3);
581        _parameters.add(access);
582        _parameters.add(decl);
583        _parameters.add(argIndex);
584        if (pertinentToApplicability_Expr_BodyDecl_int_values == null) pertinentToApplicability_Expr_BodyDecl_int_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
585        ASTNode$State state = state();
586        if (pertinentToApplicability_Expr_BodyDecl_int_values.containsKey(_parameters)) {
587          return (Boolean) pertinentToApplicability_Expr_BodyDecl_int_values.get(_parameters);
588        }
589        boolean intermediate = state.INTERMEDIATE_VALUE;
590        state.INTERMEDIATE_VALUE = false;
591        int num = state.boundariesCrossed;
592        boolean isFinal = this.is$Final();
593        boolean pertinentToApplicability_Expr_BodyDecl_int_value = getExpr().pertinentToApplicability(access, decl, argIndex);
594        if (isFinal && num == state().boundariesCrossed) {
595          pertinentToApplicability_Expr_BodyDecl_int_values.put(_parameters, pertinentToApplicability_Expr_BodyDecl_int_value);
596        } else {
597        }
598        state.INTERMEDIATE_VALUE |= intermediate;
599    
600        return pertinentToApplicability_Expr_BodyDecl_int_value;
601      }
602      /**
603       * @apilevel internal
604       */
605      protected java.util.Map moreSpecificThan_TypeDecl_TypeDecl_values;
606      /**
607       * @apilevel internal
608       */
609      private void moreSpecificThan_TypeDecl_TypeDecl_reset() {
610        moreSpecificThan_TypeDecl_TypeDecl_values = null;
611      }
612      /**
613       * Computes which type is more specific for a specific argument, as defined in 15.12.2.5
614       * @param type1
615       * @param type2
616       * @return {@code true} if type1 is more specific than type2, {@code false} otherwise
617       * @attribute syn
618       * @aspect MethodSignature18
619       * @declaredat /home/jesper/git/extendj/java8/frontend/MethodSignature.jrag:233
620       */
621      @ASTNodeAnnotation.Attribute
622      public boolean moreSpecificThan(TypeDecl type1, TypeDecl type2) {
623        java.util.List _parameters = new java.util.ArrayList(2);
624        _parameters.add(type1);
625        _parameters.add(type2);
626        if (moreSpecificThan_TypeDecl_TypeDecl_values == null) moreSpecificThan_TypeDecl_TypeDecl_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
627        ASTNode$State state = state();
628        if (moreSpecificThan_TypeDecl_TypeDecl_values.containsKey(_parameters)) {
629          return (Boolean) moreSpecificThan_TypeDecl_TypeDecl_values.get(_parameters);
630        }
631        boolean intermediate = state.INTERMEDIATE_VALUE;
632        state.INTERMEDIATE_VALUE = false;
633        int num = state.boundariesCrossed;
634        boolean isFinal = this.is$Final();
635        boolean moreSpecificThan_TypeDecl_TypeDecl_value = moreSpecificThan_compute(type1, type2);
636        if (isFinal && num == state().boundariesCrossed) {
637          moreSpecificThan_TypeDecl_TypeDecl_values.put(_parameters, moreSpecificThan_TypeDecl_TypeDecl_value);
638        } else {
639        }
640        state.INTERMEDIATE_VALUE |= intermediate;
641    
642        return moreSpecificThan_TypeDecl_TypeDecl_value;
643      }
644      /**
645       * @apilevel internal
646       */
647      private boolean moreSpecificThan_compute(TypeDecl type1, TypeDecl type2) {
648          if (super.moreSpecificThan(type1, type2)) {
649            return true;
650          }
651          return getExpr().moreSpecificThan(type1, type2);
652        }
653      /**
654       * @apilevel internal
655       */
656      protected java.util.Map potentiallyCompatible_TypeDecl_BodyDecl_values;
657      /**
658       * @apilevel internal
659       */
660      private void potentiallyCompatible_TypeDecl_BodyDecl_reset() {
661        potentiallyCompatible_TypeDecl_BodyDecl_values = null;
662      }
663      /**
664       * @attribute syn
665       * @aspect MethodSignature18
666       * @declaredat /home/jesper/git/extendj/java8/frontend/MethodSignature.jrag:466
667       */
668      @ASTNodeAnnotation.Attribute
669      public boolean potentiallyCompatible(TypeDecl type, BodyDecl candidateDecl) {
670        java.util.List _parameters = new java.util.ArrayList(2);
671        _parameters.add(type);
672        _parameters.add(candidateDecl);
673        if (potentiallyCompatible_TypeDecl_BodyDecl_values == null) potentiallyCompatible_TypeDecl_BodyDecl_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
674        ASTNode$State state = state();
675        if (potentiallyCompatible_TypeDecl_BodyDecl_values.containsKey(_parameters)) {
676          return (Boolean) potentiallyCompatible_TypeDecl_BodyDecl_values.get(_parameters);
677        }
678        boolean intermediate = state.INTERMEDIATE_VALUE;
679        state.INTERMEDIATE_VALUE = false;
680        int num = state.boundariesCrossed;
681        boolean isFinal = this.is$Final();
682        boolean potentiallyCompatible_TypeDecl_BodyDecl_value = getExpr().potentiallyCompatible(type, candidateDecl);
683        if (isFinal && num == state().boundariesCrossed) {
684          potentiallyCompatible_TypeDecl_BodyDecl_values.put(_parameters, potentiallyCompatible_TypeDecl_BodyDecl_value);
685        } else {
686        }
687        state.INTERMEDIATE_VALUE |= intermediate;
688    
689        return potentiallyCompatible_TypeDecl_BodyDecl_value;
690      }
691      /**
692       * @apilevel internal
693       */
694      protected boolean isBooleanExpression_computed = false;
695      /**
696       * @apilevel internal
697       */
698      protected boolean isBooleanExpression_value;
699      /**
700       * @apilevel internal
701       */
702      private void isBooleanExpression_reset() {
703        isBooleanExpression_computed = false;
704      }
705      /**
706       * @attribute syn
707       * @aspect PolyExpressions
708       * @declaredat /home/jesper/git/extendj/java8/frontend/PolyExpressions.jrag:29
709       */
710      @ASTNodeAnnotation.Attribute
711      public boolean isBooleanExpression() {
712        ASTNode$State state = state();
713        if (isBooleanExpression_computed) {
714          return isBooleanExpression_value;
715        }
716        boolean intermediate = state.INTERMEDIATE_VALUE;
717        state.INTERMEDIATE_VALUE = false;
718        int num = state.boundariesCrossed;
719        boolean isFinal = this.is$Final();
720        isBooleanExpression_value = getExpr().isBooleanExpression();
721        if (isFinal && num == state().boundariesCrossed) {
722          isBooleanExpression_computed = true;
723        } else {
724        }
725        state.INTERMEDIATE_VALUE |= intermediate;
726    
727        return isBooleanExpression_value;
728      }
729      /**
730       * @apilevel internal
731       */
732      protected boolean isPolyExpression_computed = false;
733      /**
734       * @apilevel internal
735       */
736      protected boolean isPolyExpression_value;
737      /**
738       * @apilevel internal
739       */
740      private void isPolyExpression_reset() {
741        isPolyExpression_computed = false;
742      }
743      /**
744       * @attribute syn
745       * @aspect PolyExpressions
746       * @declaredat /home/jesper/git/extendj/java8/frontend/PolyExpressions.jrag:80
747       */
748      @ASTNodeAnnotation.Attribute
749      public boolean isPolyExpression() {
750        ASTNode$State state = state();
751        if (isPolyExpression_computed) {
752          return isPolyExpression_value;
753        }
754        boolean intermediate = state.INTERMEDIATE_VALUE;
755        state.INTERMEDIATE_VALUE = false;
756        int num = state.boundariesCrossed;
757        boolean isFinal = this.is$Final();
758        isPolyExpression_value = getExpr().isPolyExpression();
759        if (isFinal && num == state().boundariesCrossed) {
760          isPolyExpression_computed = true;
761        } else {
762        }
763        state.INTERMEDIATE_VALUE |= intermediate;
764    
765        return isPolyExpression_value;
766      }
767      /**
768       * @apilevel internal
769       */
770      protected java.util.Map assignConversionTo_TypeDecl_values;
771      /**
772       * @apilevel internal
773       */
774      private void assignConversionTo_TypeDecl_reset() {
775        assignConversionTo_TypeDecl_values = null;
776      }
777      /**
778       * @attribute syn
779       * @aspect PolyExpressions
780       * @declaredat /home/jesper/git/extendj/java8/frontend/PolyExpressions.jrag:142
781       */
782      @ASTNodeAnnotation.Attribute
783      public boolean assignConversionTo(TypeDecl type) {
784        Object _parameters = type;
785        if (assignConversionTo_TypeDecl_values == null) assignConversionTo_TypeDecl_values = new org.jastadd.util.RobustMap(new java.util.HashMap());
786        ASTNode$State state = state();
787        if (assignConversionTo_TypeDecl_values.containsKey(_parameters)) {
788          return (Boolean) assignConversionTo_TypeDecl_values.get(_parameters);
789        }
790        boolean intermediate = state.INTERMEDIATE_VALUE;
791        state.INTERMEDIATE_VALUE = false;
792        int num = state.boundariesCrossed;
793        boolean isFinal = this.is$Final();
794        boolean assignConversionTo_TypeDecl_value = getExpr().assignConversionTo(type);
795        if (isFinal && num == state().boundariesCrossed) {
796          assignConversionTo_TypeDecl_values.put(_parameters, assignConversionTo_TypeDecl_value);
797        } else {
798        }
799        state.INTERMEDIATE_VALUE |= intermediate;
800    
801        return assignConversionTo_TypeDecl_value;
802      }
803      /**
804       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:30
805       * @apilevel internal
806       */
807      public TypeDecl Define_targetType(ASTNode caller, ASTNode child) {
808        if (caller == getExprNoTransform()) {
809          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:37
810          return targetType();
811        }
812        else {
813          return getParent().Define_targetType(this, caller);
814        }
815      }
816      protected boolean canDefine_targetType(ASTNode caller, ASTNode child) {
817        return true;
818      }
819      /**
820       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:196
821       * @apilevel internal
822       */
823      public boolean Define_assignmentContext(ASTNode caller, ASTNode child) {
824        if (caller == getExprNoTransform()) {
825          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:301
826          return assignmentContext();
827        }
828        else {
829          return getParent().Define_assignmentContext(this, caller);
830        }
831      }
832      protected boolean canDefine_assignmentContext(ASTNode caller, ASTNode child) {
833        return true;
834      }
835      /**
836       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:197
837       * @apilevel internal
838       */
839      public boolean Define_invocationContext(ASTNode caller, ASTNode child) {
840        if (caller == getExprNoTransform()) {
841          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:302
842          return invocationContext();
843        }
844        else {
845          return getParent().Define_invocationContext(this, caller);
846        }
847      }
848      protected boolean canDefine_invocationContext(ASTNode caller, ASTNode child) {
849        return true;
850      }
851      /**
852       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:198
853       * @apilevel internal
854       */
855      public boolean Define_castContext(ASTNode caller, ASTNode child) {
856        if (caller == getExprNoTransform()) {
857          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:303
858          return castContext();
859        }
860        else {
861          return getParent().Define_castContext(this, caller);
862        }
863      }
864      protected boolean canDefine_castContext(ASTNode caller, ASTNode child) {
865        return true;
866      }
867      /**
868       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:199
869       * @apilevel internal
870       */
871      public boolean Define_stringContext(ASTNode caller, ASTNode child) {
872        if (caller == getExprNoTransform()) {
873          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:304
874          return stringContext();
875        }
876        else {
877          return getParent().Define_stringContext(this, caller);
878        }
879      }
880      protected boolean canDefine_stringContext(ASTNode caller, ASTNode child) {
881        return true;
882      }
883      /**
884       * @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:200
885       * @apilevel internal
886       */
887      public boolean Define_numericContext(ASTNode caller, ASTNode child) {
888        if (caller == getExprNoTransform()) {
889          // @declaredat /home/jesper/git/extendj/java8/frontend/TargetType.jrag:305
890          return numericContext();
891        }
892        else {
893          return getParent().Define_numericContext(this, caller);
894        }
895      }
896      protected boolean canDefine_numericContext(ASTNode caller, ASTNode child) {
897        return true;
898      }
899      /**
900       * @apilevel internal
901       */
902      public ASTNode rewriteTo() {
903        return super.rewriteTo();
904      }
905    }