require "./util"

module Ameba::AST
  # A generic entity to represent a branchable Crystal node.
  # For example, `Crystal::If`, `Crystal::Unless`, `Crystal::While`
  # are branchables.
  #
  # ```
  # white a > 100 # Branchable A
  #   if b > 2    # Branchable B
  #     a += 1
  #   end
  # end
  # ```
  class Branchable
    include Util

    getter branches = [] of Crystal::ASTNode

    # The actual Crystal node.
    getter node : Crystal::ASTNode

    # Parent branchable (if any)
    getter parent : Branchable?

    delegate to_s, to: @node
    delegate location, to: @node
    delegate end_location, to: @node

    # Creates a new branchable
    #
    # ```
    # Branchable.new(node, parent_branchable)
    # ```
    def initialize(@node, @parent = nil)
    end

    # Returns true if this node or one of the parent branchables is a loop, false otherwise.
    def loop?
      loop?(node) || parent.try(&.loop?) || false
    end
  end
end
