diff --git a/AUTHORS.txt b/AUTHORS.txt index 52204a8b..29f46765 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -44,6 +44,7 @@ Mathias Rav (@Mortal) Daniel Fiterman (@dfit99) Simon Ruggier (@sruggier) Élie Gouzien (@ElieGouzien) - +Robin Roth (@robinro) +Malte Plath (@langsamer) Note: (@user) means a github user name. diff --git a/docs/docs/features.rst b/docs/docs/features.rst index f00e4203..aef32708 100644 --- a/docs/docs/features.rst +++ b/docs/docs/features.rst @@ -222,7 +222,7 @@ A little history The Star Wars Jedi are awesome. My Jedi software tries to imitate a little bit of the precognition the Jedi have. There's even an awesome `scene -`_ of Monty Python Jedis :-). +`_ of Monty Python Jedis :-). But actually the name hasn't so much to do with Star Wars. It's part of my second name. diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index d1453f32..20461071 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -249,6 +249,8 @@ class Evaluator(object): else: i = trailer.parent.children.index(trailer) to_evaluate = trailer.parent.children[:i] + if to_evaluate[0] == 'await': + to_evaluate.pop(0) context_set = context.eval_node(to_evaluate[0]) for trailer in to_evaluate[1:]: context_set = eval_trailer(context, context_set, trailer) diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 6652287b..3b21e01b 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -58,8 +58,11 @@ def evaluate_call_of_leaf(context, leaf, cut_own_trailer=False): If you're using the leaf, e.g. the bracket `)` it will return ``list([])``. - # TODO remove cut_own_trailer option, since its always used with it. Just - # ignore it, It's not what we want anyway. Or document it better? + We use this function for two purposes. Given an expression ``bar.foo``, + we may want to + - infer the type of ``foo`` to offer completions after foo + - infer the type of ``bar`` to be able to jump to the definition of foo + The option ``cut_own_trailer`` must be set to true for the second purpose. """ trailer = leaf.parent # The leaf may not be the last or first child, because there exist three @@ -89,6 +92,10 @@ def evaluate_call_of_leaf(context, leaf, cut_own_trailer=False): base = power.children[0] trailers = power.children[1:cut] + if base == 'await': + base = trailers[0] + trailers = trailers[1:] + values = context.eval_node(base) from jedi.evaluate.syntax_tree import eval_trailer for trailer in trailers: diff --git a/setup.py b/setup.py index 21db855a..72df7c53 100755 --- a/setup.py +++ b/setup.py @@ -31,6 +31,7 @@ setup(name='jedi', long_description=readme, packages=find_packages(exclude=['test']), install_requires=install_requires, + extras_require={'dev': ['docopt']}, package_data={'jedi': ['evaluate/compiled/fake/*.pym']}, platforms=['any'], classifiers=[ diff --git a/test/completion/async_.py b/test/completion/async_.py index c6035e37..b2202137 100644 --- a/test/completion/async_.py +++ b/test/completion/async_.py @@ -23,3 +23,14 @@ async def x2(): async with open('asdf') as f: #? ['readlines'] f.readlines + +class A(): + @staticmethod + async def b(c=1, d=2): + return 1 + +#! 9 ['def b'] +await A.b() + +#! 11 ['param d=2'] +await A.b(d=3)