parameters: (self, line)
docstring: Update preprocessor stack.
  
      We need to handle preprocessors due to classes like this:
        #ifdef SWIG
        struct ResultDetailsPageElementExtensionPoint {
        #else
        struct ResultDetailsPageElementExtensionPoint : public Extension {
        #endif
      (see http://go/qwddn for original example)
  
      We make the following assumptions (good enough for most files):
      - Preprocessor condition evaluates to true from #if up to first
        #else/#elif/#endif.
  
      - Preprocessor condition evaluates to false from #else/#elif up
        to #endif.  We still perform lint checks on these lines, but
        these do not affect nesting stack.
  
      Args:
        line: current line to check.
docstring_summary: Update preprocessor stack.
docstring_tokens: Update preprocessor stack .
function: def UpdatePreprocessor(self, line):
      """Update preprocessor stack.
  
      We need to handle preprocessors due to classes like this:
        #ifdef SWIG
        struct ResultDetailsPageElementExtensionPoint {
        #else
        struct ResultDetailsPageElementExtensionPoint : public Extension {
        #endif
      (see http://go/qwddn for original example)
  
      We make the following assumptions (good enough for most files):
      - Preprocessor condition evaluates to true from #if up to first
        #else/#elif/#endif.
  
      - Preprocessor condition evaluates to false from #else/#elif up
        to #endif.  We still perform lint checks on these lines, but
        these do not affect nesting stack.
  
      Args:
        line: current line to check.
      """
      if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line):
        # Beginning of #if block, save the nesting stack here.  The saved
        # stack will allow us to restore the parsing state in the #else case.
        self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack)))
      elif Match(r'^\s*#\s*(else|elif)\b', line):
        # Beginning of #else block
        if self.pp_stack:
          if not self.pp_stack[-1].seen_else:
            # This is the first #else or #elif block.  Remember the
            # whole nesting stack up to this point.  This is what we
            # keep after the #endif.
            self.pp_stack[-1].seen_else = True
            self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack)
  
          # Restore the stack to how it was before the #if
          self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if)
        else:
          # TODO(unknown): unexpected #else, issue warning?
          pass
      elif Match(r'^\s*#\s*endif\b', line):
        # End of #if or #else blocks.
        if self.pp_stack:
          # If we saw an #else, we will need to restore the nesting
          # stack to its former state before the #else, otherwise we
          # will just continue from where we left off.
          if self.pp_stack[-1].seen_else:
            # Here we can just use a shallow copy since we are the last
            # reference to it.
            self.stack = self.pp_stack[-1].stack_before_else
          # Drop the corresponding #if
          self.pp_stack.pop()
        else:
          # TODO(unknown): unexpected #endif, issue warning?
          pass
function_tokens: def UpdatePreprocessor ( self , line ) : if Match ( r'^\s*#\s*(if|ifdef|ifndef)\b' , line ) : # Beginning of #if block, save the nesting stack here.  The saved # stack will allow us to restore the parsing state in the #else case. self . pp_stack . append ( _PreprocessorInfo ( copy . deepcopy ( self . stack ) ) ) elif Match ( r'^\s*#\s*(else|elif)\b' , line ) : # Beginning of #else block if self . pp_stack : if not self . pp_stack [ - 1 ] . seen_else : # This is the first #else or #elif block.  Remember the # whole nesting stack up to this point.  This is what we # keep after the #endif. self . pp_stack [ - 1 ] . seen_else = True self . pp_stack [ - 1 ] . stack_before_else = copy . deepcopy ( self . stack ) # Restore the stack to how it was before the #if self . stack = copy . deepcopy ( self . pp_stack [ - 1 ] . stack_before_if ) else : # TODO(unknown): unexpected #else, issue warning? pass elif Match ( r'^\s*#\s*endif\b' , line ) : # End of #if or #else blocks. if self . pp_stack : # If we saw an #else, we will need to restore the nesting # stack to its former state before the #else, otherwise we # will just continue from where we left off. if self . pp_stack [ - 1 ] . seen_else : # Here we can just use a shallow copy since we are the last # reference to it. self . stack = self . pp_stack [ - 1 ] . stack_before_else # Drop the corresponding #if self . pp_stack . pop ( ) else : # TODO(unknown): unexpected #endif, issue warning? pass