diff --git a/dynamic.py b/dynamic.py index fb365268..2b50b0b0 100644 --- a/dynamic.py +++ b/dynamic.py @@ -55,12 +55,10 @@ def search_params(param): return result func = param.get_parent_until(parsing.Function) - - # add the listener - listener = ParamListener() - func.listeners.add(listener) - + current_module = param.get_parent_until() func_name = str(func.name) + if func_name == '__init__' and isinstance(func.parent, parsing.Class): + func_name = str(func.parent.name) # get the param name if param.assignment_details: @@ -70,7 +68,9 @@ def search_params(param): offset = 1 if arr[0][0] in ['*', '**'] else 0 param_name = str(arr[0][offset].name) - current_module = param.get_parent_until() + # add the listener + listener = ParamListener() + func.listeners.add(listener) result = get_params_for_module(current_module) diff --git a/evaluate.py b/evaluate.py index ee1aafba..9bf8c243 100644 --- a/evaluate.py +++ b/evaluate.py @@ -137,14 +137,22 @@ class Executable(object): class Instance(Executable): """ This class is used to evaluate instances. """ + def __init__(self, base, var_args=parsing.Array(None, None)): + super(Instance, self).__init__(base, var_args) + + # need to execute the __init__ function, because the dynamic param + # searching needs it. + try: + init_func = self.get_subscope_by_name('__init__') + except KeyError: + pass + else: + self.get_init_execution(init_func).get_return_types() @memoize_default() def get_init_execution(self, func): - if isinstance(func, parsing.Function): - instance_el = InstanceElement(self, Function(func)) - return Execution(instance_el, self.var_args) - else: - return func + instance_el = InstanceElement(self, Function(func)) + return Execution(instance_el, self.var_args) def get_func_self_name(self, func): """ diff --git a/test/completion/dynamic.py b/test/completion/dynamic.py index 1eba6266..c68d6759 100644 --- a/test/completion/dynamic.py +++ b/test/completion/dynamic.py @@ -58,3 +58,24 @@ def func(c=1): return c func(1.0) + +# ----------------- +# classes +# ----------------- + +class A(): + def __init__(self, a): + #? str() + a + +A("s") + +class A(): + def __init__(self, a): + #? int() + a + def test(self, a): + #? float() + a + +A(3).test(2.0)