diff --git a/jedi/inference/base_value.py b/jedi/inference/base_value.py index 5d7fb60f..5f23162c 100644 --- a/jedi/inference/base_value.py +++ b/jedi/inference/base_value.py @@ -96,7 +96,7 @@ class HelperValueMixin(object): if name_context is None: name_context = self from jedi.inference import finder - f = finder.NameFinder(self.inference_state, self, name_context, name_or_str, + f = finder.NameFinder(self, name_context, name_or_str, analysis_errors=analysis_errors) filters = self._get_value_filters(name_or_str) names = f.filter_name(filters) diff --git a/jedi/inference/context.py b/jedi/inference/context.py index 801ba2b2..82769d3c 100644 --- a/jedi/inference/context.py +++ b/jedi/inference/context.py @@ -25,7 +25,7 @@ class AbstractContext(object): def _goto(self, name_or_str, position): from jedi.inference import finder - f = finder.NameFinder(self.inference_state, self, self, name_or_str, position) + f = finder.NameFinder(self, self, name_or_str, position) filters = _get_global_filters_for_name( self, name_or_str if isinstance(name_or_str, Name) else None, position, ) diff --git a/jedi/inference/finder.py b/jedi/inference/finder.py index 48c02177..c7783d6b 100644 --- a/jedi/inference/finder.py +++ b/jedi/inference/finder.py @@ -19,21 +19,17 @@ from parso.python import tree from parso.tree import search_ancestor from jedi import debug from jedi import settings -from jedi.inference import compiled -from jedi.inference import analysis from jedi.inference import flow_analysis from jedi.inference.arguments import TreeArguments from jedi.inference import helpers from jedi.inference.value import iterable -from jedi.inference.names import TreeNameDefinition from jedi.inference.base_value import ValueSet, NO_VALUES from jedi.parser_utils import is_scope, get_parent_scope class NameFinder(object): - def __init__(self, inference_state, context, name_value, name_or_str, + def __init__(self, context, name_value, name_or_str, position=None, analysis_errors=True): - self._inference_state = inference_state # Make sure that it's not just a syntax tree node. self._context = context self._name_context = name_value @@ -77,7 +73,11 @@ class NameFinder(object): return NO_VALUES return found_predefined_types - return self._names_to_types(names) + values = ValueSet.from_sets(name.infer() for name in names) + debug.dbg('finder._names_to_types: %s -> %s', names, values) + if values: + return values + return self._add_other_knowledge() def filter_name(self, filters): """ @@ -92,18 +92,15 @@ class NameFinder(object): return list(names) - def _names_to_types(self, names): - values = ValueSet.from_sets(name.infer() for name in names) - - debug.dbg('finder._names_to_types: %s -> %s', names, values) + def _add_other_knowledge(self): # Add isinstance and other if/assert knowledge. - if not values and isinstance(self._name, tree.Name) and \ + if isinstance(self._name, tree.Name) and \ not self._name_context.is_instance() and not self._context.is_compiled(): flow_scope = self._name base_nodes = [self._name_context.tree_node] if any(b.type in ('comp_for', 'sync_comp_for') for b in base_nodes): - return values + return NO_VALUES while True: flow_scope = get_parent_scope(flow_scope, include_flows=True) n = _check_flow_information(self._name_context, flow_scope, @@ -112,7 +109,7 @@ class NameFinder(object): return n if flow_scope in base_nodes: break - return values + return NO_VALUES def _check_flow_information(value, flow, search_name, pos): diff --git a/jedi/inference/syntax_tree.py b/jedi/inference/syntax_tree.py index baf5e1eb..3aaf5c4e 100644 --- a/jedi/inference/syntax_tree.py +++ b/jedi/inference/syntax_tree.py @@ -571,7 +571,7 @@ def tree_name_to_values(inference_state, context, tree_name): node = tree_name.parent if node.type == 'global_stmt': c = context.create_context(tree_name) - finder = NameFinder(inference_state, c, c, tree_name.value) + finder = NameFinder(c, c, tree_name.value) # For global_stmt lookups, we only need the first possible scope, # which means the function itself. filters = [next(c.get_filters())]