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.



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

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

Instance Attribute Details

#argumentsObject (readonly)

nil | Args

the arguments going along with the message



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

def arguments
  @arguments
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



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

def comments
  @comments
end

#messageObject (readonly)

Const | Ident | Op

the message being send



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

def message
  @message
end

#operatorObject (readonly)

:“::” | Op | Period

the operator used to send the message



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

def operator
  @operator
end

#receiverObject (readonly)

untyped

the receiver of the message



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

def receiver
  @receiver
end

Instance Method Details

#accept(visitor) ⇒ Object



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

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

#child_nodesObject Also known as: deconstruct



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

def child_nodes
  [receiver, message, arguments]
end

#deconstruct_keys(_keys) ⇒ Object



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

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

#format(q) ⇒ Object



3049
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
# File 'lib/syntax_tree/node.rb', line 3049

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