Class: SyntaxTree::When

Inherits:
Node
  • Object
show all
Defined in:
lib/syntax_tree/node.rb

Overview

When represents a when clause in a case chain.

case value
when predicate
end

Defined Under Namespace

Classes: Separator

Constant Summary collapse

SEPARATOR =

We’re going to keep a single instance of this separator around so we don’t have to allocate a new one every time we format a when clause.

Separator.new.freeze

Instance Attribute Summary collapse

Attributes inherited from Node

#location

Instance Method Summary collapse

Methods inherited from Node

#construct_keys, #end_char, #pretty_print, #start_char, #to_json, #to_mermaid

Constructor Details

#initialize(arguments:, statements:, consequent:, location:) ⇒ When

Returns a new instance of When.



11784
11785
11786
11787
11788
11789
11790
# File 'lib/syntax_tree/node.rb', line 11784

def initialize(arguments:, statements:, consequent:, location:)
  @arguments = arguments
  @statements = statements
  @consequent = consequent
  @location = location
  @comments = []
end

Instance Attribute Details

#argumentsObject (readonly)

Args

the arguments to the when clause



11773
11774
11775
# File 'lib/syntax_tree/node.rb', line 11773

def arguments
  @arguments
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



11782
11783
11784
# File 'lib/syntax_tree/node.rb', line 11782

def comments
  @comments
end

#consequentObject (readonly)

nil | Else | When

the next clause in the chain



11779
11780
11781
# File 'lib/syntax_tree/node.rb', line 11779

def consequent
  @consequent
end

#statementsObject (readonly)

Statements

the expressions to be executed



11776
11777
11778
# File 'lib/syntax_tree/node.rb', line 11776

def statements
  @statements
end

Instance Method Details

#===(other) ⇒ Object



11876
11877
11878
11879
# File 'lib/syntax_tree/node.rb', line 11876

def ===(other)
  other.is_a?(When) && arguments === other.arguments &&
    statements === other.statements && consequent === other.consequent
end

#accept(visitor) ⇒ Object



11792
11793
11794
# File 'lib/syntax_tree/node.rb', line 11792

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

#child_nodesObject Also known as: deconstruct



11796
11797
11798
# File 'lib/syntax_tree/node.rb', line 11796

def child_nodes
  [arguments, statements, consequent]
end

#copy(arguments: nil, statements: nil, consequent: nil, location: nil) ⇒ Object



11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811
# File 'lib/syntax_tree/node.rb', line 11800

def copy(arguments: nil, statements: nil, consequent: nil, location: nil)
  node =
    When.new(
      arguments: arguments || self.arguments,
      statements: statements || self.statements,
      consequent: consequent || self.consequent,
      location: location || self.location
    )

  node.comments.concat(comments.map(&:copy))
  node
end

#deconstruct_keys(_keys) ⇒ Object



11815
11816
11817
11818
11819
11820
11821
11822
11823
# File 'lib/syntax_tree/node.rb', line 11815

def deconstruct_keys(_keys)
  {
    arguments: arguments,
    statements: statements,
    consequent: consequent,
    location: location,
    comments: comments
  }
end

#format(q) ⇒ Object



11841
11842
11843
11844
11845
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11861
11862
11863
11864
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
# File 'lib/syntax_tree/node.rb', line 11841

def format(q)
  keyword = "when "

  q.group do
    q.group do
      q.text(keyword)
      q.nest(keyword.length) do
        if arguments.comments.any?
          q.format(arguments)
        else
          q.seplist(arguments.parts, SEPARATOR) { |part| q.format(part) }
        end

        # Very special case here. If you're inside of a when clause and the
        # last argument to the predicate is and endless range, then you are
        # forced to use the "then" keyword to make it parse properly.
        last = arguments.parts.last
        q.text(" then") if last.is_a?(RangeNode) && !last.right
      end
    end

    unless statements.empty?
      q.indent do
        q.breakable_force
        q.format(statements)
      end
    end

    if consequent
      q.breakable_force
      q.format(consequent)
    end
  end
end