diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 5b97d743..e4ed84e3 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -11,7 +11,7 @@ from parso.python.tree import search_ancestor from jedi._compatibility import u from jedi import settings -from jedi import common +from jedi.evaluate.utils import ignored, unite from jedi.cache import memoize_method from jedi.evaluate import representation as er from jedi.evaluate import instance @@ -311,7 +311,7 @@ class BaseDefinition(object): if not path: return None # for keywords the path is empty - with common.ignored(KeyError): + with ignored(KeyError): path[0] = self._mapping[path[0]] for key, repl in self._tuple_mapping.items(): if tuple(path[:len(key)]) == key: @@ -588,7 +588,7 @@ class Definition(BaseDefinition): """ defs = self._name.infer() return sorted( - common.unite(defined_names(self._evaluator, d) for d in defs), + unite(defined_names(self._evaluator, d) for d in defs), key=lambda s: s._name.start_pos or (0, 0) ) diff --git a/jedi/api/keywords.py b/jedi/api/keywords.py index 295add6a..a1bc4e7f 100644 --- a/jedi/api/keywords.py +++ b/jedi/api/keywords.py @@ -2,7 +2,7 @@ import pydoc import keyword from jedi._compatibility import is_py3, is_py35 -from jedi import common +from jedi.evaluate.utils import ignored from jedi.evaluate.filters import AbstractNameDefinition from parso.python.tree import Leaf @@ -123,7 +123,7 @@ def imitate_pydoc(string): # with unicode strings) string = str(string) h = pydoc.help - with common.ignored(KeyError): + with ignored(KeyError): # try to access symbols string = h.symbols[string] string, _, related = string.partition(' ') diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index fc074446..346f3528 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -67,7 +67,7 @@ from parso.python import tree import parso from jedi import debug -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi.evaluate import representation as er from jedi.evaluate import imports from jedi.evaluate import recursion diff --git a/jedi/evaluate/context.py b/jedi/evaluate/context.py index d111ff24..8532cdb1 100644 --- a/jedi/evaluate/context.py +++ b/jedi/evaluate/context.py @@ -1,5 +1,5 @@ from jedi._compatibility import Python3Method -from jedi.common import unite +from jedi.evaluate.utils import unite from parso.python.tree import ExprStmt, CompFor from jedi.parser_utils import clean_scope_docstring, get_doc_with_call_signature diff --git a/jedi/evaluate/docstrings.py b/jedi/evaluate/docstrings.py index 3a141003..c552d5e3 100644 --- a/jedi/evaluate/docstrings.py +++ b/jedi/evaluate/docstrings.py @@ -21,10 +21,9 @@ from textwrap import dedent from parso import parse from jedi._compatibility import u -from jedi.common import unite +from jedi.evaluate.utils import unite, indent_block from jedi.evaluate import context from jedi.evaluate.cache import evaluator_method_cache -from jedi.common import indent_block from jedi.evaluate.iterable import SequenceLiteralContext, FakeSequence diff --git a/jedi/evaluate/dynamic.py b/jedi/evaluate/dynamic.py index 00c38f51..fb179b58 100644 --- a/jedi/evaluate/dynamic.py +++ b/jedi/evaluate/dynamic.py @@ -24,7 +24,7 @@ from jedi.evaluate.cache import evaluator_function_cache from jedi.evaluate import imports from jedi.evaluate.param import TreeArguments, create_default_params from jedi.evaluate.helpers import is_stdlib_path -from jedi.common import to_list, unite +from jedi.evaluate.utils import to_list, unite from jedi.parser_utils import get_parent_scope diff --git a/jedi/evaluate/filters.py b/jedi/evaluate/filters.py index 54eb01f4..004aec2b 100644 --- a/jedi/evaluate/filters.py +++ b/jedi/evaluate/filters.py @@ -6,7 +6,7 @@ from abc import abstractmethod from parso.tree import search_ancestor from jedi.evaluate import flow_analysis -from jedi.common import to_list, unite +from jedi.evaluate.utils import to_list, unite from jedi.parser_utils import get_parent_scope diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index aba190e1..38a1b357 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -18,7 +18,7 @@ check for -> a is a string). There's big potential in these checks. from parso.python import tree from parso.tree import search_ancestor from jedi import debug -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi import settings from jedi.evaluate import representation as er from jedi.evaluate.instance import AbstractInstanceContext diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index d0aec515..12ed630a 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -24,7 +24,7 @@ from parso import python_bytes_to_unicode from jedi._compatibility import find_module, unicode, ImplicitNSInfo from jedi import debug from jedi import settings -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi.evaluate import sys_path from jedi.evaluate import helpers from jedi.evaluate import compiled diff --git a/jedi/evaluate/instance.py b/jedi/evaluate/instance.py index 6ce26f6e..52852d1e 100644 --- a/jedi/evaluate/instance.py +++ b/jedi/evaluate/instance.py @@ -1,7 +1,7 @@ from abc import abstractproperty from jedi._compatibility import is_py3 -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi import debug from jedi.evaluate import compiled from jedi.evaluate import filters diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 593f354a..6e51894d 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -22,9 +22,9 @@ It is important to note that: """ from jedi import debug from jedi import settings -from jedi import common -from jedi.common import unite, safe_property +from jedi.evaluate.utils import unite, safe_property from jedi._compatibility import unicode, zip_longest, is_py3 +from jedi.evaluate.utils import to_list from jedi.evaluate import compiled from jedi.evaluate import helpers from jedi.evaluate import analysis @@ -262,7 +262,7 @@ class Comprehension(AbstractSequence): yield iterated @evaluator_method_cache(default=[]) - @common.to_list + @to_list def _iterate(self): comp_fors = tuple(get_comp_fors(self._get_comp_for())) for result in self._nested(comp_fors): diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index c6fb55f4..5490df1f 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -2,7 +2,7 @@ from collections import defaultdict from jedi._compatibility import zip_longest from jedi import debug -from jedi import common +from jedi.evaluate.utils import PushBackIterator from parso.python import tree from jedi.evaluate import iterable from jedi.evaluate import analysis @@ -258,7 +258,7 @@ def get_params(execution_context, var_args): for param in funcdef.get_params(): param_dict[param.name.value] = param unpacked_va = list(var_args.unpack(funcdef)) - var_arg_iterator = common.PushBackIterator(iter(unpacked_va)) + var_arg_iterator = PushBackIterator(iter(unpacked_va)) non_matching_keys = defaultdict(lambda: []) keys_used = {} diff --git a/jedi/evaluate/pep0484.py b/jedi/evaluate/pep0484.py index bd90957d..f9a5c5ed 100644 --- a/jedi/evaluate/pep0484.py +++ b/jedi/evaluate/pep0484.py @@ -26,7 +26,7 @@ import re from parso import ParserSyntaxError from parso.python import tree -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate import compiled from jedi.evaluate.context import LazyTreeContext diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index d6a506f2..f2878e71 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -12,7 +12,7 @@ compiled module that returns the types for C-builtins. import collections import re -from jedi.common import unite +from jedi.evaluate.utils import unite from jedi.evaluate import compiled from jedi.evaluate import representation as er from jedi.evaluate.instance import InstanceFunctionExecution, \ diff --git a/jedi/evaluate/sys_path.py b/jedi/evaluate/sys_path.py index a4990c3c..057479ec 100644 --- a/jedi/evaluate/sys_path.py +++ b/jedi/evaluate/sys_path.py @@ -10,13 +10,13 @@ from jedi.evaluate.compiled import CompiledObject from jedi.evaluate.context import ContextualizedNode from jedi import settings from jedi import debug -from jedi import common +from jedi.evaluate.utils import ignored def get_venv_path(venv): """Get sys.path for specified virtual environment.""" sys_path = _get_venv_path_dirs(venv) - with common.ignored(ValueError): + with ignored(ValueError): sys_path.remove('') sys_path = _get_sys_path_with_egglinks(sys_path) # As of now, get_venv_path_dirs does not scan built-in pythonpath and @@ -194,7 +194,7 @@ def sys_path_with_modifications(evaluator, module_context): curdir = os.path.abspath(os.curdir) #TODO why do we need a chdir? - with common.ignored(OSError): + with ignored(OSError): os.chdir(os.path.dirname(path)) buildout_script_paths = set() @@ -246,7 +246,7 @@ def _detect_django_path(module_path): result = [] for parent in traverse_parents(module_path): - with common.ignored(IOError): + with ignored(IOError): with open(parent + os.path.sep + 'manage.py'): debug.dbg('Found django path: %s', module_path) result.append(parent) diff --git a/jedi/common.py b/jedi/evaluate/utils.py similarity index 99% rename from jedi/common.py rename to jedi/evaluate/utils.py index 007a1852..7fc1c246 100644 --- a/jedi/common.py +++ b/jedi/evaluate/utils.py @@ -4,7 +4,17 @@ import contextlib import functools from jedi._compatibility import reraise -from jedi import settings + + +def to_list(func): + def wrapper(*args, **kwargs): + return list(func(*args, **kwargs)) + return wrapper + + +def unite(iterable): + """Turns a two dimensional array into a one dimensional.""" + return set(typ for types in iterable for typ in types) class UncaughtAttributeError(Exception): @@ -78,16 +88,6 @@ class PushBackIterator(object): return self.current -def indent_block(text, indention=' '): - """This function indents a text block with a default of four spaces.""" - temp = '' - while text and text[-1] == '\n': - temp += text[-1] - text = text[:-1] - lines = text.split('\n') - return '\n'.join(map(lambda s: indention + s, lines)) + temp - - @contextlib.contextmanager def ignored(*exceptions): """ @@ -100,12 +100,11 @@ def ignored(*exceptions): pass -def unite(iterable): - """Turns a two dimensional array into a one dimensional.""" - return set(typ for types in iterable for typ in types) - - -def to_list(func): - def wrapper(*args, **kwargs): - return list(func(*args, **kwargs)) - return wrapper +def indent_block(text, indention=' '): + """This function indents a text block with a default of four spaces.""" + temp = '' + while text and text[-1] == '\n': + temp += text[-1] + text = text[:-1] + lines = text.split('\n') + return '\n'.join(map(lambda s: indention + s, lines)) + temp diff --git a/jedi/refactoring.py b/jedi/refactoring.py index b04caed6..ee938427 100644 --- a/jedi/refactoring.py +++ b/jedi/refactoring.py @@ -14,7 +14,6 @@ following functions (sometimes bug-prone): """ import difflib -from jedi import common from parso import python_bytes_to_unicode, split_lines from jedi.evaluate import helpers @@ -165,38 +164,37 @@ def inline(script): dct = {} definitions = script.goto_assignments() - with common.ignored(AssertionError): - assert len(definitions) == 1 - stmt = definitions[0]._definition - usages = script.usages() - inlines = [r for r in usages - if not stmt.start_pos <= (r.line, r.column) <= stmt.end_pos] - inlines = sorted(inlines, key=lambda x: (x.module_path, x.line, x.column), - reverse=True) - expression_list = stmt.expression_list() - # don't allow multiline refactorings for now. - assert stmt.start_pos[0] == stmt.end_pos[0] - index = stmt.start_pos[0] - 1 + assert len(definitions) == 1 + stmt = definitions[0]._definition + usages = script.usages() + inlines = [r for r in usages + if not stmt.start_pos <= (r.line, r.column) <= stmt.end_pos] + inlines = sorted(inlines, key=lambda x: (x.module_path, x.line, x.column), + reverse=True) + expression_list = stmt.expression_list() + # don't allow multiline refactorings for now. + assert stmt.start_pos[0] == stmt.end_pos[0] + index = stmt.start_pos[0] - 1 - line = new_lines[index] - replace_str = line[expression_list[0].start_pos[1]:stmt.end_pos[1] + 1] - replace_str = replace_str.strip() - # tuples need parentheses - if expression_list and isinstance(expression_list[0], pr.Array): - arr = expression_list[0] - if replace_str[0] not in ['(', '[', '{'] and len(arr) > 1: - replace_str = '(%s)' % replace_str + line = new_lines[index] + replace_str = line[expression_list[0].start_pos[1]:stmt.end_pos[1] + 1] + replace_str = replace_str.strip() + # tuples need parentheses + if expression_list and isinstance(expression_list[0], pr.Array): + arr = expression_list[0] + if replace_str[0] not in ['(', '[', '{'] and len(arr) > 1: + replace_str = '(%s)' % replace_str - # if it's the only assignment, remove the statement - if len(stmt.get_defined_names()) == 1: - line = line[:stmt.start_pos[1]] + line[stmt.end_pos[1]:] + # if it's the only assignment, remove the statement + if len(stmt.get_defined_names()) == 1: + line = line[:stmt.start_pos[1]] + line[stmt.end_pos[1]:] - dct = _rename(inlines, replace_str) - # remove the empty line - new_lines = dct[script.path][2] - if line.strip(): - new_lines[index] = line - else: - new_lines.pop(index) + dct = _rename(inlines, replace_str) + # remove the empty line + new_lines = dct[script.path][2] + if line.strip(): + new_lines[index] = line + else: + new_lines.pop(index) return Refactoring(dct)