All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.extendj.ast.ConditionalExpr Maven / Gradle / Ivy

The newest version!
/* This file was generated with JastAdd2 (http://jastadd.org) version 2.3.0 */
package org.extendj.ast;
import java.util.ArrayList;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.util.Set;
import beaver.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.LinkedHashSet;
import java.util.*;
import org.jastadd.util.PrettyPrintable;
import org.jastadd.util.PrettyPrinter;
import java.util.zip.*;
import java.io.*;
import org.jastadd.util.*;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
/**
 * @ast node
 * @declaredat /home/jesper/git/extendj/java4/grammar/Java.ast:304
 * @astdecl ConditionalExpr : Expr ::= Condition:Expr TrueExpr:Expr FalseExpr:Expr;
 * @production ConditionalExpr : {@link Expr} ::= Condition:{@link Expr} TrueExpr:{@link Expr} FalseExpr:{@link Expr};

 */
public class ConditionalExpr extends Expr implements Cloneable {
  /**
   * @aspect Java4PrettyPrint
   * @declaredat /home/jesper/git/extendj/java4/frontend/PrettyPrint.jadd:236
   */
  public void prettyPrint(PrettyPrinter out) {
    out.print(getCondition());
    out.print(" ? ");
    out.print(getTrueExpr());
    out.print(" : ");
    out.print(getFalseExpr());
  }
  /**
   * @aspect CreateBCode
   * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1203
   */
  public void createBCode(CodeGeneration gen) {
    int end_label = -1;
    int false_label = -1;
    if (!getCondition().isConstant()) {
      false_label = gen.constantPool().newLabel();
      getCondition().branchFalse(gen, false_label);
    }
    if (getCondition().canBeTrue()) {
      getTrueExpr().createBCode(gen);
      getTrueExpr().emitCastTo(gen, type());
      if (getCondition().canBeFalse()) {
        end_label = gen.constantPool().newLabel();
        gen.GOTO(end_label);
      }
    }
    if (false_label != -1) {
      gen.addLabel(false_label);
    }
    if (getCondition().canBeFalse()) {
      getFalseExpr().createBCode(gen);
      getFalseExpr().emitCastTo(gen, type());
    }
    if (end_label != -1) {
      gen.addLabel(end_label);
    }
  }
  /**
   * @aspect CreateBCode
   * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1293
   */
  public void branchTrue(CodeGeneration gen, int target) {
    // Branch when true.
    int else_label = -1;
    int end_label = -1;
    if (!getCondition().isConstant()) {
      else_label = gen.constantPool().newLabel();
      getCondition().branchFalse(gen, else_label);
    }
    if (getCondition().canBeTrue()) {
      getTrueExpr().branchTrue(gen, target);
      if (getCondition().canBeFalse() && getTrueExpr().canBeFalse()) {
        end_label = gen.constantPool().newLabel();
        gen.GOTO(end_label);
      }
    }
    if (else_label != -1) {
      gen.addLabel(else_label);
    }
    if (getCondition().canBeFalse()) {
      getFalseExpr().branchTrue(gen, target);
    }
    if (end_label != -1) {
      gen.addLabel(end_label);
    }
  }
  /**
   * @aspect CreateBCode
   * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1404
   */
  public void branchFalse(CodeGeneration gen, int target) {
    // Branch when false.
    int else_label = -1;
    int end_label = -1;
    if (!getCondition().isConstant()) {
      else_label = gen.constantPool().newLabel();
      getCondition().branchFalse(gen, else_label);
    }
    if (getCondition().canBeTrue()) {
      getTrueExpr().branchFalse(gen, target);
      if (getCondition().canBeFalse() && getTrueExpr().canBeTrue()) {
        end_label = gen.constantPool().newLabel();
        gen.GOTO(end_label);
      }
    }
    if (else_label != -1) {
      gen.addLabel(else_label);
    }
    if (getCondition().canBeFalse()) {
      getFalseExpr().branchFalse(gen, target);
    }
    if (end_label != -1) {
      gen.addLabel(end_label);
    }
  }
  /**
   * @aspect AutoBoxingCodegen
   * @declaredat /home/jesper/git/extendj/java5/backend/AutoBoxingCodegen.jrag:460
   */
  public void emitBooleanCondition(CodeGeneration gen) {
    super.emitBooleanCondition(gen);
    if (type().isReferenceType()) {
      type().emitBoxingOperation(gen);
    }
  }
  /**
   * @declaredat ASTNode:1
   */
  public ConditionalExpr() {
    super();
  }
  /**
   * Initializes the child array to the correct size.
   * Initializes List and Opt nta children.
   * @apilevel internal
   * @ast method
   * @declaredat ASTNode:10
   */
  public void init$Children() {
    children = new ASTNode[3];
  }
  /**
   * @declaredat ASTNode:13
   */
  @ASTNodeAnnotation.Constructor(
    name = {"Condition", "TrueExpr", "FalseExpr"},
    type = {"Expr", "Expr", "Expr"},
    kind = {"Child", "Child", "Child"}
  )
  public ConditionalExpr(Expr p0, Expr p1, Expr p2) {
    setChild(p0, 0);
    setChild(p1, 1);
    setChild(p2, 2);
  }
  /** @apilevel low-level 
   * @declaredat ASTNode:24
   */
  protected int numChildren() {
    return 3;
  }
  /**
   * @apilevel internal
   * @declaredat ASTNode:30
   */
  public boolean mayHaveRewrite() {
    return false;
  }
  /** @apilevel internal 
   * @declaredat ASTNode:34
   */
  public void flushAttrCache() {
    super.flushAttrCache();
    constant_reset();
    isConstant_reset();
    type_reset();
    booleanOperator_reset();
    unassignedAfterTrue_Variable_reset();
    unassignedAfterFalse_Variable_reset();
    unassignedAfter_Variable_reset();
  }
  /** @apilevel internal 
   * @declaredat ASTNode:45
   */
  public void flushCollectionCache() {
    super.flushCollectionCache();
  }
  /** @apilevel internal 
   * @declaredat ASTNode:49
   */
  public ConditionalExpr clone() throws CloneNotSupportedException {
    ConditionalExpr node = (ConditionalExpr) super.clone();
    return node;
  }
  /** @apilevel internal 
   * @declaredat ASTNode:54
   */
  public ConditionalExpr copy() {
    try {
      ConditionalExpr node = (ConditionalExpr) clone();
      node.parent = null;
      if (children != null) {
        node.children = (ASTNode[]) children.clone();
      }
      return node;
    } catch (CloneNotSupportedException e) {
      throw new Error("Error: clone not supported for " + getClass().getName());
    }
  }
  /**
   * Create a deep copy of the AST subtree at this node.
   * The copy is dangling, i.e. has no parent.
   * @return dangling copy of the subtree at this node
   * @apilevel low-level
   * @deprecated Please use treeCopy or treeCopyNoTransform instead
   * @declaredat ASTNode:73
   */
  @Deprecated
  public ConditionalExpr fullCopy() {
    return treeCopyNoTransform();
  }
  /**
   * Create a deep copy of the AST subtree at this node.
   * The copy is dangling, i.e. has no parent.
   * @return dangling copy of the subtree at this node
   * @apilevel low-level
   * @declaredat ASTNode:83
   */
  public ConditionalExpr treeCopyNoTransform() {
    ConditionalExpr tree = (ConditionalExpr) copy();
    if (children != null) {
      for (int i = 0; i < children.length; ++i) {
        ASTNode child = (ASTNode) children[i];
        if (child != null) {
          child = child.treeCopyNoTransform();
          tree.setChild(child, i);
        }
      }
    }
    return tree;
  }
  /**
   * Create a deep copy of the AST subtree at this node.
   * The subtree of this node is traversed to trigger rewrites before copy.
   * The copy is dangling, i.e. has no parent.
   * @return dangling copy of the subtree at this node
   * @apilevel low-level
   * @declaredat ASTNode:103
   */
  public ConditionalExpr treeCopy() {
    ConditionalExpr tree = (ConditionalExpr) copy();
    if (children != null) {
      for (int i = 0; i < children.length; ++i) {
        ASTNode child = (ASTNode) getChild(i);
        if (child != null) {
          child = child.treeCopy();
          tree.setChild(child, i);
        }
      }
    }
    return tree;
  }
  /** @apilevel internal 
   * @declaredat ASTNode:117
   */
  protected boolean is$Equal(ASTNode node) {
    return super.is$Equal(node);    
  }
  /**
   * Replaces the Condition child.
   * @param node The new node to replace the Condition child.
   * @apilevel high-level
   */
  public void setCondition(Expr node) {
    setChild(node, 0);
  }
  /**
   * Retrieves the Condition child.
   * @return The current node used as the Condition child.
   * @apilevel high-level
   */
  @ASTNodeAnnotation.Child(name="Condition")
  public Expr getCondition() {
    return (Expr) getChild(0);
  }
  /**
   * Retrieves the Condition child.
   * 

This method does not invoke AST transformations.

* @return The current node used as the Condition child. * @apilevel low-level */ public Expr getConditionNoTransform() { return (Expr) getChildNoTransform(0); } /** * Replaces the TrueExpr child. * @param node The new node to replace the TrueExpr child. * @apilevel high-level */ public void setTrueExpr(Expr node) { setChild(node, 1); } /** * Retrieves the TrueExpr child. * @return The current node used as the TrueExpr child. * @apilevel high-level */ @ASTNodeAnnotation.Child(name="TrueExpr") public Expr getTrueExpr() { return (Expr) getChild(1); } /** * Retrieves the TrueExpr child. *

This method does not invoke AST transformations.

* @return The current node used as the TrueExpr child. * @apilevel low-level */ public Expr getTrueExprNoTransform() { return (Expr) getChildNoTransform(1); } /** * Replaces the FalseExpr child. * @param node The new node to replace the FalseExpr child. * @apilevel high-level */ public void setFalseExpr(Expr node) { setChild(node, 2); } /** * Retrieves the FalseExpr child. * @return The current node used as the FalseExpr child. * @apilevel high-level */ @ASTNodeAnnotation.Child(name="FalseExpr") public Expr getFalseExpr() { return (Expr) getChild(2); } /** * Retrieves the FalseExpr child. *

This method does not invoke AST transformations.

* @return The current node used as the FalseExpr child. * @apilevel low-level */ public Expr getFalseExprNoTransform() { return (Expr) getChildNoTransform(2); } /** * @aspect AutoBoxing * @declaredat /home/jesper/git/extendj/java5/frontend/AutoBoxing.jrag:252 */ private TypeDecl refined_AutoBoxing_ConditionalExpr_type() { TypeDecl second = getTrueExpr().type(); TypeDecl third = getFalseExpr().type(); if (second == third) { return second; } else if (second.isReferenceType() && third.isNull()) { return second; } else if (second.isNull() && third.isReferenceType()) { return third; } if (second.isPrimitiveType()) { if (!second.isNull() && third.isNull()) { return second.boxed(); } } else if (!second.unboxed().isUnknown()) { second = second.unboxed(); } if (third.isPrimitiveType()) { if (!third.isNull() && second.isNull()) { return third.boxed(); } } else if (!third.unboxed().isUnknown()) { third = third.unboxed(); } return conditionalExprType(second, third); } /** @apilevel internal */ private void constant_reset() { constant_computed = null; constant_value = null; } /** @apilevel internal */ protected ASTState.Cycle constant_computed = null; /** @apilevel internal */ protected Constant constant_value; /** * @attribute syn * @aspect ConstantExpression * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:85 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="ConstantExpression", declaredAt="/home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:85") public Constant constant() { ASTState state = state(); if (constant_computed == ASTState.NON_CYCLE || constant_computed == state().cycle()) { return constant_value; } constant_value = type().questionColon(getCondition().constant(), getTrueExpr().constant(),getFalseExpr().constant()); if (state().inCircle()) { constant_computed = state().cycle(); } else { constant_computed = ASTState.NON_CYCLE; } return constant_value; } /** @apilevel internal */ private void isConstant_reset() { isConstant_computed = null; } /** @apilevel internal */ protected ASTState.Cycle isConstant_computed = null; /** @apilevel internal */ protected boolean isConstant_value; /** * @attribute syn * @aspect ConstantExpression * @declaredat /home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:406 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="ConstantExpression", declaredAt="/home/jesper/git/extendj/java4/frontend/ConstantExpression.jrag:406") public boolean isConstant() { ASTState state = state(); if (isConstant_computed == ASTState.NON_CYCLE || isConstant_computed == state().cycle()) { return isConstant_value; } isConstant_value = getCondition().isConstant() && getTrueExpr().isConstant() && getFalseExpr().isConstant(); if (state().inCircle()) { isConstant_computed = state().cycle(); } else { isConstant_computed = ASTState.NON_CYCLE; } return isConstant_value; } /** @apilevel internal */ private void type_reset() { type_computed = null; type_value = null; } /** @apilevel internal */ protected ASTState.Cycle type_computed = null; /** @apilevel internal */ protected TypeDecl type_value; /** * @attribute syn * @aspect TypeAnalysis * @declaredat /home/jesper/git/extendj/java4/frontend/TypeAnalysis.jrag:295 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="TypeAnalysis", declaredAt="/home/jesper/git/extendj/java4/frontend/TypeAnalysis.jrag:295") public TypeDecl type() { ASTState state = state(); if (type_computed == ASTState.NON_CYCLE || type_computed == state().cycle()) { return type_value; } type_value = type_compute(); if (state().inCircle()) { type_computed = state().cycle(); } else { type_computed = ASTState.NON_CYCLE; } return type_value; } /** @apilevel internal */ private TypeDecl type_compute() { TypeDecl type = refined_AutoBoxing_ConditionalExpr_type(); if (type.isUnknown()) { TypeDecl trueType = getTrueExpr().type(); TypeDecl falseType = getFalseExpr().type(); if (!trueType.isReferenceType() && !trueType.boxed().isUnknown()) { trueType = trueType.boxed(); } if (!falseType.isReferenceType() && !falseType.boxed().isUnknown()) { falseType = falseType.boxed(); } ArrayList list = new ArrayList(); list.add(trueType); list.add(falseType); return type.lookupLUBType(list).lub(); } return type; } /** * Returns the type of a conditional expression, given the types of the * second and third operands. * @attribute syn * @aspect TypeAnalysis * @declaredat /home/jesper/git/extendj/java4/frontend/TypeAnalysis.jrag:395 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="TypeAnalysis", declaredAt="/home/jesper/git/extendj/java4/frontend/TypeAnalysis.jrag:395") public TypeDecl conditionalExprType(TypeDecl second, TypeDecl third) { { if (second == third) { return second; } if (second.isNumericType() && third.isNumericType()) { if (second.isByte() && third.isShort()) { return third; } if (second.isShort() && third.isByte()) { return second; } if ((second.isByte() || second.isShort() || second.isChar()) && third.isInt() && getFalseExpr().isConstant() && getFalseExpr().representableIn(second)) { return second; } if ((third.isByte() || third.isShort() || third.isChar()) && second.isInt() && getTrueExpr().isConstant() && getTrueExpr().representableIn(third)) { return third; } return second.binaryNumericPromotion(third); } else if (second.isBoolean() && third.isBoolean()) { return second; } else if (second.isReferenceType() && third.isNull()) { return second; } else if (second.isNull() && third.isReferenceType()) { return third; } else if (second.isReferenceType() && third.isReferenceType()) { if (second.assignConversionTo(third, null)) { return third; } if (third.assignConversionTo(second, null)) { return second; } return unknownType(); } else { return unknownType(); } } } /** @apilevel internal */ private void booleanOperator_reset() { booleanOperator_computed = null; } /** @apilevel internal */ protected ASTState.Cycle booleanOperator_computed = null; /** @apilevel internal */ protected boolean booleanOperator_value; /** * @attribute syn * @aspect DefiniteAssignment * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:253 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="DefiniteAssignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:253") public boolean booleanOperator() { ASTState state = state(); if (booleanOperator_computed == ASTState.NON_CYCLE || booleanOperator_computed == state().cycle()) { return booleanOperator_value; } booleanOperator_value = getTrueExpr().type().isBoolean() && getFalseExpr().type().isBoolean(); if (state().inCircle()) { booleanOperator_computed = state().cycle(); } else { booleanOperator_computed = ASTState.NON_CYCLE; } return booleanOperator_value; } /** * @attribute syn * @aspect DefiniteAssignment * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:375 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="DefiniteAssignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:375") public boolean assignedAfterTrue(Variable v) { boolean assignedAfterTrue_Variable_value = isFalse() || (getTrueExpr().assignedAfterTrue(v) && getFalseExpr().assignedAfterTrue(v)); return assignedAfterTrue_Variable_value; } /** * @attribute syn * @aspect DefiniteAssignment * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:377 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="DefiniteAssignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:377") public boolean assignedAfterFalse(Variable v) { boolean assignedAfterFalse_Variable_value = isTrue() || (getTrueExpr().assignedAfterFalse(v) && getFalseExpr().assignedAfterFalse(v)); return assignedAfterFalse_Variable_value; } /** * @attribute syn * @aspect DefiniteAssignment * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:268 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="DefiniteAssignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:268") public boolean assignedAfter(Variable v) { boolean assignedAfter_Variable_value = booleanOperator() ? assignedAfterTrue(v) && assignedAfterFalse(v) : getTrueExpr().assignedAfter(v) && getFalseExpr().assignedAfter(v); return assignedAfter_Variable_value; } /** @apilevel internal */ private void unassignedAfterTrue_Variable_reset() { unassignedAfterTrue_Variable_values = null; } protected java.util.Map unassignedAfterTrue_Variable_values; @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN, isCircular=true) @ASTNodeAnnotation.Source(aspect="DefiniteUnassignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:905") public boolean unassignedAfterTrue(Variable v) { Object _parameters = v; if (unassignedAfterTrue_Variable_values == null) unassignedAfterTrue_Variable_values = new java.util.HashMap(4); ASTState.CircularValue _value; if (unassignedAfterTrue_Variable_values.containsKey(_parameters)) { Object _cache = unassignedAfterTrue_Variable_values.get(_parameters); if (!(_cache instanceof ASTState.CircularValue)) { return (Boolean) _cache; } else { _value = (ASTState.CircularValue) _cache; } } else { _value = new ASTState.CircularValue(); unassignedAfterTrue_Variable_values.put(_parameters, _value); _value.value = true; } ASTState state = state(); if (!state.inCircle() || state.calledByLazyAttribute()) { state.enterCircle(); boolean new_unassignedAfterTrue_Variable_value; do { _value.cycle = state.nextCycle(); new_unassignedAfterTrue_Variable_value = getTrueExpr().unassignedAfterTrue(v) && getFalseExpr().unassignedAfterTrue(v); if (((Boolean)_value.value) != new_unassignedAfterTrue_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfterTrue_Variable_value; } } while (state.testAndClearChangeInCycle()); unassignedAfterTrue_Variable_values.put(_parameters, new_unassignedAfterTrue_Variable_value); state.leaveCircle(); return new_unassignedAfterTrue_Variable_value; } else if (_value.cycle != state.cycle()) { _value.cycle = state.cycle(); boolean new_unassignedAfterTrue_Variable_value = getTrueExpr().unassignedAfterTrue(v) && getFalseExpr().unassignedAfterTrue(v); if (((Boolean)_value.value) != new_unassignedAfterTrue_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfterTrue_Variable_value; } return new_unassignedAfterTrue_Variable_value; } else { return (Boolean) _value.value; } } /** @apilevel internal */ private void unassignedAfterFalse_Variable_reset() { unassignedAfterFalse_Variable_values = null; } protected java.util.Map unassignedAfterFalse_Variable_values; @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN, isCircular=true) @ASTNodeAnnotation.Source(aspect="DefiniteUnassignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:907") public boolean unassignedAfterFalse(Variable v) { Object _parameters = v; if (unassignedAfterFalse_Variable_values == null) unassignedAfterFalse_Variable_values = new java.util.HashMap(4); ASTState.CircularValue _value; if (unassignedAfterFalse_Variable_values.containsKey(_parameters)) { Object _cache = unassignedAfterFalse_Variable_values.get(_parameters); if (!(_cache instanceof ASTState.CircularValue)) { return (Boolean) _cache; } else { _value = (ASTState.CircularValue) _cache; } } else { _value = new ASTState.CircularValue(); unassignedAfterFalse_Variable_values.put(_parameters, _value); _value.value = true; } ASTState state = state(); if (!state.inCircle() || state.calledByLazyAttribute()) { state.enterCircle(); boolean new_unassignedAfterFalse_Variable_value; do { _value.cycle = state.nextCycle(); new_unassignedAfterFalse_Variable_value = getTrueExpr().unassignedAfterFalse(v) && getFalseExpr().unassignedAfterFalse(v); if (((Boolean)_value.value) != new_unassignedAfterFalse_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfterFalse_Variable_value; } } while (state.testAndClearChangeInCycle()); unassignedAfterFalse_Variable_values.put(_parameters, new_unassignedAfterFalse_Variable_value); state.leaveCircle(); return new_unassignedAfterFalse_Variable_value; } else if (_value.cycle != state.cycle()) { _value.cycle = state.cycle(); boolean new_unassignedAfterFalse_Variable_value = getTrueExpr().unassignedAfterFalse(v) && getFalseExpr().unassignedAfterFalse(v); if (((Boolean)_value.value) != new_unassignedAfterFalse_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfterFalse_Variable_value; } return new_unassignedAfterFalse_Variable_value; } else { return (Boolean) _value.value; } } /** @apilevel internal */ private void unassignedAfter_Variable_reset() { unassignedAfter_Variable_values = null; } protected java.util.Map unassignedAfter_Variable_values; @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN, isCircular=true) @ASTNodeAnnotation.Source(aspect="DefiniteUnassignment", declaredAt="/home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:899") public boolean unassignedAfter(Variable v) { Object _parameters = v; if (unassignedAfter_Variable_values == null) unassignedAfter_Variable_values = new java.util.HashMap(4); ASTState.CircularValue _value; if (unassignedAfter_Variable_values.containsKey(_parameters)) { Object _cache = unassignedAfter_Variable_values.get(_parameters); if (!(_cache instanceof ASTState.CircularValue)) { return (Boolean) _cache; } else { _value = (ASTState.CircularValue) _cache; } } else { _value = new ASTState.CircularValue(); unassignedAfter_Variable_values.put(_parameters, _value); _value.value = true; } ASTState state = state(); if (!state.inCircle() || state.calledByLazyAttribute()) { state.enterCircle(); boolean new_unassignedAfter_Variable_value; do { _value.cycle = state.nextCycle(); new_unassignedAfter_Variable_value = booleanOperator() ? unassignedAfterTrue(v) && unassignedAfterFalse(v) : getTrueExpr().unassignedAfter(v) && getFalseExpr().unassignedAfter(v); if (((Boolean)_value.value) != new_unassignedAfter_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfter_Variable_value; } } while (state.testAndClearChangeInCycle()); unassignedAfter_Variable_values.put(_parameters, new_unassignedAfter_Variable_value); state.leaveCircle(); return new_unassignedAfter_Variable_value; } else if (_value.cycle != state.cycle()) { _value.cycle = state.cycle(); boolean new_unassignedAfter_Variable_value = booleanOperator() ? unassignedAfterTrue(v) && unassignedAfterFalse(v) : getTrueExpr().unassignedAfter(v) && getFalseExpr().unassignedAfter(v); if (((Boolean)_value.value) != new_unassignedAfter_Variable_value) { state.setChangeInCycle(); _value.value = new_unassignedAfter_Variable_value; } return new_unassignedAfter_Variable_value; } else { return (Boolean) _value.value; } } /** * @attribute syn * @aspect CreateBCode * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1150 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="CreateBCode", declaredAt="/home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1150") public boolean canBeTrue() { boolean canBeTrue_value = type().isBoolean() && (getCondition().canBeTrue() && getTrueExpr().canBeTrue() || getCondition().canBeFalse() && getFalseExpr().canBeTrue()); return canBeTrue_value; } /** * @attribute syn * @aspect CreateBCode * @declaredat /home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1162 */ @ASTNodeAnnotation.Attribute(kind=ASTNodeAnnotation.Kind.SYN) @ASTNodeAnnotation.Source(aspect="CreateBCode", declaredAt="/home/jesper/git/extendj/java4/backend/CreateBCode.jrag:1162") public boolean canBeFalse() { boolean canBeFalse_value = type().isBoolean() && (getCondition().canBeTrue() && getTrueExpr().canBeFalse() || getCondition().canBeFalse() && getFalseExpr().canBeFalse()); return canBeFalse_value; } /** * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:256 * @apilevel internal */ public boolean Define_assignedBefore(ASTNode _callerNode, ASTNode _childNode, Variable v) { if (getFalseExprNoTransform() != null && _callerNode == getFalseExpr()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:463 return getCondition().assignedAfterFalse(v); } else if (getTrueExprNoTransform() != null && _callerNode == getTrueExpr()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:461 return getCondition().assignedAfterTrue(v); } else if (getConditionNoTransform() != null && _callerNode == getCondition()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:459 return assignedBefore(v); } else { return getParent().Define_assignedBefore(this, _callerNode, v); } } /** * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:256 * @apilevel internal * @return {@code true} if this node has an equation for the inherited attribute assignedBefore */ protected boolean canDefine_assignedBefore(ASTNode _callerNode, ASTNode _childNode, Variable v) { return true; } /** * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:887 * @apilevel internal */ public boolean Define_unassignedBefore(ASTNode _callerNode, ASTNode _childNode, Variable v) { if (getFalseExprNoTransform() != null && _callerNode == getFalseExpr()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:1059 return getCondition().unassignedAfterFalse(v); } else if (getTrueExprNoTransform() != null && _callerNode == getTrueExpr()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:1056 return getCondition().unassignedAfterTrue(v); } else if (getConditionNoTransform() != null && _callerNode == getCondition()) { // @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:1054 return unassignedBefore(v); } else { return getParent().Define_unassignedBefore(this, _callerNode, v); } } /** * @declaredat /home/jesper/git/extendj/java4/frontend/DefiniteAssignment.jrag:887 * @apilevel internal * @return {@code true} if this node has an equation for the inherited attribute unassignedBefore */ protected boolean canDefine_unassignedBefore(ASTNode _callerNode, ASTNode _childNode, Variable v) { return true; } /** @apilevel internal */ public ASTNode rewriteTo() { return super.rewriteTo(); } /** @apilevel internal */ public boolean canRewrite() { return false; } /** @apilevel internal */ protected void collect_contributors_CompilationUnit_problems(CompilationUnit _root, java.util.Map> _map) { // @declaredat /home/jesper/git/extendj/java4/frontend/TypeCheck.jrag:743 if (!getCondition().type().isBoolean()) { { java.util.Set contributors = _map.get(_root); if (contributors == null) { contributors = new java.util.LinkedHashSet(); _map.put((ASTNode) _root, contributors); } contributors.add(this); } } // @declaredat /home/jesper/git/extendj/java4/frontend/TypeCheck.jrag:748 if (type().isUnknown() && !getTrueExpr().type().isUnknown() && !getFalseExpr().type().isUnknown()) { { java.util.Set contributors = _map.get(_root); if (contributors == null) { contributors = new java.util.LinkedHashSet(); _map.put((ASTNode) _root, contributors); } contributors.add(this); } } super.collect_contributors_CompilationUnit_problems(_root, _map); } /** @apilevel internal */ protected void contributeTo_CompilationUnit_problems(LinkedList collection) { super.contributeTo_CompilationUnit_problems(collection); if (!getCondition().type().isBoolean()) { collection.add(error("The first operand of a conditional expression must be a boolean")); } if (type().isUnknown() && !getTrueExpr().type().isUnknown() && !getFalseExpr().type().isUnknown()) { collection.add(error("The types of the second and third operand in " + "this conditional expression do not match")); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy