(root)/
Python-3.12.0/
Tools/
c-analyzer/
c_analyzer/
datafiles.py
       1  import os.path
       2  
       3  from c_common import fsutil
       4  import c_common.tables as _tables
       5  import c_parser.info as _info
       6  import c_parser.match as _match
       7  import c_parser.datafiles as _parser
       8  from . import analyze as _analyze
       9  
      10  
      11  #############################
      12  # "known" decls
      13  
      14  EXTRA_COLUMNS = [
      15      #'typedecl',
      16  ]
      17  
      18  
      19  def get_known(known, extracolumns=None, *,
      20                analyze_resolved=None,
      21                handle_unresolved=True,
      22                relroot=fsutil.USE_CWD,
      23                ):
      24      if isinstance(known, str):
      25          known = read_known(known, extracolumns, relroot)
      26      return analyze_known(
      27          known,
      28          handle_unresolved=handle_unresolved,
      29          analyze_resolved=analyze_resolved,
      30      )
      31  
      32  
      33  def read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD):
      34      extracolumns = EXTRA_COLUMNS + (
      35          list(extracolumns) if extracolumns else []
      36      )
      37      known = {}
      38      for decl, extra in _parser.iter_decls_tsv(infile, extracolumns, relroot):
      39          known[decl] = extra
      40      return known
      41  
      42  
      43  def analyze_known(known, *,
      44                    analyze_resolved=None,
      45                    handle_unresolved=True,
      46                    ):
      47      knowntypes = knowntypespecs = {}
      48      collated = _match.group_by_kinds(known)
      49      types = {decl: None for decl in collated['type']}
      50      typespecs = _analyze.get_typespecs(types)
      51      def analyze_decl(decl):
      52          return _analyze.analyze_decl(
      53              decl,
      54              typespecs,
      55              knowntypespecs,
      56              types,
      57              knowntypes,
      58              analyze_resolved=analyze_resolved,
      59          )
      60      _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved)
      61      return types, typespecs
      62  
      63  
      64  def write_known(rows, outfile, extracolumns=None, *,
      65                  relroot=fsutil.USE_CWD,
      66                  backup=True,
      67                  ):
      68      extracolumns = EXTRA_COLUMNS + (
      69          list(extracolumns) if extracolumns else []
      70      )
      71      _parser.write_decls_tsv(
      72          rows,
      73          outfile,
      74          extracolumns,
      75          relroot=relroot,
      76          backup=backup,
      77      )
      78  
      79  
      80  #############################
      81  # ignored vars
      82  
      83  IGNORED_COLUMNS = [
      84      'filename',
      85      'funcname',
      86      'name',
      87      'reason',
      88  ]
      89  IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS)
      90  
      91  
      92  def read_ignored(infile, relroot=fsutil.USE_CWD):
      93      return dict(_iter_ignored(infile, relroot))
      94  
      95  
      96  def _iter_ignored(infile, relroot):
      97      if relroot and relroot is not fsutil.USE_CWD:
      98          relroot = os.path.abspath(relroot)
      99      bogus = {_tables.EMPTY, _tables.UNKNOWN}
     100      for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'):
     101          *varidinfo, reason = row
     102          if _tables.EMPTY in varidinfo or _tables.UNKNOWN in varidinfo:
     103              varidinfo = tuple(None if v in bogus else v
     104                                for v in varidinfo)
     105          if reason in bogus:
     106              reason = None
     107          varid = _info.DeclID.from_row(varidinfo)
     108          varid = varid.fix_filename(relroot, formatted=False, fixroot=False)
     109          yield varid, reason
     110  
     111  
     112  def write_ignored(variables, outfile, relroot=fsutil.USE_CWD):
     113      raise NotImplementedError
     114      if relroot and relroot is not fsutil.USE_CWD:
     115          relroot = os.path.abspath(relroot)
     116      reason = '???'
     117      #if not isinstance(varid, DeclID):
     118      #    varid = getattr(varid, 'parsed', varid).id
     119      decls = (d.fix_filename(relroot, fixroot=False) for d in decls)
     120      _tables.write_table(
     121          outfile,
     122          IGNORED_HEADER,
     123          sep='\t',
     124          rows=(r.render_rowdata() + (reason,) for r in decls),
     125      )