debian-mirror-gitlab/rubocop/cop/gitlab/predicate_memoization.rb

42 lines
1,012 B
Ruby
Raw Normal View History

2021-03-11 19:13:27 +05:30
# frozen_string_literal: true
2018-03-17 18:26:18 +05:30
module RuboCop
module Cop
module Gitlab
2022-10-11 01:57:18 +05:30
class PredicateMemoization < RuboCop::Cop::Base
2021-03-11 19:13:27 +05:30
MSG = <<~EOL
2018-03-17 18:26:18 +05:30
Avoid using `@value ||= query` inside predicate methods in order to
properly memoize `false` or `nil` values.
https://docs.gitlab.com/ee/development/utilities.html#strongmemoize
EOL
def on_def(node)
return unless predicate_method?(node)
select_offenses(node).each do |offense|
2021-03-11 19:13:27 +05:30
add_offense(offense)
2018-03-17 18:26:18 +05:30
end
end
private
def predicate_method?(node)
node.method_name.to_s.end_with?('?')
end
def or_ivar_assignment?(or_assignment)
lhs = or_assignment.each_child_node.first
lhs.ivasgn_type?
end
def select_offenses(node)
node.each_descendant(:or_asgn).select do |or_assignment|
or_ivar_assignment?(or_assignment)
end
end
end
end
end
end