parameters: (input_api, output_api)
return_statement: return []
docstring: Checks that each #define in a .cc file is eventually followed by an #undef.
  
    TODO(clemensb): This check should eventually be enabled for all cc files via
    tools/presubmit.py (https://crbug.com/v8/6811).
docstring_summary: Checks that each #define in a .cc file is eventually followed by an #undef.
docstring_tokens: Checks that each #define in a . cc file is eventually followed by an #undef .
function: def _CheckMacroUndefs(input_api, output_api):
    """
    Checks that each #define in a .cc file is eventually followed by an #undef.
  
    TODO(clemensb): This check should eventually be enabled for all cc files via
    tools/presubmit.py (https://crbug.com/v8/6811).
    """
    def FilterFile(affected_file):
      # Skip header files, as they often define type lists which are used in
      # other files.
      white_list = (r'.+\.cc',r'.+\.cpp',r'.+\.c')
      return input_api.FilterSourceFile(affected_file, white_list=white_list)
  
    def Touches(line):
      return line.startswith('+') or line.startswith('-')
  
    def InvolvesMacros(text):
      return define_pattern.match(text) or undef_pattern.match(text)
  
    def TouchesMacros(f):
      return any(Touches(line) and InvolvesMacros(line[1:])
                 for line in f.GenerateScmDiff().splitlines())
  
    def CollectUndefsWithNoDef(defined_macros, errors, f, line, line_nr):
      define_match = define_pattern.match(line)
      if define_match:
        name = define_match.group(1)
        defined_macros[name] = line_nr
      undef_match = undef_pattern.match(line)
      if undef_match and not "// NOLINT" in line:
        name = undef_match.group(1)
        if name in defined_macros:
          del defined_macros[name]
        else:
          errors.append('{}:{}: Macro named \'{}\' was not defined before.'
                        .format(f.LocalPath(), line_nr, name))
  
    define_pattern = input_api.re.compile(r'#define (\w+)')
    undef_pattern = input_api.re.compile(r'#undef (\w+)')
    errors = []
    for f in input_api.AffectedFiles(
        file_filter=FilterFile, include_deletes=False):
      if not TouchesMacros(f):
        continue
  
      defined_macros = dict()
      with open(f.LocalPath()) as fh:
        for line_nr, line in enumerate(fh, start=1):
          CollectUndefsWithNoDef(defined_macros, errors, f, line, line_nr)
  
      for name, line_nr in sorted(defined_macros.items(), key=lambda e: e[1]):
        errors.append('{}:{}: Macro missing #undef: {}'
                      .format(f.LocalPath(), line_nr, name))
  
    if errors:
      return [output_api.PresubmitPromptOrNotify(
          'Detected mismatches in #define / #undef in the file(s) where you '
          'modified preprocessor macros.',
          errors)]
    return []
function_tokens: def _CheckMacroUndefs ( input_api , output_api ) : def FilterFile ( affected_file ) : # Skip header files, as they often define type lists which are used in # other files. white_list = ( r'.+\.cc' , r'.+\.cpp' , r'.+\.c' ) return input_api . FilterSourceFile ( affected_file , white_list = white_list ) def Touches ( line ) : return line . startswith ( '+' ) or line . startswith ( '-' ) def InvolvesMacros ( text ) : return define_pattern . match ( text ) or undef_pattern . match ( text ) def TouchesMacros ( f ) : return any ( Touches ( line ) and InvolvesMacros ( line [ 1 : ] ) for line in f . GenerateScmDiff ( ) . splitlines ( ) ) def CollectUndefsWithNoDef ( defined_macros , errors , f , line , line_nr ) : define_match = define_pattern . match ( line ) if define_match : name = define_match . group ( 1 ) defined_macros [ name ] = line_nr undef_match = undef_pattern . match ( line ) if undef_match and not "// NOLINT" in line : name = undef_match . group ( 1 ) if name in defined_macros : del defined_macros [ name ] else : errors . append ( '{}:{}: Macro named \'{}\' was not defined before.' . format ( f . LocalPath ( ) , line_nr , name ) ) define_pattern = input_api . re . compile ( r'#define (\w+)' ) undef_pattern = input_api . re . compile ( r'#undef (\w+)' ) errors = [ ] for f in input_api . AffectedFiles ( file_filter = FilterFile , include_deletes = False ) : if not TouchesMacros ( f ) : continue defined_macros = dict ( ) with open ( f . LocalPath ( ) ) as fh : for line_nr , line in enumerate ( fh , start = 1 ) : CollectUndefsWithNoDef ( defined_macros , errors , f , line , line_nr ) for name , line_nr in sorted ( defined_macros . items ( ) , key = lambda e : e [ 1 ] ) : errors . append ( '{}:{}: Macro missing #undef: {}' . format ( f . LocalPath ( ) , line_nr , name ) ) if errors : return [ output_api . PresubmitPromptOrNotify ( 'Detected mismatches in #define / #undef in the file(s) where you ' 'modified preprocessor macros.' , errors ) ] return [ ]