def UpdatePreprocessor(self, line):
if Match(r'<STR_LIT>', line):<EOL><INDENT>self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack)))<EOL><DEDENT>elif Match(r'<STR_LIT>', line):<EOL><INDENT>if self.pp_stack:<EOL><INDENT>if not self.pp_stack[-<NUM_LIT:1>].seen_else:<EOL><INDENT>self.pp_stack[-<NUM_LIT:1>].seen_else = True<EOL>self.pp_stack[-<NUM_LIT:1>].stack_before_else = copy.deepcopy(self.stack)<EOL><DEDENT>self.stack = copy.deepcopy(self.pp_stack[-<NUM_LIT:1>].stack_before_if)<EOL><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT>elif Match(r'<STR_LIT>', line):<EOL><INDENT>if self.pp_stack:<EOL><INDENT>if self.pp_stack[-<NUM_LIT:1>].seen_else:<EOL><INDENT>self.stack = self.pp_stack[-<NUM_LIT:1>].stack_before_else<EOL><DEDENT>self.pp_stack.pop()<EOL><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT>
Update preprocessor stack.

        We need to handle preprocessors due to classes like this:
          #ifdef SWIG
          struct ResultDetailsPageElementExtensionPoint {
          #else
          struct ResultDetailsPageElementExtensionPoint : public Extension {
          #endif

        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.