From 88ea9fd38e155c1022441e2af616a6991dceb278 Mon Sep 17 00:00:00 2001 From: krororo Date: Sat, 16 Dec 2023 18:50:11 +0900 Subject: [PATCH] [Fix #12242] Support `AllowModifiersOnAttrs` option for `Style/AccessModifierDeclarations` --- ..._for_style_access_modifier_declarations.md | 1 + config/default.yml | 1 + .../cop/style/access_modifier_declarations.rb | 33 +++++++++++++++ .../access_modifier_declarations_spec.rb | 40 +++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 changelog/new_support_allow_modifiers_on_attrs_option_for_style_access_modifier_declarations.md diff --git a/changelog/new_support_allow_modifiers_on_attrs_option_for_style_access_modifier_declarations.md b/changelog/new_support_allow_modifiers_on_attrs_option_for_style_access_modifier_declarations.md new file mode 100644 index 00000000000..1f4baf76f43 --- /dev/null +++ b/changelog/new_support_allow_modifiers_on_attrs_option_for_style_access_modifier_declarations.md @@ -0,0 +1 @@ +* [#12242](https://github.com/rubocop/rubocop/issues/12242): Support `AllowModifiersOnAttrs` option for `Style/AccessModifierDeclarations`. ([@krororo][]) diff --git a/config/default.yml b/config/default.yml index 003aac98f03..feed9501641 100644 --- a/config/default.yml +++ b/config/default.yml @@ -3056,6 +3056,7 @@ Style/AccessModifierDeclarations: - inline - group AllowModifiersOnSymbols: true + AllowModifiersOnAttrs: true SafeAutoCorrect: false Style/AccessorGrouping: diff --git a/lib/rubocop/cop/style/access_modifier_declarations.rb b/lib/rubocop/cop/style/access_modifier_declarations.rb index 61027c58ae2..237f3168dac 100644 --- a/lib/rubocop/cop/style/access_modifier_declarations.rb +++ b/lib/rubocop/cop/style/access_modifier_declarations.rb @@ -67,6 +67,28 @@ module Style # private :bar, :baz # # end + # + # @example AllowModifiersOnAttrs: true (default) + # # good + # class Foo + # + # public attr_reader :bar + # protected attr_writer :baz + # private attr_accessor :qux + # private attr :quux + # + # end + # + # @example AllowModifiersOnAttrs: false + # # bad + # class Foo + # + # public attr_reader :bar + # protected attr_writer :baz + # private attr_accessor :qux + # private attr :quux + # + # end class AccessModifierDeclarations < Base extend AutoCorrector @@ -92,10 +114,17 @@ class AccessModifierDeclarations < Base (send nil? {:private :protected :public :module_function} (sym _)) PATTERN + # @!method access_modifier_with_attr?(node) + def_node_matcher :access_modifier_with_attr?, <<~PATTERN + (send nil? {:private :protected :public :module_function} + (send nil? {:attr :attr_reader :attr_writer :attr_accessor} _)) + PATTERN + 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) + return if allow_modifiers_on_attrs?(node) if offense?(node) add_offense(node.loc.selector) do |corrector| @@ -128,6 +157,10 @@ def allow_modifiers_on_symbols?(node) cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node) end + def allow_modifiers_on_attrs?(node) + cop_config['AllowModifiersOnAttrs'] && access_modifier_with_attr?(node) + end + def offense?(node) (group_style? && access_modifier_is_inlined?(node) && !right_siblings_same_inline_method?(node)) || diff --git a/spec/rubocop/cop/style/access_modifier_declarations_spec.rb b/spec/rubocop/cop/style/access_modifier_declarations_spec.rb index d4581c2e9e2..a349405c238 100644 --- a/spec/rubocop/cop/style/access_modifier_declarations_spec.rb +++ b/spec/rubocop/cop/style/access_modifier_declarations_spec.rb @@ -39,6 +39,21 @@ class Foo expect_no_corrections end end + + context 'allow access modifiers on attrs' do + let(:cop_config) { { 'AllowModifiersOnAttrs' => true } } + + it 'accepts when argument to #{access_modifier} is a attr_*' do + expect_no_offenses(<<~RUBY) + class Foo + #{access_modifier} attr_reader :foo + #{access_modifier} attr_writer :bar + #{access_modifier} attr_accessor :baz + #{access_modifier} attr :qux + end + RUBY + end + end end context 'when `group` is configured' do @@ -201,6 +216,31 @@ class Test end end + %w[attr attr_reader attr_writer attr_accessor].each do |attr_method| + context "when method is modified by inline modifier with disallowed #{attr_method}" do + let(:cop_config) do + { 'AllowModifiersOnAttrs' => false } + end + + it 'registers and autocorrects an offense' do + expect_offense(<<~RUBY, access_modifier: access_modifier) + class Test + #{access_modifier} #{attr_method} :foo + ^{access_modifier} `#{access_modifier}` should not be inlined in method definitions. + end + RUBY + + expect_correction(<<~RUBY) + class Test + #{access_modifier} + + #{attr_method} :foo + end + RUBY + end + end + end + context 'when method is modified by inline modifier where group modifier already exists' do it 'registers and autocorrects an offense' do expect_offense(<<~RUBY, access_modifier: access_modifier)