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 extract_parameters(sig_params)
def extract_parameters(sig_params) return [] if sig_params.nil? arguments = sig_params.arguments.first return arguments.keys.map(&:value) if RuboCop::AST::HashNode === arguments add_offense( sig_params, message: "Invalid signature." ) end
def on_signature(node)
def on_signature(node) sig_params = signature_params(node).first sig_params_order = extract_parameters(sig_params) return if sig_params_order.nil? 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