| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | import os.path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from c_common import fsutil | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | import c_common.tables as _tables | 
					
						
							|  |  |  | import c_parser.info as _info | 
					
						
							| 
									
										
										
										
											2020-10-30 15:46:52 -06:00
										 |  |  | import c_parser.match as _match | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | 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, | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |               relroot=fsutil.USE_CWD, | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |               ): | 
					
						
							|  |  |  |     if isinstance(known, str): | 
					
						
							|  |  |  |         known = read_known(known, extracolumns, relroot) | 
					
						
							|  |  |  |     return analyze_known( | 
					
						
							|  |  |  |         known, | 
					
						
							|  |  |  |         handle_unresolved=handle_unresolved, | 
					
						
							|  |  |  |         analyze_resolved=analyze_resolved, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | def read_known(infile, extracolumns=None, relroot=fsutil.USE_CWD): | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | def write_known(rows, outfile, extracolumns=None, *, | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |                 relroot=fsutil.USE_CWD, | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |                 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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | def read_ignored(infile, relroot=fsutil.USE_CWD): | 
					
						
							|  |  |  |     return dict(_iter_ignored(infile, relroot)) | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | def _iter_ignored(infile, relroot): | 
					
						
							|  |  |  |     if relroot and relroot is not fsutil.USE_CWD: | 
					
						
							|  |  |  |         relroot = os.path.abspath(relroot) | 
					
						
							|  |  |  |     bogus = {_tables.EMPTY, _tables.UNKNOWN} | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |     for row in _tables.read_table(infile, IGNORED_HEADER, sep='\t'): | 
					
						
							|  |  |  |         *varidinfo, reason = row | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |         varid = _info.DeclID.from_row(varidinfo) | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |         varid = varid.fix_filename(relroot, formatted=False, fixroot=False) | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |         yield varid, reason | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  | def write_ignored(variables, outfile, relroot=fsutil.USE_CWD): | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |     raise NotImplementedError | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |     if relroot and relroot is not fsutil.USE_CWD: | 
					
						
							|  |  |  |         relroot = os.path.abspath(relroot) | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |     reason = '???' | 
					
						
							|  |  |  |     #if not isinstance(varid, DeclID): | 
					
						
							|  |  |  |     #    varid = getattr(varid, 'parsed', varid).id | 
					
						
							| 
									
										
										
										
											2020-11-20 15:39:28 -07:00
										 |  |  |     decls = (d.fix_filename(relroot, fixroot=False) for d in decls) | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |     _tables.write_table( | 
					
						
							|  |  |  |         outfile, | 
					
						
							|  |  |  |         IGNORED_HEADER, | 
					
						
							|  |  |  |         sep='\t', | 
					
						
							|  |  |  |         rows=(r.render_rowdata() + (reason,) for r in decls), | 
					
						
							|  |  |  |     ) |