Path: blob/main/Tools/c-analyzer/c_parser/datafiles.py
12 views
import os.path12from c_common import fsutil3import c_common.tables as _tables4import c_parser.info as _info567BASE_COLUMNS = [8'filename',9'funcname',10'name',11'kind',12]13END_COLUMNS = {14'parsed': 'data',15'decls': 'declaration',16}171819def _get_columns(group, extra=None):20return BASE_COLUMNS + list(extra or ()) + [END_COLUMNS[group]]21#return [22# *BASE_COLUMNS,23# *extra or (),24# END_COLUMNS[group],25#]262728#############################29# high-level3031def read_parsed(infile):32# XXX Support other formats than TSV?33columns = _get_columns('parsed')34for row in _tables.read_table(infile, columns, sep='\t', fix='-'):35yield _info.ParsedItem.from_row(row, columns)363738def write_parsed(items, outfile):39# XXX Support other formats than TSV?40columns = _get_columns('parsed')41rows = (item.as_row(columns) for item in items)42_tables.write_table(outfile, columns, rows, sep='\t', fix='-')434445def read_decls(infile, fmt=None):46if fmt is None:47fmt = _get_format(infile)48read_all, _ = _get_format_handlers('decls', fmt)49for decl, _ in read_all(infile):50yield decl515253def write_decls(decls, outfile, fmt=None, *, backup=False):54if fmt is None:55fmt = _get_format(infile)56_, write_all = _get_format_handlers('decls', fmt)57write_all(decls, outfile, backup=backup)585960#############################61# formats6263def _get_format(file, default='tsv'):64if isinstance(file, str):65filename = file66else:67filename = getattr(file, 'name', '')68_, ext = os.path.splitext(filename)69return ext[1:] if ext else default707172def _get_format_handlers(group, fmt):73# XXX Use a registry.74if group != 'decls':75raise NotImplementedError(group)76if fmt == 'tsv':77return (_iter_decls_tsv, _write_decls_tsv)78else:79raise NotImplementedError(fmt)808182# tsv8384def iter_decls_tsv(infile, extracolumns=None, relroot=fsutil.USE_CWD):85if relroot and relroot is not fsutil.USE_CWD:86relroot = os.path.abspath(relroot)87for info, extra in _iter_decls_tsv(infile, extracolumns):88decl = _info.Declaration.from_row(info)89decl = decl.fix_filename(relroot, formatted=False, fixroot=False)90yield decl, extra919293def write_decls_tsv(decls, outfile, extracolumns=None, *,94relroot=fsutil.USE_CWD,95**kwargs96):97if relroot and relroot is not fsutil.USE_CWD:98relroot = os.path.abspath(relroot)99decls = (d.fix_filename(relroot, fixroot=False) for d in decls)100# XXX Move the row rendering here.101_write_decls_tsv(decls, outfile, extracolumns, kwargs)102103104def _iter_decls_tsv(infile, extracolumns=None):105columns = _get_columns('decls', extracolumns)106for row in _tables.read_table(infile, columns, sep='\t'):107if extracolumns:108declinfo = row[:4] + row[-1:]109extra = row[4:-1]110else:111declinfo = row112extra = None113# XXX Use something like tables.fix_row() here.114declinfo = [None if v == '-' else v115for v in declinfo]116yield declinfo, extra117118119def _write_decls_tsv(decls, outfile, extracolumns, kwargs):120columns = _get_columns('decls', extracolumns)121if extracolumns:122def render_decl(decl):123if type(row) is tuple:124decl, *extra = decl125else:126extra = ()127extra += ('???',) * (len(extraColumns) - len(extra))128*row, declaration = _render_known_row(decl)129row += extra + (declaration,)130return row131else:132render_decl = _render_known_decl133_tables.write_table(134outfile,135header='\t'.join(columns),136rows=(render_decl(d) for d in decls),137sep='\t',138**kwargs139)140141142def _render_known_decl(decl, *,143# These match BASE_COLUMNS + END_COLUMNS[group].144_columns = 'filename parent name kind data'.split(),145):146if not isinstance(decl, _info.Declaration):147# e.g. Analyzed148decl = decl.decl149rowdata = decl.render_rowdata(_columns)150return [rowdata[c] or '-' for c in _columns]151# XXX152#return _tables.fix_row(rowdata[c] for c in columns)153154155