Class: SyntaxTree::CommandCall

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

Overview

CommandCall represents a method call on an object with arguments and no parentheses.

object.method argument

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(receiver:, operator:, message:, arguments:, location:, comments: []) ⇒ CommandCall

Returns a new instance of CommandCall.



3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
# File 'lib/syntax_tree/node.rb', line 3013

def initialize(
  receiver:,
  operator:,
  message:,
  arguments:,
  location:,
  comments: []
)
  @receiver = receiver
  @operator = operator
  @message = message
  @arguments = arguments
  @location = location
  @comments = comments
end

Instance Attribute Details

#arguments ⇒ Object (readonly)

[nil | Args] the arguments going along with the message



3008
3009
3010
# File 'lib/syntax_tree/node.rb', line 3008

def arguments
  @arguments
end

#comments ⇒ Object (readonly)

[Array[ Comment | EmbDoc ]] the comments attached to this node



3011
3012
3013
# File 'lib/syntax_tree/node.rb', line 3011

def comments
  @comments
end

#message ⇒ Object (readonly)

[Const | Ident | Op] the message being send



3005
3006
3007
# File 'lib/syntax_tree/node.rb', line 3005

def message
  @message
end

#operator ⇒ Object (readonly)

[:"::" | Op | Period] the operator used to send the message



3002
3003
3004
# File 'lib/syntax_tree/node.rb', line 3002

def operator
  @operator
end

#receiver ⇒ Object (readonly)

[untyped] the receiver of the message



2999
3000
3001
# File 'lib/syntax_tree/node.rb', line 2999

def receiver
  @receiver
end

Instance Method Details

#accept(visitor) ⇒ Object



3029
3030
3031
# File 'lib/syntax_tree/node.rb', line 3029

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

#child_nodes ⇒ Object Also known as: deconstruct



3033
3034
3035
# File 'lib/syntax_tree/node.rb', line 3033

def child_nodes
  [receiver, message, arguments]
end

#deconstruct_keys(_keys) ⇒ Object



3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
# File 'lib/syntax_tree/node.rb', line 3039

def deconstruct_keys(_keys)
  {
    receiver: receiver,
    operator: operator,
    message: message,
    arguments: arguments,
    location: location,
    comments: comments
  }
end

#format(q) ⇒ Object



3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
# File 'lib/syntax_tree/node.rb', line 3050

def format(q)
  q.group do
    doc =
      q.nest(0) do
        q.format(receiver)

        # If there are leading comments on the message then we know we have
        # a newline in the source that is forcing these things apart. In
        # this case we will have to use a trailing operator.
        if message.comments.any?(&:leading?)
          q.format(CallOperatorFormatter.new(operator), stackable: false)
          q.indent do
            q.breakable("")
            q.format(message)
          end
        else
          q.format(CallOperatorFormatter.new(operator), stackable: false)
          q.format(message)
        end
      end

    case arguments
    in Args[parts: [IfOp]]
      q.if_flat { q.text(" ") }
      q.format(arguments)
    in Args
      q.text(" ")
      q.nest(argument_alignment(q, doc)) { q.format(arguments) }
    else
      # If there are no arguments, print nothing.
    end
  end
end