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

Returns a new instance of Lambda.



7037
7038
7039
7040
7041
7042
# File 'lib/syntax_tree/node.rb', line 7037

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



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

def comments
  @comments
end

#paramsObject (readonly)

LambdaVar | Paren

the parameter declaration for this lambda



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

def params
  @params
end

#statementsObject (readonly)

BodyStmt | Statements

the expressions to be executed in this lambda



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

def statements
  @statements
end

Instance Method Details

#===(other) ⇒ Object



7138
7139
7140
7141
# File 'lib/syntax_tree/node.rb', line 7138

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

#accept(visitor) ⇒ Object



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

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

#child_nodesObject Also known as: deconstruct



7048
7049
7050
# File 'lib/syntax_tree/node.rb', line 7048

def child_nodes
  [params, statements]
end

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



7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
# File 'lib/syntax_tree/node.rb', line 7052

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



7066
7067
7068
7069
7070
7071
7072
7073
# File 'lib/syntax_tree/node.rb', line 7066

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

#format(q) ⇒ Object



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
7134
7135
7136
# File 'lib/syntax_tree/node.rb', line 7075

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