From 6feac2a0ecfd08e6dc3759ebe1f34c50ee4d12a6 Mon Sep 17 00:00:00 2001 From: Johannes Mikulasch Date: Tue, 31 Oct 2017 12:58:56 +0100 Subject: [PATCH 1/2] add ahead of time annotations PEP 526 --- jedi/evaluate/syntax_tree.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/jedi/evaluate/syntax_tree.py b/jedi/evaluate/syntax_tree.py index 1d847a49..54cfa459 100644 --- a/jedi/evaluate/syntax_tree.py +++ b/jedi/evaluate/syntax_tree.py @@ -17,6 +17,7 @@ from jedi.evaluate import helpers from jedi.evaluate import analysis from jedi.evaluate import imports from jedi.evaluate import arguments +from jedi.evaluate.pep0484 import _evaluate_for_annotation from jedi.evaluate.context import ClassContext, FunctionContext from jedi.evaluate.context import iterable from jedi.evaluate.context import TreeInstance, CompiledInstance @@ -442,6 +443,22 @@ def _remove_statements(evaluator, context, stmt, name): def tree_name_to_contexts(evaluator, context, tree_name): + + context_set = ContextSet() + module = context.get_root_context().tree_node + names = module.get_used_names().get(tree_name.value) + for name in names: + expr_stmt = name.parent + + correct_scope = parser_utils.get_parent_scope(name) == context.tree_node + + if expr_stmt.type == "expr_stmt" and expr_stmt.children[1].type == "annassign" and correct_scope: + print("found node in correct scope!", expr_stmt.children[1].children[1]) + context_set |= _evaluate_for_annotation(context, expr_stmt.children[1].children[1]) + + if context_set: + return context_set + types = [] node = tree_name.get_definition(import_name_always=True) if node is None: From a1b60a978d1689efdb8c6fe2c301f8cbb9b7cacc Mon Sep 17 00:00:00 2001 From: Johannes Mikulasch Date: Tue, 31 Oct 2017 13:57:10 +0100 Subject: [PATCH 2/2] add testcases for pep0484 ahead of time annotations --- test/completion/pep0484_aheadoftime.py | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 test/completion/pep0484_aheadoftime.py diff --git a/test/completion/pep0484_aheadoftime.py b/test/completion/pep0484_aheadoftime.py new file mode 100644 index 00000000..3710e824 --- /dev/null +++ b/test/completion/pep0484_aheadoftime.py @@ -0,0 +1,34 @@ +""" Pep-0484 type hinting with ahead of time annotations """ + +# python >= 3.6 + +somelist = [1, 2, 3, "A", "A"] +element : int +for element in somelist[0:3]: + #? int() + element + + +otherlist = [1, "A"] +for e in otherlist: + #? int() str() + e + + +test_string: str = "Hello, world!" +#? str() +test_string + + +char: str +for char in test_string: + #? str() + char + + +import numpy +somearrays = [numpy.ones((10, 10)), numpy.eye(10), 2, 2.3] +array : numpy.ndarray +for array in somearrays[0:2]: + #? numpy.ndarray() + array