mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os.path
 | |
| 
 | |
| from c_common import fsutil
 | |
| import c_common.tables as _tables
 | |
| import c_parser.info as _info
 | |
| import c_parser.match as _match
 | |
| import c_parser.datafiles as _parser
 | |
| from . import analyze as _analyze
 | |
| 
 | |
| 
 | |
| #############################
 | |
| # "known" decls
 | |
| 
 | |
| EXTRA_COLUMNS = [
 | |
|     #'typedecl',
 | |
| ]
 | |
| 
 | |
| 
 | |
| def get_known(known, extracolumns=None, *,
 | |
|               analyze_resolved=None,
 | |
|               handle_unresolved=True,
 | |
|               relroot=fsutil.USE_CWD,
 | |
|               ):
 | |
|     if isinstance(known, str):
 | |
|         known = read_known(known, extracolumns, relroot)
 | |
|     return analyze_known(
 | |
|         known,
 | |
|         handle_unresolved=handle_unresolved,
 | |
|         analyze_resolved=analyze_resolved,
 | |
|     )
 | |
| 
 | |
| 
 | |
| def read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD):
 | |
|     extracolumns = EXTRA_COLUMNS + (
 | |
|         list(extracolumns) if extracolumns else []
 | |
|     )
 | |
|     known = {}
 | |
|     for decl, extra in _parser.iter_decls_tsv(infile, extracolumns, relroot):
 | |
|         known[decl] = extra
 | |
|     return known
 | |
| 
 | |
| 
 | |
| def analyze_known(known, *,
 | |
|                   analyze_resolved=None,
 | |
|                   handle_unresolved=True,
 | |
|                   ):
 | |
|     knowntypes = knowntypespecs = {}
 | |
|     collated = _match.group_by_kinds(known)
 | |
|     types = {decl: None for decl in collated['type']}
 | |
|     typespecs = _analyze.get_typespecs(types)
 | |
|     def analyze_decl(decl):
 | |
|         return _analyze.analyze_decl(
 | |
|             decl,
 | |
|             typespecs,
 | |
|             knowntypespecs,
 | |
|             types,
 | |
|             knowntypes,
 | |
|             analyze_resolved=analyze_resolved,
 | |
|         )
 | |
|     _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved)
 | |
|     return types, typespecs
 | |
| 
 | |
| 
 | |
| def write_known(rows, outfile, extracolumns=None, *,
 | |
|                 relroot=fsutil.USE_CWD,
 | |
|                 backup=True,
 | |
|                 ):
 | |
|     extracolumns = EXTRA_COLUMNS + (
 | |
|         list(extracolumns) if extracolumns else []
 | |
|     )
 | |
|     _parser.write_decls_tsv(
 | |
|         rows,
 | |
|         outfile,
 | |
|         extracolumns,
 | |
|         relroot=relroot,
 | |
|         backup=backup,
 | |
|     )
 | |
| 
 | |
| 
 | |
| #############################
 | |
| # ignored vars
 | |
| 
 | |
| IGNORED_COLUMNS = [
 | |
|     'filename',
 | |
|     'funcname',
 | |
|     'name',
 | |
|     'reason',
 | |
| ]
 | |
| IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS)
 | |
| 
 | |
| 
 | |
| def read_ignored(infile, relroot=fsutil.USE_CWD):
 | |
|     return dict(_iter_ignored(infile, relroot))
 | |
| 
 | |
| 
 | |
| def _iter_ignored(infile, relroot):
 | |
|     if relroot and relroot is not fsutil.USE_CWD:
 | |
|         relroot = os.path.abspath(relroot)
 | |
|     bogus = {_tables.EMPTY, _tables.UNKNOWN}
 | |
|     for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'):
 | |
|         *varidinfo, reason = row
 | |
|         if _tables.EMPTY in varidinfo or _tables.UNKNOWN in varidinfo:
 | |
|             varidinfo = tuple(None if v in bogus else v
 | |
|                               for v in varidinfo)
 | |
|         if reason in bogus:
 | |
|             reason = None
 | |
|         varid = _info.DeclID.from_row(varidinfo)
 | |
|         varid = varid.fix_filename(relroot, formatted=False, fixroot=False)
 | |
|         yield varid, reason
 | |
| 
 | |
| 
 | |
| def write_ignored(variables, outfile, relroot=fsutil.USE_CWD):
 | |
|     raise NotImplementedError
 | |
|     if relroot and relroot is not fsutil.USE_CWD:
 | |
|         relroot = os.path.abspath(relroot)
 | |
|     reason = '???'
 | |
|     #if not isinstance(varid, DeclID):
 | |
|     #    varid = getattr(varid, 'parsed', varid).id
 | |
|     decls = (d.fix_filename(relroot, fixroot=False) for d in decls)
 | |
|     _tables.write_table(
 | |
|         outfile,
 | |
|         IGNORED_HEADER,
 | |
|         sep='\t',
 | |
|         rows=(r.render_rowdata() + (reason,) for r in decls),
 | |
|     )
 | 
