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.



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

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



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

def arguments
  @arguments
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



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

def comments
  @comments
end

#messageObject (readonly)

Const | Ident | Op

the message being send



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

def message
  @message
end

#operatorObject (readonly)

:“::” | Op | Period

the operator used to send the message



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

def operator
  @operator
end

#receiverObject (readonly)

untyped

the receiver of the message



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

def receiver
  @receiver
end

Instance Method Details

#accept(visitor) ⇒ Object



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

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

#child_nodesObject Also known as: deconstruct



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

def child_nodes
  [receiver, message, arguments]
end

#deconstruct_keys(_keys) ⇒ Object



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

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

#format(q) ⇒ Object



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

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