Sha256: f8f43f75a87118124db2ceda351db8d7dfd3ff8ba716db786284c11ca6f898f7

Contents?: true

Size: 1.4 KB

Versions: 5

Compression:

Stored size: 1.4 KB

Contents

# encoding: utf-8

module Rubocop
  module Cop
    module Lint
      # This cop checks for assignments in the conditions of
      # if/while/until.
      class AssignmentInCondition < Cop
        ASGN_NODES = [:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn]
        MSG = 'Assignment in condition - you probably meant to use ==.'

        def on_if(node)
          check(node)
        end

        def on_while(node)
          check(node)
        end

        def on_until(node)
          check(node)
        end

        private

        def check(node)
          condition, = *node

          # assignments inside blocks are not what we're looking for
          return if condition.type == :block

          on_node([:begin, *ASGN_NODES], condition) do |asgn_node|
            # skip safe assignment nodes if safe assignment is allowed
            return if safe_assignment_allowed? && safe_assignment?(asgn_node)

            # assignment nodes from shorthand ops like ||= don't have operator
            if asgn_node.type != :begin && asgn_node.loc.operator
              warning(asgn_node, :operator)
            end
          end
        end

        def safe_assignment?(node)
          node.type == :begin && node.children.size == 1 &&
            ASGN_NODES.include?(node.children[0].type)
        end

        def safe_assignment_allowed?
          cop_config['AllowSafeAssignment']
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rubocop-0.15.0 lib/rubocop/cop/lint/assignment_in_condition.rb
rubocop-0.14.1 lib/rubocop/cop/lint/assignment_in_condition.rb
rubocop-0.14.0 lib/rubocop/cop/lint/assignment_in_condition.rb
rubocop-0.13.1 lib/rubocop/cop/lint/assignment_in_condition.rb
rubocop-0.13.0 lib/rubocop/cop/lint/assignment_in_condition.rb