class RuboCop::Cop::Style::AccessModifierDeclarations
Access modifiers should be declared to apply to a group of methods or inline before each method, depending on configuration. EnforcedStyle config covers only method definitions. Applications of visibility methods to symbols can be controlled using AllowModifiersOnSymbols config.
@safety
Autocorrection is not safe, because the visibility of dynamically defined methods can vary depending on the state determined by the group access modifier.
@example EnforcedStyle: group (default)
# bad class Foo private def bar; end private def baz; end end # good class Foo private def bar; end def baz; end end
@example EnforcedStyle: inline
# bad class Foo private def bar; end def baz; end end # good class Foo private def bar; end private def baz; end end
@example AllowModifiersOnSymbols: true (default)
# good class Foo private :bar, :baz end
@example AllowModifiersOnSymbols: false
# bad class Foo private :bar, :baz end
Constants
- GROUP_STYLE_MESSAGE
- INLINE_STYLE_MESSAGE
- RESTRICT_ON_SEND
Public Instance Methods
on_send(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 93 def on_send(node) return unless node.access_modifier? return if node.parent&.pair_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
Private Instance Methods
access_modifier_is_inlined?(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 144 def access_modifier_is_inlined?(node) node.arguments.any? end
access_modifier_is_not_inlined?(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 148 def access_modifier_is_not_inlined?(node) !access_modifier_is_inlined?(node) end
add_range(range1, range2)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 223 def add_range(range1, range2) range1.with( begin_pos: [range1.begin_pos, range2.begin_pos].min, end_pos: [range1.end_pos, range2.end_pos].max ) end
allow_modifiers_on_symbols?(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 127 def allow_modifiers_on_symbols?(node) cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node) end
autocorrect(corrector, node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 110 def autocorrect(corrector, node) case style when :group def_node = find_corresponding_def_node(node) return unless def_node remove_node(corrector, def_node) remove_node(corrector, node) insert_def(corrector, node, def_node.source) 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
find_argument_less_modifier_node(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 173 def find_argument_less_modifier_node(node) node.parent.each_child_node(:send).find do |child| child.method?(node.method_name) && child.arguments.empty? end end
find_corresponding_def_node(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 162 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
group_style?()
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 136 def group_style? style == :group end
inline_style?()
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 140 def inline_style? style == :inline end
insert_def(corrector, node, source)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 185 def insert_def(corrector, node, source) source = [*processed_source.ast_with_comments[node].map(&:text), source].join("\n") 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}") else corrector.insert_before( node.each_ancestor(:block, :class, :module).first.location.end, "#{node.method_name}\n\n#{source}\n" ) end end
insert_inline_modifier(corrector, node, modifier_name)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 198 def insert_inline_modifier(corrector, node, modifier_name) corrector.insert_before(node, "#{modifier_name} ") end
message(range)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 152 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
offense?(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 131 def offense?(node) (group_style? && access_modifier_is_inlined?(node)) || (inline_style? && access_modifier_is_not_inlined?(node)) end
range_with_comments(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 211 def range_with_comments(node) ranges = [ node, *processed_source.ast_with_comments[node] ].map do |element| element.location.expression end ranges.reduce do |result, range| add_range(result, range) end end
remove_node(corrector, node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 202 def remove_node(corrector, node) corrector.remove( range_by_whole_lines( range_with_comments(node), include_final_newline: true ) ) end
select_grouped_def_nodes(node)
click to toggle source
# File lib/rubocop/cop/style/access_modifier_declarations.rb, line 179 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