1
0
forked from VimPlug/jedi

opting for skipping PEP492 backwards compatibility magic, instead directly making await and async keywords

See discussion at
https://github.com/davidhalter/jedi/pull/691#issuecomment-182815864
This commit is contained in:
Claude
2016-02-11 19:29:18 +01:00
parent 7077d0b762
commit d5f08f8bdd
3 changed files with 44 additions and 27 deletions

View File

@@ -1,7 +1,7 @@
import pydoc import pydoc
import keyword import keyword
from jedi._compatibility import is_py3 from jedi._compatibility import is_py3, is_py35
from jedi import common from jedi import common
from jedi.evaluate.helpers import FakeName from jedi.evaluate.helpers import FakeName
from jedi.parser.tree import Leaf from jedi.parser.tree import Leaf
@@ -12,7 +12,12 @@ except ImportError:
import pydoc_topics import pydoc_topics
if is_py3: if is_py3:
keys = keyword.kwlist if is_py35:
# in python 3.5 async and await are not proper keywords, but for
# completion pursposes should as as though they are
keys = keyword.kwlist + ["async", "await"]
else:
keys = keyword.kwlist
else: else:
keys = keyword.kwlist + ['None', 'False', 'True'] keys = keyword.kwlist + ['None', 'False', 'True']

View File

@@ -23,7 +23,9 @@ decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+ decorators: decorator+
decorated: decorators (classdef | funcdef | async_funcdef) decorated: decorators (classdef | funcdef | async_funcdef)
async_funcdef: ASYNC funcdef # NOTE: Reinoud Elhorst, using ASYNC/AWAIT keywords instead of tokens
# skipping python3.5 compatibility, in favour of 3.7 solution
async_funcdef: 'async' funcdef
funcdef: 'def' NAME parameters ['->' test] ':' suite funcdef: 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')' parameters: '(' [typedargslist] ')'
@@ -69,7 +71,7 @@ nonlocal_stmt: 'nonlocal' NAME (',' NAME)*
assert_stmt: 'assert' test [',' test] assert_stmt: 'assert' test [',' test]
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt
async_stmt: ASYNC (funcdef | with_stmt | for_stmt) async_stmt: 'async' (funcdef | with_stmt | for_stmt)
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
while_stmt: 'while' test ':' suite ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
@@ -106,7 +108,7 @@ arith_expr: term (('+'|'-') term)*
term: factor (('*'|'@'|'/'|'%'|'//') factor)* term: factor (('*'|'@'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power factor: ('+'|'-'|'~') factor | power
power: atom_expr ['**' factor] power: atom_expr ['**' factor]
atom_expr: [AWAIT] atom trailer* atom_expr: ['await'] atom trailer*
atom: ('(' [yield_expr|testlist_comp] ')' | atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [testlist_comp] ']' | '[' [testlist_comp] ']' |
'{' [dictorsetmaker] '}' | '{' [dictorsetmaker] '}' |

View File

@@ -46,8 +46,8 @@ class GrammarTest(TestCase):
class TestMatrixMultiplication(GrammarTest): class TestMatrixMultiplication(GrammarTest):
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
def test_matrix_multiplication_operator(self): def test_matrix_multiplication_operator(self):
parse("a @ b") parse("a @ b", "3.5")
parse("a @= b") parse("a @= b", "3.5")
class TestYieldFrom(GrammarTest): class TestYieldFrom(GrammarTest):
@@ -62,7 +62,7 @@ class TestAsyncAwait(GrammarTest):
def test_await_expr(self): def test_await_expr(self):
parse("""async def foo(): parse("""async def foo():
await x await x
""") """, "3.5")
parse("""async def foo(): parse("""async def foo():
@@ -71,46 +71,56 @@ class TestAsyncAwait(GrammarTest):
def foo(): pass def foo(): pass
await x await x
""") """, "3.5")
parse("""async def foo(): return await a""") parse("""async def foo(): return await a""", "3.5")
parse("""def foo(): parse("""def foo():
def foo(): pass def foo(): pass
async def foo(): await x async def foo(): await x
""") """, "3.5")
self.invalid_syntax("await x") @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@pytest.mark.xfail(reason="acting like python 3.7")
def test_await_expr_invalid(self):
self.invalid_syntax("await x", version="3.5")
self.invalid_syntax("""def foo(): self.invalid_syntax("""def foo():
await x""") await x""", version="3.5")
self.invalid_syntax("""def foo(): self.invalid_syntax("""def foo():
def foo(): pass def foo(): pass
async def foo(): pass async def foo(): pass
await x await x
""") """, version="3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@pytest.mark.xfail(reason="acting like python 3.7")
def test_async_var(self): def test_async_var(self):
parse("""async = 1""") parse("""async = 1""", "3.5")
parse("""await = 1""") parse("""await = 1""", "3.5")
parse("""def async(): pass""") parse("""def async(): pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
def test_async_with(self):
parse("""async def foo():
async for a in b: pass""")
self.invalid_syntax("""def foo():
async for a in b: pass""")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
def test_async_for(self): def test_async_for(self):
parse("""async def foo(): parse("""async def foo():
async with a: pass""") async for a in b: pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@pytest.mark.xfail(reason="acting like python 3.7")
def test_async_for_invalid(self):
self.invalid_syntax("""def foo(): self.invalid_syntax("""def foo():
async with a: pass""") async for a in b: pass""", version="3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
def test_async_with(self):
parse("""async def foo():
async with a: pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@pytest.mark.xfail(reason="acting like python 3.7")
def test_async_with_invalid(self):
self.invalid_syntax("""def foo():
async with a: pass""", version="3.5")
class TestRaiseChanges(GrammarTest): class TestRaiseChanges(GrammarTest):