17db96d56Sopenharmony_ciimport os.path
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_cifrom c_common import fsutil
47db96d56Sopenharmony_ciimport c_common.tables as _tables
57db96d56Sopenharmony_ciimport c_parser.info as _info
67db96d56Sopenharmony_ciimport c_parser.match as _match
77db96d56Sopenharmony_ciimport c_parser.datafiles as _parser
87db96d56Sopenharmony_cifrom . import analyze as _analyze
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci#############################
127db96d56Sopenharmony_ci# "known" decls
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciEXTRA_COLUMNS = [
157db96d56Sopenharmony_ci    #'typedecl',
167db96d56Sopenharmony_ci]
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_cidef get_known(known, extracolumns=None, *,
207db96d56Sopenharmony_ci              analyze_resolved=None,
217db96d56Sopenharmony_ci              handle_unresolved=True,
227db96d56Sopenharmony_ci              relroot=fsutil.USE_CWD,
237db96d56Sopenharmony_ci              ):
247db96d56Sopenharmony_ci    if isinstance(known, str):
257db96d56Sopenharmony_ci        known = read_known(known, extracolumns, relroot)
267db96d56Sopenharmony_ci    return analyze_known(
277db96d56Sopenharmony_ci        known,
287db96d56Sopenharmony_ci        handle_unresolved=handle_unresolved,
297db96d56Sopenharmony_ci        analyze_resolved=analyze_resolved,
307db96d56Sopenharmony_ci    )
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_cidef read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD):
347db96d56Sopenharmony_ci    extracolumns = EXTRA_COLUMNS + (
357db96d56Sopenharmony_ci        list(extracolumns) if extracolumns else []
367db96d56Sopenharmony_ci    )
377db96d56Sopenharmony_ci    known = {}
387db96d56Sopenharmony_ci    for decl, extra in _parser.iter_decls_tsv(infile, extracolumns, relroot):
397db96d56Sopenharmony_ci        known[decl] = extra
407db96d56Sopenharmony_ci    return known
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_cidef analyze_known(known, *,
447db96d56Sopenharmony_ci                  analyze_resolved=None,
457db96d56Sopenharmony_ci                  handle_unresolved=True,
467db96d56Sopenharmony_ci                  ):
477db96d56Sopenharmony_ci    knowntypes = knowntypespecs = {}
487db96d56Sopenharmony_ci    collated = _match.group_by_kinds(known)
497db96d56Sopenharmony_ci    types = {decl: None for decl in collated['type']}
507db96d56Sopenharmony_ci    typespecs = _analyze.get_typespecs(types)
517db96d56Sopenharmony_ci    def analyze_decl(decl):
527db96d56Sopenharmony_ci        return _analyze.analyze_decl(
537db96d56Sopenharmony_ci            decl,
547db96d56Sopenharmony_ci            typespecs,
557db96d56Sopenharmony_ci            knowntypespecs,
567db96d56Sopenharmony_ci            types,
577db96d56Sopenharmony_ci            knowntypes,
587db96d56Sopenharmony_ci            analyze_resolved=analyze_resolved,
597db96d56Sopenharmony_ci        )
607db96d56Sopenharmony_ci    _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved)
617db96d56Sopenharmony_ci    return types, typespecs
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_cidef write_known(rows, outfile, extracolumns=None, *,
657db96d56Sopenharmony_ci                relroot=fsutil.USE_CWD,
667db96d56Sopenharmony_ci                backup=True,
677db96d56Sopenharmony_ci                ):
687db96d56Sopenharmony_ci    extracolumns = EXTRA_COLUMNS + (
697db96d56Sopenharmony_ci        list(extracolumns) if extracolumns else []
707db96d56Sopenharmony_ci    )
717db96d56Sopenharmony_ci    _parser.write_decls_tsv(
727db96d56Sopenharmony_ci        rows,
737db96d56Sopenharmony_ci        outfile,
747db96d56Sopenharmony_ci        extracolumns,
757db96d56Sopenharmony_ci        relroot=relroot,
767db96d56Sopenharmony_ci        backup=backup,
777db96d56Sopenharmony_ci    )
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci#############################
817db96d56Sopenharmony_ci# ignored vars
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ciIGNORED_COLUMNS = [
847db96d56Sopenharmony_ci    'filename',
857db96d56Sopenharmony_ci    'funcname',
867db96d56Sopenharmony_ci    'name',
877db96d56Sopenharmony_ci    'reason',
887db96d56Sopenharmony_ci]
897db96d56Sopenharmony_ciIGNORED_HEADER = '\t'.join(IGNORED_COLUMNS)
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_cidef read_ignored(infile, relroot=fsutil.USE_CWD):
937db96d56Sopenharmony_ci    return dict(_iter_ignored(infile, relroot))
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_cidef _iter_ignored(infile, relroot):
977db96d56Sopenharmony_ci    if relroot and relroot is not fsutil.USE_CWD:
987db96d56Sopenharmony_ci        relroot = os.path.abspath(relroot)
997db96d56Sopenharmony_ci    bogus = {_tables.EMPTY, _tables.UNKNOWN}
1007db96d56Sopenharmony_ci    for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'):
1017db96d56Sopenharmony_ci        *varidinfo, reason = row
1027db96d56Sopenharmony_ci        if _tables.EMPTY in varidinfo or _tables.UNKNOWN in varidinfo:
1037db96d56Sopenharmony_ci            varidinfo = tuple(None if v in bogus else v
1047db96d56Sopenharmony_ci                              for v in varidinfo)
1057db96d56Sopenharmony_ci        if reason in bogus:
1067db96d56Sopenharmony_ci            reason = None
1077db96d56Sopenharmony_ci        varid = _info.DeclID.from_row(varidinfo)
1087db96d56Sopenharmony_ci        varid = varid.fix_filename(relroot, formatted=False, fixroot=False)
1097db96d56Sopenharmony_ci        yield varid, reason
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_cidef write_ignored(variables, outfile, relroot=fsutil.USE_CWD):
1137db96d56Sopenharmony_ci    raise NotImplementedError
1147db96d56Sopenharmony_ci    if relroot and relroot is not fsutil.USE_CWD:
1157db96d56Sopenharmony_ci        relroot = os.path.abspath(relroot)
1167db96d56Sopenharmony_ci    reason = '???'
1177db96d56Sopenharmony_ci    #if not isinstance(varid, DeclID):
1187db96d56Sopenharmony_ci    #    varid = getattr(varid, 'parsed', varid).id
1197db96d56Sopenharmony_ci    decls = (d.fix_filename(relroot, fixroot=False) for d in decls)
1207db96d56Sopenharmony_ci    _tables.write_table(
1217db96d56Sopenharmony_ci        outfile,
1227db96d56Sopenharmony_ci        IGNORED_HEADER,
1237db96d56Sopenharmony_ci        sep='\t',
1247db96d56Sopenharmony_ci        rows=(r.render_rowdata() + (reason,) for r in decls),
1257db96d56Sopenharmony_ci    )
126