Sha256: 9a5f4ca84e51e309f4b0f3f204651ba0bca64876073dd5ab522a3d0aaf202d52

Contents?: true

Size: 1.56 KB

Versions: 20

Compression:

Stored size: 1.56 KB

Contents

# frozen_string_literal: true

module DeepCover
  ##
  # A processor which computes which lines to be considered flagged with the
  # given lookup
  #
  class FlagCommentAssociator
    ##
    # @param [DeepCover::RootNode] ast
    # @param [Array(Parser::Source::Comment)] comments
    def initialize(covered_code, lookup = 'nocov')
      @covered_code = covered_code
      @lookup      = /^#[\s#*-]*#{lookup}[\s#*-]*$/
      @ranges      = nil
    end

    def include?(range)
      return false unless (exp = range.expression)
      lineno = exp.line
      ranges.any? { |r| r.cover? lineno }
    end

    def ranges
      @ranges ||= compute_ranges
    end

    private

    def compute_ranges
      @ranges     = []
      @flag_start = nil
      index_ast_lines
      @covered_code.comments.each { |comment| process(comment) }
      toggle_flag(@covered_code.buffer.last_line) # handle end of file in case of opened flag
      @ranges
    end

    def process(comment)
      return unless comment.text =~ @lookup
      ln = comment.location.expression.line
      toggle_flag(ln) unless line_has_only_comments?(ln)
      toggle_flag(ln + 1)
    end

    def toggle_flag(lineno)
      if @flag_start
        @ranges << (@flag_start..(lineno - 1))
        @flag_start = nil
      else
        @flag_start = lineno
      end
    end

    def index_ast_lines
      @starts = []
      @covered_code.each_node do |node|
        if (exp = node.expression)
          @starts[exp.line] = true
        end
      end
    end

    def line_has_only_comments?(line)
      !@starts[line]
    end
  end
end

Version data entries

20 entries across 20 versions & 2 rubygems

Version Path
deep-cover-core-0.7.4 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.7.3 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.7.2 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.7.1 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.7.0 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.6.4 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.6.3 lib/deep_cover/flag_comment_associator.rb
deep-cover-core-0.6.3.pre lib/deep_cover/flag_comment_associator.rb
deep-cover-0.6.2 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.6.1 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.6.0 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.7 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.6 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.5 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.4 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.3 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.2 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.1 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.5.0 lib/deep_cover/flag_comment_associator.rb
deep-cover-0.4.0 lib/deep_cover/flag_comment_associator.rb