Esempio n. 1
0
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
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
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