Sha256: d8e7a39a60a7d17302a730f5bd6331bf14200d2c33021d296a2b14d05b582296

Contents?: true

Size: 1.6 KB

Versions: 3

Compression:

Stored size: 1.6 KB

Contents

# encoding: utf-8

module Rubocop
  module Cop
    module Style
      # This cop if/unless expression that can be replace with a guard clause.
      #
      # @example
      #
      #   # bad
      #   def test
      #     if something
      #       work
      #       work
      #       work
      #     end
      #   end
      #
      #   # good
      #   def test
      #     return unless something
      #     work
      #     work
      #     work
      #   end
      #
      # It should be extended to handle methods whose body is if/else
      # or a case expression with a default branch.
      class GuardClause < Cop
        include CheckMethods
        include IfNode

        MSG = 'Use a guard clause instead of wrapping ' \
              'the code inside a conditional expression.'

        private

        def check(_node, _method_name, _args, body)
          return unless body

          if body.type == :if
            check_if_node(body)
          elsif body.type == :begin
            expressions = *body
            last_expr = expressions.last

            check_if_node(last_expr) if last_expr && last_expr.type == :if
          end
        end

        def check_if_node(node)
          _cond, _body, else_body = *node

          return if else_body
          # discard modifier ifs and ternary_ops
          return if modifier_if?(node) || ternary_op?(node)
          # discard short ifs
          return unless if_length(node) > 3

          add_offense(node, :keyword)
        end

        def if_length(node)
          node.loc.end.line - node.loc.keyword.line + 1
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rubocop-0.21.0 lib/rubocop/cop/style/guard_clause.rb
rubocop-0.20.1 lib/rubocop/cop/style/guard_clause.rb
rubocop-0.20.0 lib/rubocop/cop/style/guard_clause.rb