Starting to try to move some functions away from Evaluator.

This time eval_trailer.
This commit is contained in:
Dave Halter
2017-09-27 16:21:02 +02:00
parent 313e1b3875
commit 5415a6164f
6 changed files with 35 additions and 30 deletions

View File

@@ -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:

View File

@@ -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)

View File

@@ -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,

View File

@@ -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)

View File

@@ -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

View File

@@ -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)