diff --git a/changelog/new_make_class_module_struct_definition_aware_of_numblock.md b/changelog/new_make_class_module_struct_definition_aware_of_numblock.md new file mode 100644 index 000000000..4e8443fb9 --- /dev/null +++ b/changelog/new_make_class_module_struct_definition_aware_of_numblock.md @@ -0,0 +1 @@ +* [#205](https://github.com/rubocop/rubocop-ast/pull/205): Make class, module, and struct definitions aware of numblock. ([@koic][]) diff --git a/lib/rubocop/ast/node.rb b/lib/rubocop/ast/node.rb index 89efc3c13..f1ada86dc 100644 --- a/lib/rubocop/ast/node.rb +++ b/lib/rubocop/ast/node.rb @@ -507,20 +507,20 @@ def guard_clause? # @deprecated Use `:class_constructor?` # @!method struct_constructor?(node = self) def_node_matcher :struct_constructor?, <<~PATTERN - (block (send #global_const?(:Struct) :new ...) _ $_) + ({block numblock} (send #global_const?(:Struct) :new ...) _ $_) PATTERN # @!method class_definition?(node = self) def_node_matcher :class_definition?, <<~PATTERN {(class _ _ $_) (sclass _ $_) - (block (send #global_const?({:Struct :Class}) :new ...) _ $_)} + ({block numblock} (send #global_const?({:Struct :Class}) :new ...) _ $_)} PATTERN # @!method module_definition?(node = self) def_node_matcher :module_definition?, <<~PATTERN {(module _ $_) - (block (send #global_const?(:Module) :new ...) _ $_)} + ({block numblock} (send #global_const?(:Module) :new ...) _ $_)} PATTERN # Some expressions are evaluated for their value, some for their side diff --git a/spec/rubocop/ast/node_spec.rb b/spec/rubocop/ast/node_spec.rb index eb87d2927..47b774d95 100644 --- a/spec/rubocop/ast/node_spec.rb +++ b/spec/rubocop/ast/node_spec.rb @@ -490,6 +490,21 @@ def details; end class_node = node.children.last expect(class_node.class_definition?).to eq(class_node.body) end + + context 'when using numbered parameter', :ruby27 do + let(:src) do + <<~RUBY + Person = Struct.new(:name, :age) do + do_something _1 + end + RUBY + end + + it 'matches' do + class_node = node.children.last + expect(class_node.class_definition?).to eq(class_node.body) + end + end end context 'constant defined as Struct without block' do @@ -514,6 +529,21 @@ def details; end class_node = node.children.last expect(class_node.class_definition?).to eq(class_node.body) end + + context 'when using numbered parameter', :ruby27 do + let(:src) do + <<~RUBY + Person = Class.new do + do_something _1 + end + RUBY + end + + it 'matches' do + class_node = node.children.last + expect(class_node.class_definition?).to eq(class_node.body) + end + end end context 'namespaced class' do @@ -593,6 +623,21 @@ def details; end module_node = node.children.last expect(module_node.module_definition?).to eq(module_node.body) end + + context 'when using numbered parameter', :ruby27 do + let(:src) do + <<~RUBY + Person = Module.new do + do_something _1 + end + RUBY + end + + it 'matches' do + module_node = node.children.last + expect(module_node.module_definition?).to eq(module_node.body) + end + end end context 'prepend Module.new' do