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:
@@ -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,6 +12,11 @@ except ImportError:
|
|||||||
import pydoc_topics
|
import pydoc_topics
|
||||||
|
|
||||||
if is_py3:
|
if is_py3:
|
||||||
|
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
|
keys = keyword.kwlist
|
||||||
else:
|
else:
|
||||||
keys = keyword.kwlist + ['None', 'False', 'True']
|
keys = keyword.kwlist + ['None', 'False', 'True']
|
||||||
|
|||||||
@@ -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] '}' |
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user