class RuboCop::Cop::Style::RequireOrder
require ‘a’
end
require ‘d’
require ‘b’
if foo
require ‘c’
# good
require ‘a’
end
require ‘b’
require ‘d’
if foo
require ‘c’
# bad
require ‘c’ if foo
require ‘b’
require ‘a’
# good
require ‘b’
require ‘c’ if foo
require ‘a’
# bad
require ‘a’
require_relative ‘c’
require ‘b’
# good
require ‘c’
require ‘b’
require ‘d’
require ‘a’
# good (sorted within each section separated by a blank line)
require_relative ‘b’
require_relative ‘a’
# good
require_relative ‘a’
require_relative ‘b’
# bad
require ‘b’
require ‘a’
# good
require ‘a’
require ‘b’
# bad
@example
This cop’s autocorrection is unsafe because it will obviously change the execution order.
@safety
Sort ‘require` and `require_relative` in alphabetical order.
def autocorrect(corrector, node, previous_older_sibling)
def autocorrect(corrector, node, previous_older_sibling) range1 = range_with_comments_and_lines(previous_older_sibling) range2 = range_with_comments_and_lines(node.parent.if_type? ? node.parent : node) corrector.remove(range2) corrector.insert_before(range1, range2.source) end
def find_previous_older_sibling(node) # rubocop:disable Metrics
def find_previous_older_sibling(node) # rubocop:disable Metrics search_node(node).left_siblings.reverse.find do |sibling| next unless sibling.is_a?(AST::Node) sibling = sibling_node(sibling) break unless sibling&.send_type? && sibling&.method?(node.method_name) break unless sibling.arguments? && !sibling.receiver break unless in_same_section?(sibling, node) break unless node.first_argument.str_type? && sibling.first_argument.str_type? node.first_argument.value < sibling.first_argument.value end end
def in_same_section?(node1, node2)
def in_same_section?(node1, node2) !node1.source_range.with(end_pos: node2.source_range.end_pos).source.include?("\n\n") end
def not_modifier_form?(node)
def not_modifier_form?(node) node.if_type? && !node.modifier_form? end
def on_send(node)
def on_send(node) return unless node.parent && node.arguments? return if not_modifier_form?(node.parent) previous_older_sibling = find_previous_older_sibling(node) return unless previous_older_sibling add_offense(node, message: format(MSG, name: node.method_name)) do |corrector| autocorrect(corrector, node, previous_older_sibling) end end
def search_node(node)
def search_node(node) node.parent.if_type? ? node.parent : node end
def sibling_node(node)
def sibling_node(node) return if not_modifier_form?(node) node.if_type? ? if_inside_only_require(node) : node end