Sha256: 4fcbc4f1faa2ef9cc6157ec4aee7ac60ee6aeb46087dbf9ed818a7774e47440a
Contents?: true
Size: 1.85 KB
Versions: 3
Compression:
Stored size: 1.85 KB
Contents
require 'roodi/checks/check' module Roodi module Checks class AbcMetricMethodCheck < Check #TODO: '-=' does not work in the moment! ASSIGNMENTS = [:lasgn] BRANCHES = [:vcall, :call] CONDITIONS = [:==, :<=, :>=, :<, :>] OPERATORS = [:*, :/, :%, :+, :<<, :>>, :&, :|, :^] DEFAULT_SCORE = 10 def initialize(options = {}) super() @score = options['score'] || DEFAULT_SCORE end def interesting_nodes [:defn] end def evaluate(node) method_name = node[1] a = count_assignments(node) b = count_branches(node) c = count_conditionals(node) score = Math.sqrt(a*a + b*b + c*c) add_error({ :method => method_name, :score => score }) unless score <= @score end private def count_assignments(node) count = 0 count = count + 1 if assignment?(node) node.children.each {|node| count += count_assignments(node)} count end def count_branches(node) count = 0 count = count + 1 if branch?(node) node.children.each {|node| count += count_branches(node)} count end def count_conditionals(node) count = 0 count = count + 1 if conditional?(node) node.children.each {|node| count += count_conditionals(node)} count end def assignment?(node) ASSIGNMENTS.include?(node.node_type) end def branch?(node) BRANCHES.include?(node.node_type) && !conditional?(node) && !operator?(node) end def conditional?(node) (:call == node.node_type) && CONDITIONS.include?(node[2]) end def operator?(node) (:call == node.node_type) && OPERATORS.include?(node[2]) end end end end
Version data entries
3 entries across 3 versions & 1 rubygems