diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index cc93f163..03cb9d6a 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -77,13 +77,13 @@ from jedi.evaluate import stdlib from jedi.evaluate import finder from jedi.evaluate import compiled from jedi.evaluate import precedence -from jedi.evaluate import param from jedi.evaluate import helpers from jedi.evaluate import pep0484 from jedi.evaluate.filters import TreeNameDefinition, ParamName from jedi.evaluate.instance import AnonymousInstance, BoundMethod from jedi.evaluate.context import ContextualizedName, ContextualizedNode, \ ContextSet, NO_CONTEXTS +from jedi.evaluate.syntax_tree import eval_trailer from jedi import parser_utils @@ -330,7 +330,7 @@ class Evaluator(object): right ) break - context_set = self.eval_trailer(context, context_set, trailer) + context_set = eval_trailer(context, context_set, trailer) return context_set return NO_CONTEXTS elif typ in ('testlist_star_expr', 'testlist',): @@ -428,25 +428,6 @@ class Evaluator(object): context = iterable.SequenceLiteralContext(self, context, atom) return ContextSet(context) - def eval_trailer(self, context, base_contexts, trailer): - trailer_op, node = trailer.children[:2] - if node == ')': # `arglist` is optional. - node = () - - if trailer_op == '[': - return iterable.py__getitem__(self, context, base_contexts, trailer) - else: - debug.dbg('eval_trailer: %s in %s', trailer, base_contexts) - if trailer_op == '.': - return base_contexts.py__getattribute__( - name_context=context, - name_or_str=node - ) - else: - assert trailer_op == '(' - arguments = param.TreeArguments(self, context, node, trailer) - return base_contexts.execute(arguments) - @debug.increase_indent def execute(self, obj, arguments): if self.is_analysis: @@ -527,7 +508,7 @@ class Evaluator(object): to_evaluate = trailer.parent.children[:i] context_set = context.eval_node(to_evaluate[0]) for trailer in to_evaluate[1:]: - context_set = self.eval_trailer(context, context_set, trailer) + context_set = eval_trailer(context, context_set, trailer) param_names = [] for context in context_set: try: diff --git a/jedi/evaluate/compiled/mixed.py b/jedi/evaluate/compiled/mixed.py index 3b397a31..be7fa34c 100644 --- a/jedi/evaluate/compiled/mixed.py +++ b/jedi/evaluate/compiled/mixed.py @@ -41,9 +41,6 @@ class MixedObject(object): # We have to overwrite everything that has to do with trailers, name # lookups and filters to make it possible to route name lookups towards # compiled objects and the rest towards tree node contexts. - def eval_trailer(*args, **kwags): - return Context.eval_trailer(*args, **kwags) - def py__getattribute__(*args, **kwargs): return Context.py__getattribute__(*args, **kwargs) diff --git a/jedi/evaluate/context.py b/jedi/evaluate/context.py index 98960c64..d9386ea7 100644 --- a/jedi/evaluate/context.py +++ b/jedi/evaluate/context.py @@ -49,9 +49,6 @@ class Context(object): def eval_stmt(self, stmt, seek_name=None): return self.evaluator.eval_statement(self, stmt, seek_name) - def eval_trailer(self, types, trailer): - return self.evaluator.eval_trailer(self, types, trailer) - @Python3Method def py__getattribute__(self, name_or_str, name_context=None, position=None, search_global=False, is_goto=False, diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index fd37adac..79d24f5d 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -32,6 +32,7 @@ from jedi.evaluate import helpers from jedi.evaluate.filters import get_global_filters, TreeNameDefinition from jedi.evaluate.context import ContextualizedName, ContextualizedNode, ContextSet from jedi.parser_utils import is_scope, get_parent_scope +from jedi.evaluate.syntax_tree import eval_trailer class NameFinder(object): @@ -263,7 +264,7 @@ def _apply_decorators(evaluator, context, node): # Create a trailer and evaluate it. trailer = tree.PythonNode('trailer', trailer_nodes) trailer.parent = dec - dec_values = evaluator.eval_trailer(context, dec_values, trailer) + dec_values = eval_trailer(context, dec_values, trailer) if not len(dec_values): debug.warning('decorator not found: %s on %s', dec, node) diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index b2de3676..d581245e 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -6,7 +6,9 @@ from itertools import chain from contextlib import contextmanager from parso.python import tree + from jedi.parser_utils import get_parent_scope +from jedi.evaluate.syntax_tree import eval_trailer def is_stdlib_path(path): @@ -88,7 +90,7 @@ def evaluate_call_of_leaf(context, leaf, cut_own_trailer=False): values = context.eval_node(base) for trailer in trailers: - values = context.eval_trailer(values, trailer) + values = eval_trailer(context, values, trailer) return values diff --git a/jedi/evaluate/syntax_tree.py b/jedi/evaluate/syntax_tree.py new file mode 100644 index 00000000..953496f4 --- /dev/null +++ b/jedi/evaluate/syntax_tree.py @@ -0,0 +1,27 @@ +""" +Functions evaluating the syntax tree. +""" + +from jedi import debug + + +def eval_trailer(context, base_contexts, trailer): + trailer_op, node = trailer.children[:2] + if node == ')': # `arglist` is optional. + node = () + + if trailer_op == '[': + from jedi.evaluate import iterable + return iterable.py__getitem__(context.evaluator, context, base_contexts, trailer) + else: + debug.dbg('eval_trailer: %s in %s', trailer, base_contexts) + if trailer_op == '.': + return base_contexts.py__getattribute__( + name_context=context, + name_or_str=node + ) + else: + assert trailer_op == '(' + from jedi.evaluate import param + arguments = param.TreeArguments(context.evaluator, context, node, trailer) + return base_contexts.execute(arguments)