Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Tools/c-analyzer/c_analyzer/datafiles.py
12 views
1
import os.path
2
3
from c_common import fsutil
4
import c_common.tables as _tables
5
import c_parser.info as _info
6
import c_parser.match as _match
7
import c_parser.datafiles as _parser
8
from . import analyze as _analyze
9
10
11
#############################
12
# "known" decls
13
14
EXTRA_COLUMNS = [
15
#'typedecl',
16
]
17
18
19
def get_known(known, extracolumns=None, *,
20
analyze_resolved=None,
21
handle_unresolved=True,
22
relroot=fsutil.USE_CWD,
23
):
24
if isinstance(known, str):
25
known = read_known(known, extracolumns, relroot)
26
return analyze_known(
27
known,
28
handle_unresolved=handle_unresolved,
29
analyze_resolved=analyze_resolved,
30
)
31
32
33
def read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD):
34
extracolumns = EXTRA_COLUMNS + (
35
list(extracolumns) if extracolumns else []
36
)
37
known = {}
38
for decl, extra in _parser.iter_decls_tsv(infile, extracolumns, relroot):
39
known[decl] = extra
40
return known
41
42
43
def analyze_known(known, *,
44
analyze_resolved=None,
45
handle_unresolved=True,
46
):
47
knowntypes = knowntypespecs = {}
48
collated = _match.group_by_kinds(known)
49
types = {decl: None for decl in collated['type']}
50
typespecs = _analyze.get_typespecs(types)
51
def analyze_decl(decl):
52
return _analyze.analyze_decl(
53
decl,
54
typespecs,
55
knowntypespecs,
56
types,
57
knowntypes,
58
analyze_resolved=analyze_resolved,
59
)
60
_analyze.analyze_type_decls(types, analyze_decl, handle_unresolved)
61
return types, typespecs
62
63
64
def write_known(rows, outfile, extracolumns=None, *,
65
relroot=fsutil.USE_CWD,
66
backup=True,
67
):
68
extracolumns = EXTRA_COLUMNS + (
69
list(extracolumns) if extracolumns else []
70
)
71
_parser.write_decls_tsv(
72
rows,
73
outfile,
74
extracolumns,
75
relroot=relroot,
76
backup=backup,
77
)
78
79
80
#############################
81
# ignored vars
82
83
IGNORED_COLUMNS = [
84
'filename',
85
'funcname',
86
'name',
87
'reason',
88
]
89
IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS)
90
91
92
def read_ignored(infile, relroot=fsutil.USE_CWD):
93
return dict(_iter_ignored(infile, relroot))
94
95
96
def _iter_ignored(infile, relroot):
97
if relroot and relroot is not fsutil.USE_CWD:
98
relroot = os.path.abspath(relroot)
99
bogus = {_tables.EMPTY, _tables.UNKNOWN}
100
for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'):
101
*varidinfo, reason = row
102
if _tables.EMPTY in varidinfo or _tables.UNKNOWN in varidinfo:
103
varidinfo = tuple(None if v in bogus else v
104
for v in varidinfo)
105
if reason in bogus:
106
reason = None
107
varid = _info.DeclID.from_row(varidinfo)
108
varid = varid.fix_filename(relroot, formatted=False, fixroot=False)
109
yield varid, reason
110
111
112
def write_ignored(variables, outfile, relroot=fsutil.USE_CWD):
113
raise NotImplementedError
114
if relroot and relroot is not fsutil.USE_CWD:
115
relroot = os.path.abspath(relroot)
116
reason = '???'
117
#if not isinstance(varid, DeclID):
118
# varid = getattr(varid, 'parsed', varid).id
119
decls = (d.fix_filename(relroot, fixroot=False) for d in decls)
120
_tables.write_table(
121
outfile,
122
IGNORED_HEADER,
123
sep='\t',
124
rows=(r.render_rowdata() + (reason,) for r in decls),
125
)
126
127