package org.checkerframework.dataflow.cfg.builder;

import org.checkerframework.dataflow.analysis.Store.FlowRule;
import org.checkerframework.dataflow.cfg.builder.ExtendedNode.ExtendedNodeType;

/** An extended node of type {@link ExtendedNodeType#UNCONDITIONAL_JUMP}. */
/*package-private*/ class UnconditionalJump extends ExtendedNode {

  /** The jump target label. */
  protected final Label jumpTarget;

  /** The flow rule for this edge. */
  protected final FlowRule flowRule;

  /**
   * Construct an UnconditionalJump.
   *
   * @param jumpTarget the jump target label
   */
  public UnconditionalJump(Label jumpTarget) {
    this(jumpTarget, FlowRule.EACH_TO_EACH);
  }

  /**
   * Construct an UnconditionalJump, specifying its flow rule.
   *
   * @param jumpTarget the jump target label
   * @param flowRule the flow rule for this edge
   */
  public UnconditionalJump(Label jumpTarget, FlowRule flowRule) {
    super(ExtendedNodeType.UNCONDITIONAL_JUMP);
    assert jumpTarget != null;
    this.jumpTarget = jumpTarget;
    this.flowRule = flowRule;
  }

  @Override
  public Label getLabel() {
    return jumpTarget;
  }

  /**
   * Returns the flow rule for this edge.
   *
   * @return the flow rule for this edge
   */
  public FlowRule getFlowRule() {
    return flowRule;
  }

  /**
   * Produce a string representation.
   *
   * @return a string representation
   * @see org.checkerframework.dataflow.cfg.builder.PhaseOneResult#nodeToString
   */
  @Override
  public String toString() {
    return "JumpMarker(" + getLabel() + ")";
  }

  @Override
  public String toStringDebug() {
    return toString();
  }
}
