diff --git a/jedi/evaluate/filters.py b/jedi/evaluate/filters.py index 231b8825..0784c675 100644 --- a/jedi/evaluate/filters.py +++ b/jedi/evaluate/filters.py @@ -4,7 +4,7 @@ are needed for name resolution. """ from abc import abstractmethod -from jedi.parser.python.tree import search_ancestor +from jedi.parser.tree import search_ancestor from jedi.evaluate import flow_analysis from jedi.common import to_list, unite diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index b5b46e6e..74bc1ee8 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -16,6 +16,7 @@ check for -> a is a string). There's big potential in these checks. """ from jedi.parser.python import tree +from jedi.parser.tree import search_ancestor from jedi import debug from jedi.common import unite from jedi import settings @@ -310,7 +311,7 @@ def _check_flow_information(context, flow, search_name, pos): ]) for name in names: - ass = tree.search_ancestor(name, 'assert_stmt') + ass = search_ancestor(name, 'assert_stmt') if ass is not None: result = _check_isinstance_type(context, ass.assertion, search_name) if result is not None: diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index 20890c95..fc1fcd8b 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -22,6 +22,7 @@ from jedi import settings from jedi.common import source_to_unicode, unite from jedi.parser.python import parse from jedi.parser.python import tree +from jedi.parser.tree import search_ancestor from jedi.parser.cache import parser_cache from jedi.evaluate import sys_path from jedi.evaluate import helpers @@ -36,7 +37,7 @@ from jedi.evaluate.filters import AbstractNameDefinition @memoize_default(default=set()) def infer_import(context, tree_name, is_goto=False): module_context = context.get_root_context() - import_node = tree.search_ancestor(tree_name, ('import_name', 'import_from')) + import_node = search_ancestor(tree_name, ('import_name', 'import_from')) import_path = import_node.path_for_name(tree_name) from_import_name = None evaluator = context.evaluator diff --git a/jedi/parser/python/__init__.py b/jedi/parser/python/__init__.py index c435e65e..f4ef81de 100644 --- a/jedi/parser/python/__init__.py +++ b/jedi/parser/python/__init__.py @@ -58,7 +58,8 @@ def parse(code=None, path=None, grammar=None, error_recovery=True, :param code: A unicode string that contains Python code. :param path: The path to the file you want to open. Only needed for caching. - :param grammar: A Python grammar file, created with load_grammar. + :param grammar: A Python grammar file, created with load_grammar. You may + not specify it. In that case it's the current Python version. :param error_recovery: If enabled, any code will be returned. If it is invalid, it will be returned as an error node. If disabled, you will get a ParseError when encountering syntax errors in your code. diff --git a/jedi/parser/python/tree.py b/jedi/parser/python/tree.py index 4e8c2804..ebff95eb 100644 --- a/jedi/parser/python/tree.py +++ b/jedi/parser/python/tree.py @@ -30,17 +30,8 @@ See also :attr:`Scope.subscopes` and :attr:`Scope.statements`. from itertools import chain from jedi._compatibility import utf8_repr, unicode -from jedi.parser.tree import Node, BaseNode, Leaf, ErrorNode, ErrorLeaf - - -def search_ancestor(node, node_type_or_types): - if not isinstance(node_type_or_types, (list, tuple)): - node_type_or_types = (node_type_or_types,) - - while True: - node = node.parent - if node is None or node.type in node_type_or_types: - return node +from jedi.parser.tree import Node, BaseNode, Leaf, ErrorNode, ErrorLeaf, \ + search_ancestor class DocstringMixin(object): diff --git a/jedi/parser/tree.py b/jedi/parser/tree.py index db9eaef5..05de527b 100644 --- a/jedi/parser/tree.py +++ b/jedi/parser/tree.py @@ -2,6 +2,16 @@ from abc import abstractmethod, abstractproperty from jedi._compatibility import utf8_repr, encoding, is_py3 +def search_ancestor(node, node_type_or_types): + if not isinstance(node_type_or_types, (list, tuple)): + node_type_or_types = (node_type_or_types,) + + while True: + node = node.parent + if node is None or node.type in node_type_or_types: + return node + + class NodeOrLeaf(object): """ The base class for nodes and leaves.