def _infer_returned(pyobject, args): if args: # HACK: Setting parameter objects manually # This is not thread safe and might cause problems if `args` # does not come from a good call site pyobject.get_scope().invalidate_data() pyobject._set_parameter_pyobjects( args.get_arguments(pyobject.get_param_names(special_args=False))) scope = pyobject.get_scope() if not scope._get_returned_asts(): return maxtries = 3 for returned_node in reversed(scope._get_returned_asts()[-maxtries:]): try: resulting_pyname = evaluate.get_statement_result(scope, returned_node) if resulting_pyname is None: continue pyobject = resulting_pyname.get_object() if pyobject == rope.base.pyobjects.get_unknown(): continue if not scope._is_generator(): return pyobject else: return rope.base.builtins.get_generator(pyobject) except rope.base.pyobjects.IsBeingInferredError: pass
def _evaluate_node(self, pymodule, node): scope = pymodule.get_scope().get_inner_scope_for_line(node.lineno) expression = node if isinstance(expression, ast.Name) and \ isinstance(expression.ctx, ast.Store): start, end = patchedast.node_region(expression) text = pymodule.source_code[start:end] return evaluate.get_string_result(scope, text) else: return evaluate.get_statement_result(scope, expression)
def _Assign(self, node): for child in rope.base.ast.get_child_nodes(node): rope.base.ast.walk(child, self) visitor = _SOIAssignVisitor() nodes = [] for child in node.targets: rope.base.ast.walk(child, visitor) nodes.extend(visitor.nodes) for subscript, levels in nodes: instance = evaluate.get_statement_result(self.scope, subscript.value) args_pynames = [] args_pynames.append(evaluate.get_statement_result(self.scope, subscript.slice.value)) value = rope.base.oi.soi._infer_assignment( rope.base.pynames.AssignmentValue(node.value, levels), self.pymodule ) args_pynames.append(rope.base.pynames.UnboundName(value)) if instance is not None and value is not None: pyobject = instance.get_object() if "__setitem__" in pyobject: pyfunction = pyobject["__setitem__"].get_object() args = arguments.ObjectArguments([instance] + args_pynames) self._call(pyfunction, args)
def _follow_pyname(assignment, pymodule, lineno=None): assign_node = assignment.ast_node if lineno is None: lineno = _get_lineno_for_node(assign_node) holding_scope = pymodule.get_scope().get_inner_scope_for_line(lineno) pyname = evaluate.get_statement_result(holding_scope, assign_node) if pyname is not None: result = pyname.get_object() if isinstance(result.get_type(), rope.base.builtins.Property) and \ holding_scope.get_kind() == 'Class': arg = rope.base.pynames.UnboundName( rope.base.pyobjects.PyObject(holding_scope.pyobject)) return pyname, result.get_type().get_property_object( arguments.ObjectArguments([arg])) return pyname, result