class RuboCop::Cop::Sorbet::ParametersOrderingInSignature

def foo(a:, b:); end
sig { params(a: Integer, b: String).void }
# good
def foo(b:, a:); end
sig { params(a: Integer, b: String).void }
# bad
@example
when such inconsistency occurs.
signature and the method definition. The sorbet-runtime gem raises
This cop checks for inconsistent ordering of parameters between the

def check_for_inconsistent_param_ordering(sig_params_order, parameters)

def check_for_inconsistent_param_ordering(sig_params_order, parameters)
  parameters.each_with_index do |param, index|
    param_name = param.children[0]
    sig_param_name = sig_params_order[index]
    next if param_name == sig_param_name
    add_offense(
      param,
      message: "Inconsistent ordering of arguments at index #{index}. " \
      "Expected `#{sig_param_name}` from sig above."
    )
  end
end

def on_signature(node)

def on_signature(node)
  sig_params = signature_params(node).first
  sig_params_order =
    if sig_params.nil?
      []
    else
      sig_params.arguments.first.keys.map(&:value)
    end
  method_node = node.parent.children[node.sibling_index + 1]
  return if method_node.nil? || method_node.type != :def
  method_parameters = method_node.arguments
  check_for_inconsistent_param_ordering(sig_params_order, method_parameters)
end