From ee52cc75011f3628d577646c8b73323160ed20e6 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 26 Sep 2017 17:26:33 +0200 Subject: [PATCH] Fix most dynamic array issues. --- jedi/common/context.py | 1 + jedi/evaluate/compiled/__init__.py | 4 +++- jedi/evaluate/compiled/mixed.py | 5 ++++- jedi/evaluate/imports.py | 16 +++++++++++----- jedi/evaluate/iterable.py | 12 +++++------- test/test_evaluate/test_compiled.py | 2 +- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/jedi/common/context.py b/jedi/common/context.py index 514a6ea3..ecf12a5a 100644 --- a/jedi/common/context.py +++ b/jedi/common/context.py @@ -18,6 +18,7 @@ class ContextSet(object): Used to work with an iterable of set. """ aggregated = set() + sets = list(sets) for set_ in sets: if isinstance(set_, ContextSet): aggregated |= set_._set diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index 091d07d4..c4d3ae32 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -279,7 +279,9 @@ class CompiledObject(Context): return [] # Builtins don't have imports def dict_values(self): - return ContextSet(create(self.evaluator, v) for v in self.obj.values()) + return ContextSet.from_iterable( + create(self.evaluator, v) for v in self.obj.values() + ) class CompiledName(AbstractNameDefinition): diff --git a/jedi/evaluate/compiled/mixed.py b/jedi/evaluate/compiled/mixed.py index 0be5007b..2fac34ff 100644 --- a/jedi/evaluate/compiled/mixed.py +++ b/jedi/evaluate/compiled/mixed.py @@ -12,6 +12,7 @@ from jedi.evaluate import imports from jedi.evaluate.context import Context from jedi.evaluate.cache import evaluator_function_cache from jedi.evaluate.compiled.getattr_static import getattr_static +from jedi.common import ContextSet class MixedObject(object): @@ -85,7 +86,9 @@ class MixedName(compiled.CompiledName): # PyQt4.QtGui.QStyleOptionComboBox.currentText # -> just set it to None obj = None - return [_create(self._evaluator, obj, parent_context=self.parent_context)] + return ContextSet( + _create(self._evaluator, obj, parent_context=self.parent_context) + ) @property def api_type(self): diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index 5d69e931..716fa35f 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -28,6 +28,7 @@ from jedi.evaluate import sys_path from jedi.evaluate import helpers from jedi.evaluate import compiled from jedi.evaluate import analysis +from jedi.evaluate.utils import unite from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.filters import AbstractNameDefinition from jedi.common import ContextSet, NO_CONTEXTS @@ -66,12 +67,17 @@ def infer_import(context, tree_name, is_goto=False): return NO_CONTEXTS if from_import_name is not None: - types = types.py__getattribute__( - from_import_name, - name_context=context, - is_goto=is_goto, - analysis_errors=False + types = unite( + t.py__getattribute__( + from_import_name, + name_context=context, + is_goto=is_goto, + analysis_errors=False + ) + for t in types ) + if not is_goto: + types = ContextSet.from_set(types) if not types: path = import_path + [from_import_name] diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index cbab52c6..2b8425ab 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -726,17 +726,15 @@ def _check_array_additions(context, sequence): def find_additions(context, arglist, add_name): params = list(param.TreeArguments(context.evaluator, context, arglist).unpack()) - result = ContextSet() + result = set() if add_name in ['insert']: params = params[1:] if add_name in ['append', 'add', 'insert']: - for key, lazy_context in params: - result.add(lazy_context) + for key, whatever in params: + result.add(whatever) elif add_name in ['extend', 'update']: for key, lazy_context in params: - result |= ContextSet.from_iterable( - py__iter__(context.evaluator, lazy_context.infer()) - ) + result |= set(py__iter__(context.evaluator, lazy_context.infer())) return result temp_param_add, settings.dynamic_params_for_other_modules = \ @@ -745,7 +743,7 @@ def _check_array_additions(context, sequence): is_list = sequence.name.string_name == 'list' search_names = (['append', 'extend', 'insert'] if is_list else ['add', 'update']) - added_types = NO_CONTEXTS + added_types = set() for add_name in search_names: try: possible_names = module_context.tree_node.get_used_names()[add_name] diff --git a/test/test_evaluate/test_compiled.py b/test/test_evaluate/test_compiled.py index 0ff4693a..69dcdbe7 100644 --- a/test/test_evaluate/test_compiled.py +++ b/test/test_evaluate/test_compiled.py @@ -95,4 +95,4 @@ def test_time_docstring(): def test_dict_values(): - assert Script('import sys/sys.modules["alshdb;lasdhf"]').goto_definitions() + assert Script('import sys\nsys.modules["alshdb;lasdhf"]').goto_definitions()