From 797953df391d3d2a6bdcd0875b3e53ad3f8a9bb7 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 10 Apr 2017 10:05:21 +0200 Subject: [PATCH] More Flow cleanups. --- jedi/evaluate/flow_analysis.py | 9 +++++---- jedi/parser/python/tree.py | 23 +++-------------------- jedi/parser_utils.py | 22 ++++++++++++++++++---- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/jedi/evaluate/flow_analysis.py b/jedi/evaluate/flow_analysis.py index 6fcc6063..3f08bf5e 100644 --- a/jedi/evaluate/flow_analysis.py +++ b/jedi/evaluate/flow_analysis.py @@ -1,3 +1,4 @@ +from jedi.parser_utils import get_flow_branch_keyword class Status(object): lookup_table = {} @@ -46,8 +47,8 @@ def reachability_check(context, context_scope, node, origin_scope=None): branch_matches = True for flow_scope in origin_flow_scopes: if flow_scope in node_flow_scopes: - node_keyword = flow_scope.get_branch_keyword(node) - origin_keyword = flow_scope.get_branch_keyword(origin_scope) + node_keyword = get_flow_branch_keyword(flow_scope, node) + origin_keyword = get_flow_branch_keyword(flow_scope, origin_scope) branch_matches = node_keyword == origin_keyword if flow_scope.type == 'if_stmt': if not branch_matches: @@ -76,8 +77,8 @@ def reachability_check(context, context_scope, node, origin_scope=None): def _break_check(context, context_scope, flow_scope, node): reachable = REACHABLE if flow_scope.type == 'if_stmt': - if flow_scope.node_after_else(node): - for check_node in flow_scope.check_nodes(): + if flow_scope.is_node_after_else(node): + for check_node in flow_scope.get_check_nodes(): reachable = _check_if(context, check_node) if reachable in (REACHABLE, UNSURE): break diff --git a/jedi/parser/python/tree.py b/jedi/parser/python/tree.py index 49c0a697..e84c596e 100644 --- a/jedi/parser/python/tree.py +++ b/jedi/parser/python/tree.py @@ -672,30 +672,13 @@ class Lambda(Function): class Flow(PythonBaseNode): __slots__ = () - FLOW_KEYWORDS = ( - 'try', 'except', 'finally', 'else', 'if', 'elif', 'with', 'for', 'while' - ) - - def get_branch_keyword(self, node): - start_pos = node.start_pos - if not (self.start_pos < start_pos <= self.end_pos): - raise ValueError('The node is not part of the flow.') - - keyword = None - for i, child in enumerate(self.children): - if start_pos < child.start_pos: - return keyword - first_leaf = child.get_first_leaf() - if first_leaf in self.FLOW_KEYWORDS: - keyword = first_leaf - return 0 class IfStmt(Flow): type = 'if_stmt' __slots__ = () - def check_nodes(self): + def get_check_nodes(self): """ Returns all the `test` nodes that are defined as x, here: @@ -715,7 +698,7 @@ class IfStmt(Flow): suite return None. """ start_pos = node.start_pos - for check_node in reversed(list(self.check_nodes())): + for check_node in reversed(list(self.get_check_nodes())): if check_node.start_pos < start_pos: if start_pos < check_node.end_pos: return None @@ -724,7 +707,7 @@ class IfStmt(Flow): else: return check_node - def node_after_else(self, node): + def is_node_after_else(self, node): """ Checks if a node is defined after `else`. """ diff --git a/jedi/parser_utils.py b/jedi/parser_utils.py index 40162265..2a89203c 100644 --- a/jedi/parser_utils.py +++ b/jedi/parser_utils.py @@ -6,10 +6,9 @@ _EXECUTE_NODES = set([ 'shift_expr', 'arith_expr', 'atom_expr', 'term', 'factor', 'power', 'atom' ]) -return_ = 'import_name', 'import_from' - - -# last added: Flow, KeywordStatement +_FLOW_KEYWORDS = ( + 'try', 'except', 'finally', 'else', 'if', 'elif', 'with', 'for', 'while' +) def get_executable_nodes(node, last_added=False): @@ -68,3 +67,18 @@ def for_stmt_defines_one_name(for_stmt): :returns: bool """ return for_stmt.children[1].type == 'name' + + +def get_flow_branch_keyword(flow_node, node): + start_pos = node.start_pos + if not (flow_node.start_pos < start_pos <= flow_node.end_pos): + raise ValueError('The node is not part of the flow.') + + keyword = None + for i, child in enumerate(flow_node.children): + if start_pos < child.start_pos: + return keyword + first_leaf = child.get_first_leaf() + if first_leaf in _FLOW_KEYWORDS: + keyword = first_leaf + return 0