From 384c3a5b77e96748c8622c677043f8fc0b926405 Mon Sep 17 00:00:00 2001 From: David Halter Date: Mon, 6 Aug 2012 02:27:49 +0200 Subject: [PATCH] support for dynamic params in classes --- dynamic.py | 12 ++++++------ evaluate.py | 18 +++++++++++++----- test/completion/dynamic.py | 21 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 11 deletions(-) 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)