From c4d74c352156a4f966c8ab1c260518bbddd03382 Mon Sep 17 00:00:00 2001 From: David Halter Date: Tue, 26 Jun 2012 00:42:19 +0200 Subject: [PATCH] ternary operators work now, list comprehensions preparation --- evaluate.py | 18 ++++++++++++++---- parsing.py | 3 +++ test/completion/basic.py | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/evaluate.py b/evaluate.py index 9e0c9346..8dcf39eb 100644 --- a/evaluate.py +++ b/evaluate.py @@ -6,7 +6,7 @@ follow_statement -> follow_call -> follow_paths -> follow_path TODO doc TODO list comprehensions, priority? +1 -TODO `a = b if b else None` expressions +TODO magic methods: __mul__, __add__, etc. TODO evaluate asserts (type safety) python 3 stuff: @@ -66,7 +66,6 @@ class MultiLevelAttributeError(BaseException): return 'Original:\n\n' + ''.join(tb) - def clear_caches(): for m in memoize_caches: m.clear() @@ -1039,15 +1038,26 @@ def follow_call_list(scope, call_list): else: result = [] for calls in call_list: - for call in calls: + calls_iterator = iter(calls) + for call in calls_iterator: if parsing.Array.is_type(call, parsing.Array.NOARRAY): result += follow_call_list(scope, call) else: # with things like params, these can also be functions, etc if isinstance(call, (Function, parsing.Class)): result.append(call) + # The string tokens are just operations (+, -, etc.) elif not isinstance(call, str): - # The string tokens are just operations (+, -, etc.) + # ternary operators + if str(call.name) == 'if': + while True: + call = next(calls_iterator) + try: + if str(call.name) == 'else': + break + except AttributeError: + pass + continue result += follow_call(scope, call) return set(result) diff --git a/parsing.py b/parsing.py index d53edfdb..82de69f3 100644 --- a/parsing.py +++ b/parsing.py @@ -633,6 +633,9 @@ class Statement(Simple): if close_brackets: result = result.parent close_brackets = False + if result.__class__ == Call: + result = result.parent + close_brackets = False call = Call(tok, c_type, self, result) result.add_to_current_field(call) result = call diff --git a/test/completion/basic.py b/test/completion/basic.py index e9ccd1d5..14723047 100644 --- a/test/completion/basic.py +++ b/test/completion/basic.py @@ -38,6 +38,33 @@ for a4, (b4, c4) in (1,("", list)), (1,("", list)): #? [] c4.upper +# ----------------- +# list comprehensions +# ----------------- + +a = ['' for abc in [1]] + +#? str() +a[0] + + +# ----------------- +# ternary operator +# ----------------- + +a = 3 +b = '' if a else set() +#? str() set() +b + +def ret(a): + return ['' if a else set()] + +#? str() set() +ret(1)[0] +#? str() set() +ret()[0] + # ----------------- # with statements # ----------------- @@ -58,8 +85,8 @@ with open('') as f1, open('') as f2: # ----------------- def global_define(): - global glob - glob = 3 + global global_var_in_func + global_var_in_func = 3 -#? ['real'] -glob.real +#? int() +global_var_in_func