Class: SyntaxTree::Lambda

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

Overview

Lambda represents using a lambda literal (not the lambda method call).

->(value) { value * 2 }

Instance Attribute Summary collapse

Attributes inherited from Node

#location

Instance Method Summary collapse

Methods inherited from Node

#construct_keys, #pretty_print, #to_json

Constructor Details

#initialize(params:, statements:, location:) ⇒ Lambda



7034
7035
7036
7037
7038
7039
# File 'lib/syntax_tree/node.rb', line 7034

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

Instance Attribute Details

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



7032
7033
7034
# File 'lib/syntax_tree/node.rb', line 7032

def comments
  @comments
end

#paramsObject (readonly)

LambdaVar | Paren

the parameter declaration for this lambda



7026
7027
7028
# File 'lib/syntax_tree/node.rb', line 7026

def params
  @params
end

#statementsObject (readonly)

BodyStmt | Statements

the expressions to be executed in this lambda



7029
7030
7031
# File 'lib/syntax_tree/node.rb', line 7029

def statements
  @statements
end

Instance Method Details

#===(other) ⇒ Object



7135
7136
7137
7138
# File 'lib/syntax_tree/node.rb', line 7135

def ===(other)
  other.is_a?(Lambda) && params === other.params &&
    statements === other.statements
end

#accept(visitor) ⇒ Object



7041
7042
7043
# File 'lib/syntax_tree/node.rb', line 7041

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

#child_nodesObject Also known as: deconstruct



7045
7046
7047
# File 'lib/syntax_tree/node.rb', line 7045

def child_nodes
  [params, statements]
end

#copy(params: nil, statements: nil, location: nil) ⇒ Object



7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
# File 'lib/syntax_tree/node.rb', line 7049

def copy(params: nil, statements: nil, location: nil)
  node =
    Lambda.new(
      params: params || self.params,
      statements: statements || self.statements,
      location: location || self.location
    )

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

#deconstruct_keys(_keys) ⇒ Object



7063
7064
7065
7066
7067
7068
7069
7070
# File 'lib/syntax_tree/node.rb', line 7063

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

#format(q) ⇒ Object



7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
# File 'lib/syntax_tree/node.rb', line 7072

def format(q)
  q.text("->")
  q.group do
    if params.is_a?(Paren)
      q.format(params) unless params.contents.empty?
    elsif params.empty? && params.comments.any?
      q.format(params)
    elsif !params.empty?
      q.group do
        q.text("(")
        q.format(params)
        q.text(")")
      end
    end

    q.text(" ")
    q
      .if_break do
        force_parens =
          q.parents.any? do |node|
            node.is_a?(Command) || node.is_a?(CommandCall)
          end

        if force_parens
          q.text("{")

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

          q.text("}")
        else
          q.text("do")

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

          q.breakable_space
          q.text("end")
        end
      end
      .if_flat do
        q.text("{")

        unless statements.empty?
          q.text(" ")
          q.format(statements)
          q.text(" ")
        end

        q.text("}")
      end
  end
end