class SyntaxTree::Statements

Experimental RBS support (using type sampling data from the type_fusion project).

# sig/syntax_tree/node.rbs

class SyntaxTree::Statements < SyntaxTree::Node
  def accept: (Visitor visitor) -> untyped
  def attach_comments: (SyntaxTree::Parser parser, Integer start_char, Integer end_char) -> untyped
  def bind: (SyntaxTree::Parser parser, Integer start_char, Integer start_column, Integer end_char, Integer end_column) -> untyped
  def child_nodes: () -> untyped
  
  type SyntaxTree__Statements_initialize_body = Array[SyntaxTree::Assign] | Array[SyntaxTree::Command] | Array[SyntaxTree::VoidStmt] | Array[SyntaxTree::CallNode] | Array[] | Array[SyntaxTree::Binary] | Array[SyntaxTree::StringLiteral] | Array[SyntaxTree::IfNode] | Array[SyntaxTree::Unary] | Array[SyntaxTree::UnlessNode] | Array[SyntaxTree::VarRef] | Array[SyntaxTree::MethodAddBlock] | Array[SyntaxTree::ArrayLiteral]
  
  def initialize: (body: SyntaxTree__Statements_initialize_body, location: SyntaxTree::Location) -> void
end

all comments get printed appropriately.
propagate that onto void_stmt nodes inside the stmts in order to make sure
stmts nodes will report back down the location information. We then
need to have the right location information, so all of the parent node of
have some special handling in order to handle empty statement lists. They
Normally we would just track those as a node that has an array body, but we
Everything that has a block of code inside of it has a list of statements.

def ===(other)

def ===(other)
  other.is_a?(Statements) && ArrayMatch.call(body, other.body)
end

def accept(visitor)

Experimental RBS support (using type sampling data from the type_fusion project).

def accept: (Visitor visitor) -> untyped

This signature was generated using 21 samples from 1 application.

def accept(visitor)
  visitor.visit_statements(self)
end

def attach_comments(parser, start_char, end_char)

Experimental RBS support (using type sampling data from the type_fusion project).

def attach_comments: (SyntaxTree::Parser parser, Integer start_char, Integer end_char) -> untyped

This signature was generated using 12 samples from 1 application.

body.
found while this statements list was being parsed and add them into the
As efficiently as possible, gather up all of the comments that have been
def attach_comments(parser, start_char, end_char)
  parser_comments = parser.comments
  comment_index = 0
  body_index = 0
  while comment_index < parser_comments.size
    comment = parser_comments[comment_index]
    location = comment.location
    if !comment.inline? && (start_char <= location.start_char) &&
         (end_char >= location.end_char) && !comment.ignore?
      while (node = body[body_index]) &&
              (
                node.is_a?(VoidStmt) ||
                  node.location.start_char < location.start_char
              )
        body_index += 1
      end
      if body_index != 0 &&
           body[body_index - 1].location.start_char < location.start_char &&
           body[body_index - 1].location.end_char > location.start_char
        # The previous node entirely encapsules the comment, so we don't
        # want to attach it here since it will get attached normally. This
        # is mostly in the case of hash and array literals.
        comment_index += 1
      else
        parser_comments.delete_at(comment_index)
        body.insert(body_index, comment)
      end
    else
      comment_index += 1
    end
  end
end

def bind(parser, start_char, start_column, end_char, end_column)

Experimental RBS support (using type sampling data from the type_fusion project).

def bind: (SyntaxTree::Parser parser, Integer start_char, Integer start_column, Integer end_char, Integer end_column) -> untyped

This signature was generated using 23 samples from 1 application.

def bind(parser, start_char, start_column, end_char, end_column)
  @location =
    Location.new(
      start_line: location.start_line,
      start_char: start_char,
      start_column: start_column,
      end_line: location.end_line,
      end_char: end_char,
      end_column: end_column
    )
  if (void_stmt = body[0]).is_a?(VoidStmt)
    location = void_stmt.location
    location =
      Location.new(
        start_line: location.start_line,
        start_char: start_char,
        start_column: start_column,
        end_line: location.end_line,
        end_char: start_char,
        end_column: end_column
      )
    body[0] = VoidStmt.new(location: location)
  end
  attach_comments(parser, start_char, end_char)
end

def bind_end(end_char, end_column)

def bind_end(end_char, end_column)
  @location =
    Location.new(
      start_line: location.start_line,
      start_char: location.start_char,
      start_column: location.start_column,
      end_line: location.end_line,
      end_char: end_char,
      end_column: end_column
    )
end

def child_nodes

Experimental RBS support (using type sampling data from the type_fusion project).

def child_nodes: () -> untyped

This signature was generated using 31 samples from 1 application.

def child_nodes
  body
end

def copy(body: nil, location: nil)

def copy(body: nil, location: nil)
  node =
    Statements.new(
      body: body || self.body,
      location: location || self.location
    )
  node.comments.concat(comments.map(&:copy))
  node
end

def deconstruct_keys(_keys)

def deconstruct_keys(_keys)
  { body: body, location: location, comments: comments }
end

def empty?

def empty?
  body.all? do |statement|
    statement.is_a?(VoidStmt) && statement.comments.empty?
  end
end

def format(q)

def format(q)
  line = nil
  # This handles a special case where you've got a block of statements where
  # the only value is a comment. In that case a lot of nodes like
  # brace_block will attempt to format as a single line, but since that
  # wouldn't work with a comment, we intentionally break the parent group.
  if body.length == 2
    void_stmt, comment = body
    if void_stmt.is_a?(VoidStmt) && comment.is_a?(Comment)
      q.format(comment)
      q.break_parent
      return
    end
  end
  previous = nil
  body.each do |statement|
    next if statement.is_a?(VoidStmt)
    if line.nil?
      q.format(statement)
    elsif (statement.location.start_line - line) > 1
      q.breakable_force
      q.breakable_force
      q.format(statement)
    elsif (statement.is_a?(VCall) && statement.access_control?) ||
          (previous.is_a?(VCall) && previous.access_control?)
      q.breakable_force
      q.breakable_force
      q.format(statement)
    elsif statement.location.start_line != line
      q.breakable_force
      q.format(statement)
    elsif !q.parent.is_a?(StringEmbExpr)
      q.breakable_force
      q.format(statement)
    else
      q.text("; ")
      q.format(statement)
    end
    line = statement.location.end_line
    previous = statement
  end
end

def initialize(body:, location:)

Experimental RBS support (using type sampling data from the type_fusion project).

type SyntaxTree__Statements_initialize_body = Array[SyntaxTree::Assign] | Array[SyntaxTree::Command] | Array[SyntaxTree::VoidStmt] | Array[SyntaxTree::CallNode] | Array[] | Array[SyntaxTree::Binary] | Array[SyntaxTree::StringLiteral] | Array[SyntaxTree::IfNode] | Array[SyntaxTree::Unary] | Array[SyntaxTree::UnlessNode] | Array[SyntaxTree::VarRef] | Array[SyntaxTree::MethodAddBlock] | Array[SyntaxTree::ArrayLiteral]
type SyntaxTree__Statements_initialize_body = SyntaxTree::Assign |  | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::ClassDeclaration | SyntaxTree::SClass | SyntaxTree::DefNode | SyntaxTree::VarRef | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::Command | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::Command | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::DefNode | SyntaxTree::UnlessNode | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::SClass | SyntaxTree::CallNode | SyntaxTree::Command | SyntaxTree::ModuleDeclaration | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::DefNode | SyntaxTree::Command | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::UnlessNode | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign | SyntaxTree::Assign

def initialize: (body: SyntaxTree__Statements_initialize_body, location: SyntaxTree::Location) -> void

This signature was generated using 58 samples from 1 application.

def initialize(body:, location:)
  @body = body
  @location = location
  @comments = []
end