| 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), |
| ) |