class RubyLsp::Requests::Support::Annotation

def arity_matches?(node)

: (Prism::CallNode node) -> bool
def arity_matches?(node)
  node_arity = node.arguments&.arguments&.size || 0
  case @arity
  when Integer
    node_arity == @arity
  when Range
    @arity.cover?(node_arity)
  end
end

def initialize(arity:, receiver: false)

: (arity: (Integer | Range[Integer]), ?receiver: bool) -> void
def initialize(arity:, receiver: false)
  @arity = arity
  @receiver = receiver
end

def match?(node)

: (Prism::CallNode node) -> bool
def match?(node)
  receiver_matches?(node) && arity_matches?(node)
end

def receiver_matches?(node)

: (Prism::CallNode node) -> bool
def receiver_matches?(node)
  node_receiver = node.receiver
  (node_receiver && @receiver && node_receiver.location.slice == "T") || (!node_receiver && !@receiver)
end