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, #end_char, #pretty_print, #start_char, #to_json, #to_mermaid

Constructor Details

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

Returns a new instance of Lambda.



7170
7171
7172
7173
7174
7175
# File 'lib/syntax_tree/node.rb', line 7170

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



7168
7169
7170
# File 'lib/syntax_tree/node.rb', line 7168

def comments
  @comments
end

#paramsObject (readonly)

LambdaVar | Paren

the parameter declaration for this lambda



7162
7163
7164
# File 'lib/syntax_tree/node.rb', line 7162

def params
  @params
end

#statementsObject (readonly)

BodyStmt | Statements

the expressions to be executed in this lambda



7165
7166
7167
# File 'lib/syntax_tree/node.rb', line 7165

def statements
  @statements
end

Instance Method Details

#===(other) ⇒ Object



7254
7255
7256
7257
# File 'lib/syntax_tree/node.rb', line 7254

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

#accept(visitor) ⇒ Object



7177
7178
7179
# File 'lib/syntax_tree/node.rb', line 7177

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

#child_nodesObject Also known as: deconstruct



7181
7182
7183
# File 'lib/syntax_tree/node.rb', line 7181

def child_nodes
  [params, statements]
end

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



7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
# File 'lib/syntax_tree/node.rb', line 7185

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



7199
7200
7201
7202
7203
7204
7205
7206
# File 'lib/syntax_tree/node.rb', line 7199

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

#format(q) ⇒ Object



7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
# File 'lib/syntax_tree/node.rb', line 7208

def format(q)
  params = self.params

  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
        q.text("do")

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

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

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

        q.text("}")
      end
  end
end