from ..common import files from ..common.info import UNKNOWN from ..parser import ( find as p_find, ) from ..symbols import ( info as s_info, find as s_find, ) from .info import Variable # XXX need tests: # * vars_from_source def _remove_cached(cache, var): if not cache: return try: cached = cache[var.filename] cached.remove(var) except (KeyError, IndexError): pass def vars_from_binary(binfile, *, known=None, filenames=None, handle_id=None, check_filename=None, handle_var=Variable.from_id, _iter_vars=s_find.variables, _get_symbol_resolver=s_find.get_resolver, ): """Yield a Variable for each found Symbol. Details are filled in from the given "known" variables and types. """ cache = {} resolve = _get_symbol_resolver(filenames, known, handle_var=handle_var, check_filename=check_filename, perfilecache=cache, ) for var, symbol in _iter_vars(binfile, resolve=resolve, handle_id=handle_id, ): if var is None: var = Variable(symbol.id, UNKNOWN, UNKNOWN) yield var _remove_cached(cache, var) def vars_from_source(filenames, *, preprocessed=None, known=None, handle_id=None, handle_var=Variable.from_id, iter_vars=p_find.variables, ): """Yield a Variable for each declaration in the raw source code. Details are filled in from the given "known" variables and types. """ cache = {} for varid, decl in iter_vars(filenames or (), perfilecache=cache, preprocessed=preprocessed, known=known, handle_id=handle_id, ): var = handle_var(varid, decl) yield var _remove_cached(cache, var)