1
0
forked from VimPlug/jedi

Fix some interpreter issues

This commit is contained in:
Dave Halter
2019-08-20 09:09:19 +02:00
parent 217b632213
commit 39b294e085
15 changed files with 83 additions and 50 deletions

View File

@@ -246,7 +246,7 @@ class InferenceState(object):
if is_classdef:
c = ClassValue(self, context, name.parent)
else:
c = FunctionValue.from_value(context, name.parent)
c = FunctionValue.from_context(context, name.parent)
return ValueSet([c])
if type_ == 'expr_stmt':
@@ -349,7 +349,7 @@ class InferenceState(object):
new_dotted.children[index - 1:] = []
values = context.infer_node(new_dotted)
return unite(
value.goto(name, name_value=value)
value.goto(name, name_context=value.as_context())
for value in values
)

View File

@@ -96,6 +96,21 @@ class MixedName(compiled.CompiledName):
@underscore_memoization
def infer(self):
def access_to_value(parent_value, access):
if parent_value is None:
parent_context = None
else:
parent_context = parent_value.as_context()
if parent_context is None or isinstance(parent_context, MixedObject):
return _create(self._inference_state, access, parent_context=parent_context)
else:
return ValueSet({
create_cached_compiled_object(
parent_context.inference_state, access, parent_context
)
})
# TODO use logic from compiled.CompiledObjectFilter
access_paths = self.parent_context.access_handle.getattr_paths(
self.string_name,
@@ -104,12 +119,7 @@ class MixedName(compiled.CompiledName):
assert len(access_paths)
values = [None]
for access in access_paths:
values = ValueSet.from_sets(
_create(self._inference_state, access, parent_context=c)
if c is None or isinstance(c, MixedObject)
else ValueSet({create_cached_compiled_object(c.inference_state, access, c)})
for c in values
)
values = ValueSet.from_sets(access_to_value(v, access) for v in values)
return values
@property
@@ -278,7 +288,8 @@ def _create(inference_state, access_handle, parent_context, *args):
tree_node,
node_is_value=True,
node_is_object=True
)
)._value
# TODO private access!
})
if tree_node.type == 'classdef':
if not access_handle.is_class():

View File

@@ -17,7 +17,7 @@ from jedi.inference.compiled.access import _sentinel
from jedi.inference.cache import inference_state_function_cache
from jedi.inference.helpers import reraise_getitem_errors
from jedi.inference.signature import BuiltinSignature
from jedi.inference.context import AbstractContext
from jedi.inference.context import CompiledContext
class CheckAttribute(object):
@@ -264,7 +264,7 @@ class CompiledObject(Value):
return NO_VALUES
def _as_context(self):
return AbstractContext(self)
return CompiledContext(self)
class CompiledName(AbstractNameDefinition):
@@ -515,7 +515,9 @@ def _create_from_name(inference_state, compiled_object, name):
value = None
for access_path in access_paths:
value = create_cached_compiled_object(
inference_state, access_path, parent_context=value
inference_state,
access_path,
parent_context=None if value is None else value.as_context(),
)
return value

View File

@@ -118,6 +118,14 @@ class ModuleContext(AbstractContext):
for f in filters: # Python 2...
yield f
@property
def string_names(self):
return self._value.string_names
@property
def code_lines(self):
return self._value.code_lines
def get_value(self):
"""
This is the only function that converts a context back to a value.
@@ -127,6 +135,14 @@ class ModuleContext(AbstractContext):
return self._value
class NamespaceContext(AbstractContext):
def get_filters(self, until_position=None, origin_scope=None):
return self._value.get_filters()
def py__file__(self):
return self._value.py__file__()
class ClassContext(AbstractContext):
def get_filters(self, until_position=None, origin_scope=None):
yield self.get_global_filter(until_position, origin_scope)
@@ -164,3 +180,8 @@ class CompForContext(AbstractContext):
def get_filters(self, until_position=None, origin_scope=None):
yield ParserTreeFilter(self)
class CompiledContext(AbstractContext):
def get_filters(self, until_position=None, origin_scope=None):
return self._value.get_filters()

View File

@@ -93,7 +93,7 @@ def infer_import(context, tree_name, is_goto=False):
from_import_name,
name_context=context,
analysis_errors=False
) for c in types.as_context()
) for c in types
])
else:
types = types.py__getattribute__(

View File

@@ -35,7 +35,6 @@ def _iter_nodes_for_param(param_name):
# anyway
trailer = search_ancestor(argument, 'trailer')
if trailer is not None: # Make sure we're in a function
raise NotImplementedError
context = execution_context.create_context(trailer)
if _goes_to_param_name(param_name, context, name):
values = _to_callables(context, trailer)
@@ -62,17 +61,17 @@ def _goes_to_param_name(param_name, context, potential_name):
for p in found)
def _to_callables(value, trailer):
def _to_callables(context, trailer):
from jedi.inference.syntax_tree import infer_trailer
atom_expr = trailer.parent
index = atom_expr.children[0] == 'await'
# Infer atom first
values = value.infer_node(atom_expr.children[index])
values = context.infer_node(atom_expr.children[index])
for trailer2 in atom_expr.children[index + 1:]:
if trailer == trailer2:
break
values = infer_trailer(value, values, trailer2)
values = infer_trailer(context, values, trailer2)
return values

View File

@@ -153,12 +153,12 @@ def _get_paths_from_buildout_script(inference_state, buildout_script_path):
return
from jedi.inference.value import ModuleValue
module = ModuleValue(
module_context = ModuleValue(
inference_state, module_node, file_io,
string_names=None,
code_lines=get_cached_code_lines(inference_state.grammar, buildout_script_path),
).as_context()
for path in check_sys_path_modifications(module):
for path in check_sys_path_modifications(module_context):
yield path

View File

@@ -3,6 +3,7 @@ from jedi.inference.filters import DictFilter
from jedi.inference.names import ValueNameMixin, AbstractNameDefinition
from jedi.inference.base_value import Value
from jedi.inference.value.module import SubModuleDictMixin
from jedi.inference.context import NamespaceContext
class ImplicitNSName(ValueNameMixin, AbstractNameDefinition):
@@ -60,5 +61,8 @@ class ImplicitNamespaceValue(Value, SubModuleDictMixin):
def is_stub(self):
return False
def as_context(self):
return NamespaceContext(self)
def __repr__(self):
return '<%s: %s>' % (self.__class__.__name__, self._fullname)