126 lines
3.4 KiB
Python
126 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),
|
|
)
|