diff --git a/jedi/evaluate.py b/jedi/evaluate.py index 1adfbc3c..ec8dee7f 100644 --- a/jedi/evaluate.py +++ b/jedi/evaluate.py @@ -414,9 +414,12 @@ def check_getattr(inst, name_str): """Checks for both __getattr__ and __getattribute__ methods""" result = [] # str is important to lose the NamePart! - name = pr.Call(str(name_str), pr.Call.STRING, (0, 0), inst) + module = builtin.Builtin.scope + name = pr.Call(module, str(name_str), pr.Call.STRING, (0, 0), inst) + stmt = pr.Statement(module, 'XXX code', [], [], [], [], (0, 0), None) + stmt._commands = [name] try: - result = inst.execute_subscope_by_name('__getattr__', [name]) + result = inst.execute_subscope_by_name('__getattr__', [stmt]) except KeyError: pass if not result: @@ -425,7 +428,7 @@ def check_getattr(inst, name_str): # could be practical and the jedi would return wrong types. If # you ever have something, let me know! try: - result = inst.execute_subscope_by_name('__getattribute__', [name]) + result = inst.execute_subscope_by_name('__getattribute__', [stmt]) except KeyError: pass return result diff --git a/jedi/evaluate_representation.py b/jedi/evaluate_representation.py index e5f7412c..9ba9366c 100644 --- a/jedi/evaluate_representation.py +++ b/jedi/evaluate_representation.py @@ -423,8 +423,10 @@ class Execution(Executable): debug.warning('getattr called without instance') continue - for name in names: - key = name.var_args.get_only_subelement() + for arr_name in names: + if len(arr_name.var_args) != 1: + debug.warning('jedi getattr is too simple') + key = arr_name.var_args[0] stmts += evaluate.follow_path(iter([key]), obj, self.base) return stmts @@ -507,7 +509,7 @@ class Execution(Executable): start_pos = self.var_args.start_pos else: parent = self.base - start_pos = None + start_pos = 0, 0 new_param = copy.copy(param) new_param.is_generated = True @@ -628,10 +630,8 @@ class Execution(Executable): def iterate(): # `var_args` is typically an Array, and not a list. for stmt in self.var_args: - if not isinstance(stmt, pr.Statement): - yield None, stmt # *args - elif stmt.get_commands()[0] == '*': + if stmt.get_commands()[0] == '*': arrays = evaluate.follow_call_list(stmt.get_commands()[1:]) # *args must be some sort of an array, otherwise -> ignore for array in arrays: