Sha256: ca03963279646515f85fa22800bc040d0e7b2a5c7740350d5403320e68f37088
Contents?: true
Size: 1.59 KB
Versions: 4
Compression:
Stored size: 1.59 KB
Contents
# frozen_string_literal: true module RuboCop module Cop module Style # This cop checks for inheritance from Struct.new. # # @example # # bad # class Person < Struct.new(:first_name, :last_name) # def age # 42 # end # end # # # good # Person = Struct.new(:first_name, :last_name) do # def age # 42 # end # end class StructInheritance < Cop include RangeHelp MSG = "Don't extend an instance initialized by `Struct.new`. " \ 'Use a block to customize the struct.' def on_class(node) return unless struct_constructor?(node.parent_class) add_offense(node, location: node.parent_class.source_range) end def autocorrect(node) lambda do |corrector| corrector.remove(range_with_surrounding_space(range: node.loc.keyword)) corrector.replace(node.loc.operator, '=') correct_parent(node.parent_class, corrector) end end def_node_matcher :struct_constructor?, <<~PATTERN {(send (const {nil? cbase} :Struct) :new ...) (block (send (const {nil? cbase} :Struct) :new ...) ...)} PATTERN private def correct_parent(parent, corrector) if parent.block_type? corrector.remove(range_with_surrounding_space(range: parent.loc.end, newlines: false)) else corrector.insert_after(parent.loc.expression, ' do') end end end end end end
Version data entries
4 entries across 4 versions & 2 rubygems