parameters: (file_lines, line_ranges)
docstring: Goes through all lines in line_ranges, and if any are dups, deletes them.
  
    For all lines in line_ranges, if any is the same as a previously
    seen line, set its deleted bit to True.  The purpose of line_ranges
    is to avoid lines in #ifdefs and namespaces, that may be identical
    syntactically but have different semantics.  Ideally, line_ranges
    should include only 'top-level' lines.
  
    We ignore lines that consist only of comments (or are blank).  We
    ignore end-of-line comments when comparing lines for equality.
    NOTE: Because our comment-finding RE is primitive, it's best if
    line_ranges covers only #include and forward-declare lines.  In
    particular, it should not cover lines that may have C literal
    strings in them.
  
    We only delete whole move_spans, not lines within them.
  
    Arguments:
      file_lines: an array of LineInfo objects.
      line_ranges: a list of [start_line, end_line) pairs.
docstring_summary: Goes through all lines in line_ranges, and if any are dups, deletes them.
docstring_tokens: Goes through all lines in line_ranges and if any are dups deletes them .
function: def _DeleteDuplicateLines(file_lines, line_ranges):
    """Goes through all lines in line_ranges, and if any are dups, deletes them.
  
    For all lines in line_ranges, if any is the same as a previously
    seen line, set its deleted bit to True.  The purpose of line_ranges
    is to avoid lines in #ifdefs and namespaces, that may be identical
    syntactically but have different semantics.  Ideally, line_ranges
    should include only 'top-level' lines.
  
    We ignore lines that consist only of comments (or are blank).  We
    ignore end-of-line comments when comparing lines for equality.
    NOTE: Because our comment-finding RE is primitive, it's best if
    line_ranges covers only #include and forward-declare lines.  In
    particular, it should not cover lines that may have C literal
    strings in them.
  
    We only delete whole move_spans, not lines within them.
  
    Arguments:
      file_lines: an array of LineInfo objects.
      line_ranges: a list of [start_line, end_line) pairs.
    """
    seen_lines = set()
    for line_range in line_ranges:
      for line_number in range(*line_range):
        line_info = file_lines[line_number]
        if line_info.type in (_BLANK_LINE_RE, _COMMENT_LINE_RE):
          continue
        if line_number != line_info.move_span[0]:
          continue
        span_line_numbers = range(line_info.move_span[0], line_info.move_span[1])
        line_infos_in_span = [file_lines[i] for i in span_line_numbers]
        uncommented_lines = [
            _COMMENT_RE.sub('', inf.line.strip()) for inf in line_infos_in_span]
        uncommented_span = ' '.join(uncommented_lines)
        if uncommented_span in seen_lines:
          for info in line_infos_in_span:
            info.deleted = True
        elif not line_info.deleted:
          seen_lines.add(uncommented_span)
function_tokens: def _DeleteDuplicateLines ( file_lines , line_ranges ) : seen_lines = set ( ) for line_range in line_ranges : for line_number in range ( * line_range ) : line_info = file_lines [ line_number ] if line_info . type in ( _BLANK_LINE_RE , _COMMENT_LINE_RE ) : continue if line_number != line_info . move_span [ 0 ] : continue span_line_numbers = range ( line_info . move_span [ 0 ] , line_info . move_span [ 1 ] ) line_infos_in_span = [ file_lines [ i ] for i in span_line_numbers ] uncommented_lines = [ _COMMENT_RE . sub ( '' , inf . line . strip ( ) ) for inf in line_infos_in_span ] uncommented_span = ' ' . join ( uncommented_lines ) if uncommented_span in seen_lines : for info in line_infos_in_span : info . deleted = True elif not line_info . deleted : seen_lines . add ( uncommented_span )