lib/reek/smell_detectors/data_clump.rb in reek-5.6.0 vs lib/reek/smell_detectors/data_clump.rb in reek-6.0.0
- old
+ new
@@ -49,11 +49,11 @@
# Checks the given class or module for multiple identical parameter sets.
#
# @return [Array<SmellWarning>]
#
def sniff
- MethodGroup.new(context, min_clump_size, max_copies).clumps.map do |clump, methods|
+ clumps.map do |clump, methods|
methods_length = methods.length
smell_warning(
lines: methods.map(&:line),
message: "takes parameters #{DataClump.print_clump(clump)} " \
"to #{methods_length} methods",
@@ -70,74 +70,41 @@
end
private
def max_copies
- value(MAX_COPIES_KEY, context)
+ @max_copies ||= value(MAX_COPIES_KEY, context)
end
def min_clump_size
- value(MIN_CLUMP_SIZE_KEY, context)
+ @min_clump_size ||= value(MIN_CLUMP_SIZE_KEY, context)
end
- end
- end
- # Represents a group of methods
- # @private
- class MethodGroup
- def initialize(ctx, min_clump_size, max_copies)
- @min_clump_size = min_clump_size
- @max_copies = max_copies
- @candidate_methods = ctx.node_instance_methods.map do |defn_node|
- CandidateMethod.new(defn_node)
+ def candidate_methods
+ @candidate_methods ||= context.node_instance_methods
end
- end
- def candidate_clumps
- candidate_methods.each_cons(max_copies + 1).map do |methods|
- common_argument_names_for(methods)
- end.select do |clump|
- clump.length >= min_clump_size
- end.uniq
- end
+ def candidate_clumps
+ candidate_methods.each_cons(max_copies + 1).map do |methods|
+ common_argument_names_for(methods)
+ end.select do |clump|
+ clump.length >= min_clump_size
+ end.uniq
+ end
- # @quality :reek:UtilityFunction
- def common_argument_names_for(methods)
- methods.map(&:arg_names).inject(:&)
- end
+ # @quality :reek:UtilityFunction
+ def common_argument_names_for(methods)
+ methods.map(&:arg_names).inject(:&).compact.sort
+ end
- def methods_containing_clump(clump)
- candidate_methods.select { |method| clump & method.arg_names == clump }
- end
+ def methods_containing_clump(clump)
+ candidate_methods.select { |method| clump & method.arg_names == clump }
+ end
- def clumps
- candidate_clumps.map do |clump|
- [clump, methods_containing_clump(clump)]
+ def clumps
+ candidate_clumps.map do |clump|
+ [clump, methods_containing_clump(clump)]
+ end
end
end
-
- private
-
- attr_reader :candidate_methods, :max_copies, :min_clump_size
- end
-
- # A method definition and a copy of its parameters
- # @private
- class CandidateMethod
- extend Forwardable
-
- def_delegators :defn, :line, :name
-
- def initialize(defn_node)
- @defn = defn_node
- end
-
- def arg_names
- # TODO: Is all this sorting still needed?
- @arg_names ||= defn.arg_names.compact.sort
- end
-
- private
-
- attr_reader :defn
end
end