class RuboCop::Cop::Style::AccessModifierDeclarations
end
private :bar, :baz
class Foo
# bad
@example AllowModifiersOnSymbols: false
end
private :bar, :baz
class Foo
# good
@example AllowModifiersOnSymbols: true (default)
end
private def baz; end
private def bar; end
class Foo
# good
end
def baz; end
def bar; end
private
class Foo
# bad
@example EnforcedStyle: inline
end
def baz; end
def bar; end
private
class Foo
# good
end
private def baz; end
private def bar; end
class Foo
# bad
@example EnforcedStyle: group (default)
the group access modifier.
defined methods can vary depending on the state determined by
Autocorrection is not safe, because the visibility of dynamically
@safety
using AllowModifiersOnSymbols config.
Applications of visibility methods to symbols can be controlled
EnforcedStyle config covers only method definitions.
or inline before each method, depending on configuration.
Access modifiers should be declared to apply to a group of methods
def access_modifier_is_inlined?(node)
def access_modifier_is_inlined?(node) node.arguments.any? end
def access_modifier_is_not_inlined?(node)
def access_modifier_is_not_inlined?(node) !access_modifier_is_inlined?(node) end
def allow_modifiers_on_symbols?(node)
def allow_modifiers_on_symbols?(node) cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node) end
def autocorrect(corrector, node)
def autocorrect(corrector, node) case style when :group def_node = find_corresponding_def_node(node) return unless def_node replace_def(corrector, node, def_node) when :inline remove_node(corrector, node) select_grouped_def_nodes(node).each do |grouped_def_node| insert_inline_modifier(corrector, grouped_def_node, node.method_name) end end end
def def_source(node, def_node)
def def_source(node, def_node) [*processed_source.ast_with_comments[node].map(&:text), def_node.source].join("\n") end
def find_argument_less_modifier_node(node)
def find_argument_less_modifier_node(node) return unless (parent = node.parent) parent.each_child_node(:send).find do |child| child.method?(node.method_name) && child.arguments.empty? end end
def find_corresponding_def_node(node)
def find_corresponding_def_node(node) if access_modifier_with_symbol?(node) method_name = node.arguments.first.value node.parent.each_child_node(:def).find do |child| child.method?(method_name) end else node.arguments.first end end
def group_style?
def group_style? style == :group end
def inline_style?
def inline_style? style == :inline end
def insert_inline_modifier(corrector, node, modifier_name)
def insert_inline_modifier(corrector, node, modifier_name) corrector.insert_before(node, "#{modifier_name} ") end
def message(range)
def message(range) access_modifier = range.source if group_style? format(GROUP_STYLE_MESSAGE, access_modifier: access_modifier) elsif inline_style? format(INLINE_STYLE_MESSAGE, access_modifier: access_modifier) end end
def offense?(node)
def offense?(node) (group_style? && access_modifier_is_inlined?(node) && !right_siblings_same_inline_method?(node)) || (inline_style? && access_modifier_is_not_inlined?(node)) end
def on_send(node)
def on_send(node) return unless node.access_modifier? return if ALLOWED_NODE_TYPES.include?(node.parent&.type) return if allow_modifiers_on_symbols?(node) if offense?(node) add_offense(node.loc.selector) do |corrector| autocorrect(corrector, node) end opposite_style_detected else correct_style_detected end end
def remove_node(corrector, node)
def remove_node(corrector, node) corrector.remove(range_with_comments_and_lines(node)) end
def replace_def(corrector, node, def_node)
def replace_def(corrector, node, def_node) source = def_source(node, def_node) argument_less_modifier_node = find_argument_less_modifier_node(node) if argument_less_modifier_node corrector.insert_after(argument_less_modifier_node, "\n\n#{source}") elsif (ancestor = node.each_ancestor(:block, :class, :module).first) corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n") else corrector.replace(node, "#{node.method_name}\n\n#{source}") return end remove_node(corrector, def_node) remove_node(corrector, node) end
def right_siblings_same_inline_method?(node)
def right_siblings_same_inline_method?(node) node.right_siblings.any? do |sibling| sibling.send_type? && sibling.method?(node.method_name) && !sibling.arguments.empty? end end
def select_grouped_def_nodes(node)
def select_grouped_def_nodes(node) node.right_siblings.take_while do |sibling| !(sibling.send_type? && sibling.bare_access_modifier_declaration?) end.select(&:def_type?) end