module Leftovers::MatcherBuilders::NodeHasArgument

Public Class Methods

build(patterns) click to toggle source
# File lib/leftovers/matcher_builders/node_has_argument.rb, line 6
def self.build(patterns) # rubocop:disable Metrics/MethodLength
  ::Leftovers::MatcherBuilders::Or.each_or_self(patterns) do |pat|
    case pat
    when ::String
      ::Leftovers::MatcherBuilders::NodeHasKeywordArgument.build(pat, nil)
    when ::Integer
      ::Leftovers::MatcherBuilders::NodeHasPositionalArgument.build(pat, nil)
    when ::Hash
      build_from_hash(**pat)
    # :nocov:
    else
      raise
      # :nocov:
    end
  end
end
build_from_hash(at: nil, has_value: nil, has_value_type: nil, unless_arg: nil) click to toggle source
# File lib/leftovers/matcher_builders/node_has_argument.rb, line 44
def self.build_from_hash(at: nil, has_value: nil, has_value_type: nil, unless_arg: nil) # rubocop:disable Metrics/MethodLength
  keys, positions = separate_argument_types(at)

  value_matcher = ::Leftovers::MatcherBuilders::And.build([
    ::Leftovers::MatcherBuilders::ArgumentNodeValue.build(has_value),
    ::Leftovers::MatcherBuilders::NodeType.build(has_value_type)
  ])
  matcher = if (keys && positions) || (!keys && !positions)
    ::Leftovers::MatcherBuilders::Or.build([
      ::Leftovers::MatcherBuilders::NodeHasKeywordArgument.build(keys, value_matcher),
      ::Leftovers::MatcherBuilders::NodeHasPositionalArgument.build(positions, value_matcher)
    ])
  elsif keys
    ::Leftovers::MatcherBuilders::NodeHasKeywordArgument.build(keys, value_matcher)
  elsif positions
    ::Leftovers::MatcherBuilders::NodeHasPositionalArgument.build(positions, value_matcher)
    # :nocov:
  else raise
    # :nocov:
  end

  ::Leftovers::MatcherBuilders::AndNot.build(
    matcher, ::Leftovers::MatcherBuilders::NodeHasArgument.build(unless_arg)
  )
end
separate_argument_types(at) click to toggle source
# File lib/leftovers/matcher_builders/node_has_argument.rb, line 23
def self.separate_argument_types(at) # rubocop:disable Metrics/MethodLength
  keys = []
  positions = []

  ::Leftovers.each_or_self(at) do |k|
    case k
    when ::String, ::Hash
      keys << k
    when ::Integer
      positions << k
    # :nocov:
    else raise
      # :nocov:
    end
  end
  keys = nil if keys.empty?
  positions = nil if positions.empty?

  [keys, positions]
end