ternary operators work now, list comprehensions preparation

This commit is contained in:
David Halter
2012-06-26 00:42:19 +02:00
parent e7a579ce31
commit c4d74c3521
3 changed files with 48 additions and 8 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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