parameters: (filename, clean_lines, linenum, nesting_state, error)
docstring: Checks for the correctness of various spacing issues in the code.
  
    Things we check for: spaces around operators, spaces after
    if/for/while/switch, no spaces around parens in function calls, two
    spaces between code and comment, don't start a block with a blank
    line, don't end a function with a blank line, don't add a blank line
    after public/protected/private, don't have too many blank lines in a row.
  
    Args:
      filename: The name of the current file.
      clean_lines: A CleansedLines instance containing the file.
      linenum: The number of the line to check.
      nesting_state: A NestingState instance which maintains information about
                     the current stack of nested blocks being parsed.
      error: The function to call with any errors found.
docstring_summary: Checks for the correctness of various spacing issues in the code.
docstring_tokens: Checks for the correctness of various spacing issues in the code .
function: def CheckSpacing(filename, clean_lines, linenum, nesting_state, error):
    """Checks for the correctness of various spacing issues in the code.
  
    Things we check for: spaces around operators, spaces after
    if/for/while/switch, no spaces around parens in function calls, two
    spaces between code and comment, don't start a block with a blank
    line, don't end a function with a blank line, don't add a blank line
    after public/protected/private, don't have too many blank lines in a row.
  
    Args:
      filename: The name of the current file.
      clean_lines: A CleansedLines instance containing the file.
      linenum: The number of the line to check.
      nesting_state: A NestingState instance which maintains information about
                     the current stack of nested blocks being parsed.
      error: The function to call with any errors found.
    """
  
    # Don't use "elided" lines here, otherwise we can't check commented lines.
    # Don't want to use "raw" either, because we don't want to check inside C++11
    # raw strings,
    raw = clean_lines.lines_without_raw_strings
    line = raw[linenum]
  
    # Before nixing comments, check if the line is blank for no good
    # reason.  This includes the first line after a block is opened, and
    # blank lines at the end of a function (ie, right before a line like '}'
    #
    # Skip all the blank line checks if we are immediately inside a
    # namespace body.  In other words, don't issue blank line warnings
    # for this block:
    #   namespace {
    #
    #   }
    #
    # A warning about missing end of namespace comments will be issued instead.
    #
    # Also skip blank line checks for 'extern "C"' blocks, which are formatted
    # like namespaces.
    if (IsBlankLine(line) and
        not nesting_state.InNamespaceBody() and
        not nesting_state.InExternC()):
      elided = clean_lines.elided
      prev_line = elided[linenum - 1]
      prevbrace = prev_line.rfind('{')
      # TODO(unknown): Don't complain if line before blank line, and line after,
      #                both start with alnums and are indented the same amount.
      #                This ignores whitespace at the start of a namespace block
      #                because those are not usually indented.
      if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1:
        # OK, we have a blank line at the start of a code block.  Before we
        # complain, we check if it is an exception to the rule: The previous
        # non-empty line has the parameters of a function header that are indented
        # 4 spaces (because they did not fit in a 80 column line when placed on
        # the same line as the function name).  We also check for the case where
        # the previous line is indented 6 spaces, which may happen when the
        # initializers of a constructor do not fit into a 80 column line.
        exception = False
        if Match(r' {6}\w', prev_line):  # Initializer list?
          # We are looking for the opening column of initializer list, which
          # should be indented 4 spaces to cause 6 space indentation afterwards.
          search_position = linenum-2
          while (search_position >= 0
                 and Match(r' {6}\w', elided[search_position])):
            search_position -= 1
          exception = (search_position >= 0
                       and elided[search_position][:5] == '    :')
        else:
          # Search for the function arguments or an initializer list.  We use a
          # simple heuristic here: If the line is indented 4 spaces; and we have a
          # closing paren, without the opening paren, followed by an opening brace
          # or colon (for initializer lists) we assume that it is the last line of
          # a function header.  If we have a colon indented 4 spaces, it is an
          # initializer list.
          exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)',
                             prev_line)
                       or Match(r' {4}:', prev_line))
  
        if not exception:
          error(filename, linenum, 'whitespace/blank_line', 2,
                'Redundant blank line at the start of a code block '
                'should be deleted.')
      # Ignore blank lines at the end of a block in a long if-else
      # chain, like this:
      #   if (condition1) {
      #     // Something followed by a blank line
      #
      #   } else if (condition2) {
      #     // Something else
      #   }
      if linenum + 1 < clean_lines.NumLines():
        next_line = raw[linenum + 1]
        if (next_line
            and Match(r'\s*}', next_line)
            and next_line.find('} else ') == -1):
          error(filename, linenum, 'whitespace/blank_line', 3,
                'Redundant blank line at the end of a code block '
                'should be deleted.')
  
      matched = Match(r'\s*(public|protected|private):', prev_line)
      if matched:
        error(filename, linenum, 'whitespace/blank_line', 3,
              'Do not leave a blank line after "%s:"' % matched.group(1))
  
    # Next, check comments
    next_line_start = 0
    if linenum + 1 < clean_lines.NumLines():
      next_line = raw[linenum + 1]
      next_line_start = len(next_line) - len(next_line.lstrip())
    CheckComment(line, filename, linenum, next_line_start, error)
  
    # get rid of comments and strings
    line = clean_lines.elided[linenum]
  
    # You shouldn't have spaces before your brackets, except maybe after
    # 'delete []' or 'return []() {};'
    if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line):
      error(filename, linenum, 'whitespace/braces', 5,
            'Extra space before [')
  
    # In range-based for, we wanted spaces before and after the colon, but
    # not around "::" tokens that might appear.
    if (Search(r'for *\(.*[^:]:[^: ]', line) or
        Search(r'for *\(.*[^: ]:[^:]', line)):
      error(filename, linenum, 'whitespace/forcolon', 2,
            'Missing space around colon in range-based for loop')
function_tokens: def CheckSpacing ( filename , clean_lines , linenum , nesting_state , error ) : # Don't use "elided" lines here, otherwise we can't check commented lines. # Don't want to use "raw" either, because we don't want to check inside C++11 # raw strings, raw = clean_lines . lines_without_raw_strings line = raw [ linenum ] # Before nixing comments, check if the line is blank for no good # reason.  This includes the first line after a block is opened, and # blank lines at the end of a function (ie, right before a line like '}' # # Skip all the blank line checks if we are immediately inside a # namespace body.  In other words, don't issue blank line warnings # for this block: #   namespace { # #   } # # A warning about missing end of namespace comments will be issued instead. # # Also skip blank line checks for 'extern "C"' blocks, which are formatted # like namespaces. if ( IsBlankLine ( line ) and not nesting_state . InNamespaceBody ( ) and not nesting_state . InExternC ( ) ) : elided = clean_lines . elided prev_line = elided [ linenum - 1 ] prevbrace = prev_line . rfind ( '{' ) # TODO(unknown): Don't complain if line before blank line, and line after, #                both start with alnums and are indented the same amount. #                This ignores whitespace at the start of a namespace block #                because those are not usually indented. if prevbrace != - 1 and prev_line [ prevbrace : ] . find ( '}' ) == - 1 : # OK, we have a blank line at the start of a code block.  Before we # complain, we check if it is an exception to the rule: The previous # non-empty line has the parameters of a function header that are indented # 4 spaces (because they did not fit in a 80 column line when placed on # the same line as the function name).  We also check for the case where # the previous line is indented 6 spaces, which may happen when the # initializers of a constructor do not fit into a 80 column line. exception = False if Match ( r' {6}\w' , prev_line ) : # Initializer list? # We are looking for the opening column of initializer list, which # should be indented 4 spaces to cause 6 space indentation afterwards. search_position = linenum - 2 while ( search_position >= 0 and Match ( r' {6}\w' , elided [ search_position ] ) ) : search_position -= 1 exception = ( search_position >= 0 and elided [ search_position ] [ : 5 ] == '    :' ) else : # Search for the function arguments or an initializer list.  We use a # simple heuristic here: If the line is indented 4 spaces; and we have a # closing paren, without the opening paren, followed by an opening brace # or colon (for initializer lists) we assume that it is the last line of # a function header.  If we have a colon indented 4 spaces, it is an # initializer list. exception = ( Match ( r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)' , prev_line ) or Match ( r' {4}:' , prev_line ) ) if not exception : error ( filename , linenum , 'whitespace/blank_line' , 2 , 'Redundant blank line at the start of a code block ' 'should be deleted.' ) # Ignore blank lines at the end of a block in a long if-else # chain, like this: #   if (condition1) { #     // Something followed by a blank line # #   } else if (condition2) { #     // Something else #   } if linenum + 1 < clean_lines . NumLines ( ) : next_line = raw [ linenum + 1 ] if ( next_line and Match ( r'\s*}' , next_line ) and next_line . find ( '} else ' ) == - 1 ) : error ( filename , linenum , 'whitespace/blank_line' , 3 , 'Redundant blank line at the end of a code block ' 'should be deleted.' ) matched = Match ( r'\s*(public|protected|private):' , prev_line ) if matched : error ( filename , linenum , 'whitespace/blank_line' , 3 , 'Do not leave a blank line after "%s:"' % matched . group ( 1 ) ) # Next, check comments next_line_start = 0 if linenum + 1 < clean_lines . NumLines ( ) : next_line = raw [ linenum + 1 ] next_line_start = len ( next_line ) - len ( next_line . lstrip ( ) ) CheckComment ( line , filename , linenum , next_line_start , error ) # get rid of comments and strings line = clean_lines . elided [ linenum ] # You shouldn't have spaces before your brackets, except maybe after # 'delete []' or 'return []() {};' if Search ( r'\w\s+\[' , line ) and not Search ( r'(?:delete|return)\s+\[' , line ) : error ( filename , linenum , 'whitespace/braces' , 5 , 'Extra space before [' ) # In range-based for, we wanted spaces before and after the colon, but # not around "::" tokens that might appear. if ( Search ( r'for *\(.*[^:]:[^: ]' , line ) or Search ( r'for *\(.*[^: ]:[^:]' , line ) ) : error ( filename , linenum , 'whitespace/forcolon' , 2 , 'Missing space around colon in range-based for loop' )