Sha256: 8460aba85fd4e407467964e1b208b675721cd32a9787e929d59366c478c4524b
Contents?: true
Size: 1.73 KB
Versions: 2
Compression:
Stored size: 1.73 KB
Contents
# frozen_string_literal: true module DeepCover class Analyser::Node < Analyser include Analyser::Subset def self.human_name 'Nodes' end def initialize(source, ignore_uncovered: [], **options) @cache = {}.compare_by_identity super @allow_filters = Array(ignore_uncovered).map { |kind| method(:"is_#{kind}?") } end def node_runs(node) @cache.fetch(node) do runs = super runs = nil if runs == 0 && should_be_ignored?(node) @cache[node] = runs end end def is_raise?(node) node.is_a?(Node::Send) && (node.message == :raise || node.message == :exit) end def is_default_argument?(node) node.parent.is_a?(Node::Optarg) end def is_case_implicit_else?(node) parent = node.parent node.is_a?(Node::EmptyBody) && parent.is_a?(Node::Case) && !parent.has_else? end def in_subset?(node, _parent) node.executable? end def is_trivial_if?(node) # Supports only node being a branch or the fork itself node.parent.is_a?(Node::If) && node.parent.condition.is_a?(Node::SingletonLiteral) end def self.optionally_covered @optionally_covered ||= instance_methods(false).map do |method| method =~ /^is_(.*)\?$/ Regexp.last_match(1) end.compact.map(&:to_sym).freeze end protected def convert(node, **) Analyser::CoveredCodeSource.new(node) end private def should_be_ignored?(node) @allow_filters.any? { |f| f[node] } || is_ignored?(node.parent) end def is_ignored?(node) if node == nil false elsif node.executable? node_runs(node).nil? else is_ignored?(node.parent) end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
deep-cover-0.3.0 | lib/deep_cover/analyser/node.rb |
deep-cover-0.2.0 | lib/deep_cover/analyser/node.rb |