diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index dca61a68..557c6a1b 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -33,7 +33,7 @@ from jedi.evaluate import usages from jedi.evaluate.arguments import try_iter_content from jedi.evaluate.helpers import get_module_names, evaluate_call_of_leaf from jedi.evaluate.sys_path import transform_path_to_dotted -from jedi.evaluate.filters import TreeNameDefinition, ParamName +from jedi.evaluate.names import TreeNameDefinition, ParamName from jedi.evaluate.syntax_tree import tree_name_to_contexts from jedi.evaluate.context import ModuleContext from jedi.evaluate.base_context import ContextSet diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 6ec836bd..24868a61 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -13,7 +13,7 @@ from jedi.cache import memoize_method from jedi.evaluate import imports from jedi.evaluate import compiled from jedi.evaluate.imports import ImportName -from jedi.evaluate.filters import ParamName +from jedi.evaluate.names import ParamName from jedi.evaluate.context import FunctionExecutionContext, MethodContext from jedi.evaluate.gradual.typeshed import StubModuleContext from jedi.evaluate.gradual.stub_context import name_to_stub, stub_to_actual_context_set diff --git a/jedi/api/keywords.py b/jedi/api/keywords.py index 09b0223f..1dab29ae 100644 --- a/jedi/api/keywords.py +++ b/jedi/api/keywords.py @@ -1,7 +1,7 @@ import pydoc from jedi.evaluate.utils import ignored -from jedi.evaluate.filters import AbstractNameDefinition +from jedi.evaluate.names import AbstractNameDefinition try: from pydoc_data import topics as pydoc_topics diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 0db586be..d6d219b8 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -76,7 +76,7 @@ from jedi.evaluate import imports from jedi.evaluate import recursion from jedi.evaluate.cache import evaluator_function_cache from jedi.evaluate import helpers -from jedi.evaluate.filters import TreeNameDefinition, ParamName +from jedi.evaluate.names import TreeNameDefinition, ParamName from jedi.evaluate.base_context import ContextualizedName, ContextualizedNode, \ ContextSet, NO_CONTEXTS, iterate_contexts from jedi.evaluate.context import ClassContext, FunctionContext, \ diff --git a/jedi/evaluate/arguments.py b/jedi/evaluate/arguments.py index 59ec0b3f..9a701375 100644 --- a/jedi/evaluate/arguments.py +++ b/jedi/evaluate/arguments.py @@ -8,7 +8,7 @@ from jedi.evaluate.utils import PushBackIterator from jedi.evaluate import analysis from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts, \ LazyTreeContext, get_merged_lazy_context -from jedi.evaluate.filters import ParamName +from jedi.evaluate.names import ParamName from jedi.evaluate.base_context import NO_CONTEXTS, ContextSet, ContextualizedNode from jedi.evaluate.context import iterable from jedi.evaluate.param import get_executed_params_and_issues, ExecutedParam diff --git a/jedi/evaluate/base_context.py b/jedi/evaluate/base_context.py index 36dfdaa1..1a84c5d1 100644 --- a/jedi/evaluate/base_context.py +++ b/jedi/evaluate/base_context.py @@ -205,7 +205,7 @@ class ContextWrapper(HelperContextMixin, object): @safe_property def name(self): - from jedi.evaluate.filters import ContextName + from jedi.evaluate.names import ContextName wrapped_name = self._wrapped_context.name if wrapped_name.tree_name is not None: return ContextName(self, wrapped_name.tree_name) diff --git a/jedi/evaluate/compiled/context.py b/jedi/evaluate/compiled/context.py index 5e7b9e79..52bba972 100644 --- a/jedi/evaluate/compiled/context.py +++ b/jedi/evaluate/compiled/context.py @@ -7,8 +7,8 @@ from functools import partial from jedi import debug from jedi._compatibility import force_unicode, Parameter from jedi.cache import underscore_memoization, memoize_method -from jedi.evaluate.filters import AbstractFilter, AbstractNameDefinition, \ - ContextNameMixin +from jedi.evaluate.filters import AbstractFilter +from jedi.evaluate.names import AbstractNameDefinition, ContextNameMixin from jedi.evaluate.base_context import Context, ContextSet, NO_CONTEXTS from jedi.evaluate.lazy_context import LazyKnownContext from jedi.evaluate.compiled.access import _sentinel diff --git a/jedi/evaluate/context/function.py b/jedi/evaluate/context/function.py index 9e36b389..24876f45 100644 --- a/jedi/evaluate/context/function.py +++ b/jedi/evaluate/context/function.py @@ -10,8 +10,8 @@ from jedi.evaluate import flow_analysis from jedi.evaluate import helpers from jedi.evaluate.signature import TreeSignature from jedi.evaluate.arguments import AnonymousArguments -from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \ - ContextName, AbstractNameDefinition, ParamName +from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter +from jedi.evaluate.names import ContextName, AbstractNameDefinition, ParamName from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \ ContextSet, TreeContext, ContextWrapper from jedi.evaluate.lazy_context import LazyKnownContexts, LazyKnownContext, \ diff --git a/jedi/evaluate/context/instance.py b/jedi/evaluate/context/instance.py index 0f959d7b..67e054b8 100644 --- a/jedi/evaluate/context/instance.py +++ b/jedi/evaluate/context/instance.py @@ -3,7 +3,8 @@ from abc import abstractproperty from jedi import debug from jedi import settings from jedi.evaluate import compiled -from jedi.evaluate import filters +from jedi.evaluate.filters import AbstractFilter +from jedi.evaluate.names import ContextName, TreeNameDefinition from jedi.evaluate.base_context import Context, NO_CONTEXTS, ContextSet, \ iterator_to_context_set, ContextWrapper from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts @@ -267,7 +268,7 @@ class TreeInstance(AbstractInstanceContext): @property def name(self): - return filters.ContextName(self, self.class_context.name.tree_name) + return ContextName(self, self.class_context.name.tree_name) # This can recurse, if the initialization of the class includes a reference # to itself. @@ -340,7 +341,7 @@ class CompiledInstanceName(compiled.CompiledName): yield result_context -class CompiledInstanceClassFilter(filters.AbstractFilter): +class CompiledInstanceClassFilter(AbstractFilter): name_class = CompiledInstanceName def __init__(self, evaluator, instance, klass): @@ -419,7 +420,7 @@ class CompiledBoundMethod(compiled.CompiledObject): return list(super(CompiledBoundMethod, self).get_param_names())[1:] -class SelfName(filters.TreeNameDefinition): +class SelfName(TreeNameDefinition): """ This name calculates the parent_context lazily. """ @@ -452,7 +453,7 @@ class LazyInstanceClassName(object): return '<%s: %s>' % (self.__class__.__name__, self._class_member_name) -class InstanceClassFilter(filters.AbstractFilter): +class InstanceClassFilter(AbstractFilter): """ This filter is special in that it uses the class filter and wraps the resulting names in LazyINstanceClassName. The idea is that the class name diff --git a/jedi/evaluate/context/klass.py b/jedi/evaluate/context/klass.py index ee145f60..34ad9454 100644 --- a/jedi/evaluate/context/klass.py +++ b/jedi/evaluate/context/klass.py @@ -43,8 +43,8 @@ from jedi.evaluate.cache import evaluator_method_cache, CachedMetaClass, \ evaluator_method_generator_cache from jedi.evaluate import compiled from jedi.evaluate.lazy_context import LazyKnownContexts -from jedi.evaluate.filters import ParserTreeFilter, TreeNameDefinition, \ - ContextName +from jedi.evaluate.filters import ParserTreeFilter +from jedi.evaluate.names import TreeNameDefinition, ContextName from jedi.evaluate.arguments import unpack_arglist from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \ TreeContext, NO_CONTEXTS diff --git a/jedi/evaluate/context/module.py b/jedi/evaluate/context/module.py index 0cb2ca57..e8d1d7eb 100644 --- a/jedi/evaluate/context/module.py +++ b/jedi/evaluate/context/module.py @@ -2,8 +2,8 @@ import re import os from jedi.evaluate.cache import evaluator_method_cache -from jedi.evaluate.filters import GlobalNameFilter, ContextNameMixin, \ - AbstractNameDefinition, ParserTreeFilter, DictFilter, MergedFilter +from jedi.evaluate.names import ContextNameMixin, AbstractNameDefinition +from jedi.evaluate.filters import GlobalNameFilter, ParserTreeFilter, DictFilter, MergedFilter from jedi.evaluate import compiled from jedi.evaluate.base_context import TreeContext from jedi.evaluate.names import SubModuleName diff --git a/jedi/evaluate/context/namespace.py b/jedi/evaluate/context/namespace.py index ef43e307..c973fb2f 100644 --- a/jedi/evaluate/context/namespace.py +++ b/jedi/evaluate/context/namespace.py @@ -1,5 +1,6 @@ from jedi.evaluate.cache import evaluator_method_cache -from jedi.evaluate.filters import DictFilter, AbstractNameDefinition, ContextNameMixin +from jedi.evaluate.filters import DictFilter +from jedi.evaluate.names import ContextNameMixin, AbstractNameDefinition from jedi.evaluate.base_context import Context from jedi.evaluate.context.module import SubModuleDictMixin diff --git a/jedi/evaluate/filters.py b/jedi/evaluate/filters.py index 8f6aeed8..2f431650 100644 --- a/jedi/evaluate/filters.py +++ b/jedi/evaluate/filters.py @@ -6,139 +6,13 @@ from abc import abstractmethod from parso.tree import search_ancestor -from jedi._compatibility import use_metaclass, Parameter +from jedi._compatibility import use_metaclass from jedi.evaluate import flow_analysis from jedi.evaluate.base_context import ContextSet, Context from jedi.parser_utils import get_parent_scope from jedi.evaluate.utils import to_list from jedi.evaluate.cache import evaluator_function_cache - - -class AbstractNameDefinition(object): - start_pos = None - string_name = None - parent_context = None - tree_name = None - - @abstractmethod - def infer(self): - raise NotImplementedError - - @abstractmethod - def goto(self): - # Typically names are already definitions and therefore a goto on that - # name will always result on itself. - return {self} - - def get_root_context(self): - return self.parent_context.get_root_context() - - def __repr__(self): - if self.start_pos is None: - return '<%s: %s>' % (self.__class__.__name__, self.string_name) - return '<%s: %s@%s>' % (self.__class__.__name__, self.string_name, self.start_pos) - - def is_import(self): - return False - - @property - def api_type(self): - return self.parent_context.api_type - - -class AbstractTreeName(AbstractNameDefinition): - def __init__(self, parent_context, tree_name): - self.parent_context = parent_context - self.tree_name = tree_name - - def goto(self): - return self.parent_context.evaluator.goto(self.parent_context, self.tree_name) - - def is_import(self): - imp = search_ancestor(self.tree_name, 'import_from', 'import_name') - return imp is not None - - @property - def string_name(self): - return self.tree_name.value - - @property - def start_pos(self): - return self.tree_name.start_pos - - -class ContextNameMixin(object): - def infer(self): - return ContextSet([self._context]) - - def get_root_context(self): - if self.parent_context is None: # A module - return self._context - return super(ContextNameMixin, self).get_root_context() - - @property - def api_type(self): - return self._context.api_type - - -class ContextName(ContextNameMixin, AbstractTreeName): - def __init__(self, context, tree_name): - super(ContextName, self).__init__(context.parent_context, tree_name) - self._context = context - - -class TreeNameDefinition(AbstractTreeName): - _API_TYPES = dict( - import_name='module', - import_from='module', - funcdef='function', - param='param', - classdef='class', - ) - - def infer(self): - # Refactor this, should probably be here. - from jedi.evaluate.syntax_tree import tree_name_to_contexts - return tree_name_to_contexts(self.parent_context.evaluator, self.parent_context, self.tree_name) - - @property - def api_type(self): - definition = self.tree_name.get_definition(import_name_always=True) - if definition is None: - return 'statement' - return self._API_TYPES.get(definition.type, 'statement') - - -class ParamName(AbstractTreeName): - api_type = u'param' - - def __init__(self, parent_context, tree_name): - self.parent_context = parent_context - self.tree_name = tree_name - - def get_kind(self): - tree_param = search_ancestor(self.tree_name, 'param') - if tree_param.star_count == 1: # *args - return Parameter.VAR_POSITIONAL - if tree_param.star_count == 2: # **kwargs - return Parameter.VAR_KEYWORD - - parent = tree_param.parent - for p in parent.children: - if p.type == 'param': - if p.star_count: - return Parameter.KEYWORD_ONLY - if p == tree_param: - break - return Parameter.POSITIONAL_OR_KEYWORD - - def infer(self): - return self.get_param().infer() - - def get_param(self): - params, _ = self.parent_context.get_executed_params_and_issues() - param_node = search_ancestor(self.tree_name, 'param') - return params[param_node.position_index] +from jedi.evaluate.names import TreeNameDefinition, ParamName, AbstractNameDefinition class AbstractFilter(object): @@ -174,21 +48,6 @@ class FilterWrapper(object): return self.wrap_names(self._wrapped_filter.values()) -class NameWrapper(object): - def __init__(self, wrapped_name): - self._wrapped_name = wrapped_name - - @abstractmethod - def infer(self): - raise NotImplementedError - - def __getattr__(self, name): - return getattr(self._wrapped_name, name) - - def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, self._wrapped_name) - - @evaluator_function_cache() def _get_definition_names(evaluator, module_node, name_key): try: diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index ff39c372..a7a57cc8 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -25,7 +25,8 @@ from jedi.evaluate import flow_analysis from jedi.evaluate.arguments import TreeArguments from jedi.evaluate import helpers from jedi.evaluate.context import iterable -from jedi.evaluate.filters import get_global_filters, TreeNameDefinition +from jedi.evaluate.filters import get_global_filters +from jedi.evaluate.names import TreeNameDefinition from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS from jedi.parser_utils import is_scope, get_parent_scope diff --git a/jedi/evaluate/gradual/typing.py b/jedi/evaluate/gradual/typing.py index 78f95047..31cbdaac 100644 --- a/jedi/evaluate/gradual/typing.py +++ b/jedi/evaluate/gradual/typing.py @@ -15,8 +15,9 @@ from jedi.evaluate.lazy_context import LazyKnownContexts from jedi.evaluate.context.iterable import SequenceLiteralContext from jedi.evaluate.arguments import repack_with_argument_clinic from jedi.evaluate.utils import to_list -from jedi.evaluate.filters import FilterWrapper, NameWrapper, \ - AbstractTreeName, AbstractNameDefinition, ContextName +from jedi.evaluate.filters import FilterWrapper +from jedi.evaluate.names import NameWrapper, AbstractTreeName, \ + AbstractNameDefinition, ContextName from jedi.evaluate.helpers import is_string from jedi.evaluate.context.klass import ClassMixin diff --git a/jedi/evaluate/names.py b/jedi/evaluate/names.py index 466d964f..8fbae523 100644 --- a/jedi/evaluate/names.py +++ b/jedi/evaluate/names.py @@ -1,4 +1,137 @@ -from jedi.evaluate.filters import AbstractNameDefinition +from abc import abstractmethod + +from parso.tree import search_ancestor + +from jedi._compatibility import Parameter +from jedi.evaluate.base_context import ContextSet + + +class AbstractNameDefinition(object): + start_pos = None + string_name = None + parent_context = None + tree_name = None + + @abstractmethod + def infer(self): + raise NotImplementedError + + @abstractmethod + def goto(self): + # Typically names are already definitions and therefore a goto on that + # name will always result on itself. + return {self} + + def get_root_context(self): + return self.parent_context.get_root_context() + + def __repr__(self): + if self.start_pos is None: + return '<%s: %s>' % (self.__class__.__name__, self.string_name) + return '<%s: %s@%s>' % (self.__class__.__name__, self.string_name, self.start_pos) + + def is_import(self): + return False + + @property + def api_type(self): + return self.parent_context.api_type + + +class AbstractTreeName(AbstractNameDefinition): + def __init__(self, parent_context, tree_name): + self.parent_context = parent_context + self.tree_name = tree_name + + def goto(self): + return self.parent_context.evaluator.goto(self.parent_context, self.tree_name) + + def is_import(self): + imp = search_ancestor(self.tree_name, 'import_from', 'import_name') + return imp is not None + + @property + def string_name(self): + return self.tree_name.value + + @property + def start_pos(self): + return self.tree_name.start_pos + + +class ContextNameMixin(object): + def infer(self): + return ContextSet([self._context]) + + def get_root_context(self): + if self.parent_context is None: # A module + return self._context + return super(ContextNameMixin, self).get_root_context() + + @property + def api_type(self): + return self._context.api_type + + +class ContextName(ContextNameMixin, AbstractTreeName): + def __init__(self, context, tree_name): + super(ContextName, self).__init__(context.parent_context, tree_name) + self._context = context + + +class TreeNameDefinition(AbstractTreeName): + _API_TYPES = dict( + import_name='module', + import_from='module', + funcdef='function', + param='param', + classdef='class', + ) + + def infer(self): + # Refactor this, should probably be here. + from jedi.evaluate.syntax_tree import tree_name_to_contexts + parent = self.parent_context + return tree_name_to_contexts(parent.evaluator, parent, self.tree_name) + + @property + def api_type(self): + definition = self.tree_name.get_definition(import_name_always=True) + if definition is None: + return 'statement' + return self._API_TYPES.get(definition.type, 'statement') + + +class ParamName(AbstractTreeName): + api_type = u'param' + + def __init__(self, parent_context, tree_name): + self.parent_context = parent_context + self.tree_name = tree_name + + def get_kind(self): + tree_param = search_ancestor(self.tree_name, 'param') + if tree_param.star_count == 1: # *args + return Parameter.VAR_POSITIONAL + if tree_param.star_count == 2: # **kwargs + return Parameter.VAR_KEYWORD + + parent = tree_param.parent + for p in parent.children: + if p.type == 'param': + if p.star_count: + return Parameter.KEYWORD_ONLY + if p == tree_param: + break + return Parameter.POSITIONAL_OR_KEYWORD + + def infer(self): + return self.get_param().infer() + + def get_param(self): + params, _ = self.parent_context.get_executed_params_and_issues() + param_node = search_ancestor(self.tree_name, 'param') + return params[param_node.position_index] class ImportName(AbstractNameDefinition): @@ -32,3 +165,18 @@ class ImportName(AbstractNameDefinition): class SubModuleName(ImportName): _level = 1 + + +class NameWrapper(object): + def __init__(self, wrapped_name): + self._wrapped_name = wrapped_name + + @abstractmethod + def infer(self): + raise NotImplementedError + + def __getattr__(self, name): + return getattr(self._wrapped_name, name) + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self._wrapped_name) diff --git a/jedi/evaluate/usages.py b/jedi/evaluate/usages.py index d7604a0d..623caf4c 100644 --- a/jedi/evaluate/usages.py +++ b/jedi/evaluate/usages.py @@ -1,5 +1,5 @@ from jedi.evaluate import imports -from jedi.evaluate.filters import TreeNameDefinition +from jedi.evaluate.names import TreeNameDefinition def _resolve_names(definition_names, avoid_names=()): diff --git a/test/test_evaluate/test_gradual/test_typeshed.py b/test/test_evaluate/test_gradual/test_typeshed.py index b11a61d7..fc3f5c32 100644 --- a/test/test_evaluate/test_gradual/test_typeshed.py +++ b/test/test_evaluate/test_gradual/test_typeshed.py @@ -6,7 +6,6 @@ from parso.utils import PythonVersionInfo from jedi.evaluate.gradual import typeshed, stub_context from jedi.evaluate.context import TreeInstance, BoundMethod, FunctionContext, \ MethodContext, ClassContext -from jedi.evaluate.filters import TreeNameDefinition TYPESHED_PYTHON3 = os.path.join(typeshed.TYPESHED_PATH, 'stdlib', '3') diff --git a/test/test_settings.py b/test/test_settings.py index cd1e2c85..1519f0b3 100644 --- a/test/test_settings.py +++ b/test/test_settings.py @@ -1,7 +1,7 @@ import pytest from jedi import settings -from jedi.evaluate.filters import ContextName +from jedi.evaluate.names import ContextName from jedi.evaluate.compiled import CompiledContextName from jedi.evaluate.gradual.typeshed import StubModuleContext