def get_faked(module, obj, name=None): obj = obj.__class__ if is_class_instance(obj) else obj result = _faked(module, obj, name) # TODO may this ever happen? result None? if so, document! if not isinstance(result, pt.Class) and result is not None: # Set the docstr which was previously not set (faked modules don't # contain it). doc = '"""%s"""' % obj.__doc__ # TODO need escapes. suite = result.children[-1] expr_stmt = pt.ExprStmt( [pt.String(pt.zero_position_modifier, doc, (0, 0), '')]) new_line = pt.Whitespace('\n', (0, 0), '') docstr_node = pt.Node('simple_stmt', [expr_stmt, new_line]) suite.children.insert(2, docstr_node) return result
def parent(self): """ Creating fake statements for the interpreter. """ obj = self._value parser_path = [] if inspect.ismodule(obj): module = obj else: names = [] try: o = obj.__objclass__ names.append(obj.__name__) obj = o except AttributeError: pass try: module_name = obj.__module__ names.insert(0, obj.__name__) except AttributeError: # Unfortunately in some cases like `int` there's no __module__ module = builtins else: # TODO this import is wrong. Yields x for x.y.z instead of z module = __import__(module_name) parser_path = names raw_module = get_module(self._value) found = [] try: path = module.__file__ except AttributeError: pass else: path = re.sub('c$', '', path) if path.endswith('.py'): # cut the `c` from `.pyc` with open(path) as f: source = source_to_unicode(f.read()) mod = FastParser(load_grammar(), source, path[:-1]).module if parser_path: assert len(parser_path) == 1 found = self._evaluator.find_types(mod, parser_path[0], search_global=True) else: found = [er.wrap(self._evaluator, mod)] if not found: debug.warning( 'Possibly an interpreter lookup for Python code failed %s', parser_path) if not found: evaluated = compiled.CompiledObject(obj) if evaluated == builtins: # The builtins module is special and always cached. evaluated = compiled.builtin found = [evaluated] content = iterable.AlreadyEvaluated(found) stmt = pt.ExprStmt([ self, pt.Operator(pt.zero_position_modifier, '=', (0, 0), ''), content ]) stmt.parent = self._module return stmt
def parent(self): """ Creating fake statements for the interpreter. Here we are trying to link back to Python code, if possible. This means we try to find the python module for a name (not the builtin). """ return mixed.create(self._evaluator, self._value) obj = self._value parser_path = [] if inspect.ismodule(obj): module = obj else: names = [] try: o = obj.__objclass__ names.append(obj.__name__) obj = o except AttributeError: pass try: module_name = obj.__module__ names.insert(0, obj.__name__) except AttributeError: # Unfortunately in some cases like `int` there's no __module__ module = builtins else: # If we put anything into fromlist, it will just return the # latest name. module = __import__(module_name, fromlist=['']) parser_path = names found = [] try: path = module.__file__ except AttributeError: pass else: # Find the corresponding Python file for an interpreted one. path = re.sub(r'\.pyc$', '.py', path) if path.endswith('.py'): with open(path) as f: source = source_to_unicode(f.read()) mod = FastParser(load_grammar(), source, path).module mod = self._evaluator.wrap(mod) # We have to make sure that the modules that we import are also # part of evaluator.modules. for module_name, module in sys.modules.items(): try: iterated_path = module.__file__ except AttributeError: pass else: if iterated_path == path: self._evaluator.modules[module_name] = mod break else: raise NotImplementedError( 'This should not happen, a module ' 'should be part of sys.modules.') if parser_path: assert len(parser_path) == 1 found = list( self._evaluator.find_types(mod, parser_path[0], search_global=True)) else: found = [mod] if not found: debug.warning( 'Interpreter lookup failed in global scope for %s', parser_path) if not found: evaluated = compiled.create(self._evaluator, obj) found = [evaluated] if len(found) > 1: content = iterable.AlreadyEvaluated(found) stmt = pt.ExprStmt([ self, pt.Operator(pt.zero_position_modifier, '=', (0, 0), ''), content ]) stmt.parent = self._module return stmt else: return found[0]