Fix some of the mixed test failures

This commit is contained in:
Dave Halter
2019-06-05 00:28:48 +02:00
parent 0a56211df8
commit 1139761525
3 changed files with 28 additions and 15 deletions
+4 -4
View File
@@ -107,10 +107,6 @@ class HelperContextMixin(object):
return class2.is_same_class(self) return class2.is_same_class(self)
return self == class2 return self == class2
def is_stub(self):
# The root context knows if it's a stub or not.
return self.parent_context.is_stub()
class Context(HelperContextMixin, BaseContext): class Context(HelperContextMixin, BaseContext):
""" """
@@ -197,6 +193,10 @@ class Context(HelperContextMixin, BaseContext):
# Returns Optional[List[str]] # Returns Optional[List[str]]
return None return None
def is_stub(self):
# The root context knows if it's a stub or not.
return self.parent_context.is_stub()
def iterate_contexts(contexts, contextualized_node=None, is_async=False): def iterate_contexts(contexts, contextualized_node=None, is_async=False):
""" """
+21 -11
View File
@@ -46,6 +46,11 @@ class MixedObject(ContextWrapper):
def get_filters(self, *args, **kwargs): def get_filters(self, *args, **kwargs):
yield MixedObjectFilter(self.evaluator, self) yield MixedObjectFilter(self.evaluator, self)
def py__call__(self, arguments):
print(self._wrapped_context)
print(to_stub(self._wrapped_context))
return self._wrapped_context.py__call__(arguments)
def __repr__(self): def __repr__(self):
return '<%s: %s>' % ( return '<%s: %s>' % (
type(self).__name__, type(self).__name__,
@@ -77,10 +82,14 @@ class MixedName(compiled.CompiledName):
self.string_name, self.string_name,
default=None default=None
) )
assert len(access_paths)
context = None context = None
for access in access_paths: for access in access_paths:
return _create(self._evaluator, access, parent_context=context) if context is None or isinstance(context, MixedObject):
return context context = _create(self._evaluator, access, parent_context=context)
else:
context = create_cached_compiled_object(context.evaluator, access, context)
return ContextSet([context])
@property @property
def api_type(self): def api_type(self):
@@ -189,17 +198,18 @@ def _find_syntax_node_name(evaluator, access_handle):
@compiled_objects_cache('mixed_cache') @compiled_objects_cache('mixed_cache')
def _create(evaluator, access_handle, parent_context, *args): def _create(evaluator, access_handle, parent_context, *args):
compiled_object = create_cached_compiled_object( compiled_object = create_cached_compiled_object(
evaluator, access_handle, parent_context=parent_context.compiled_object) evaluator,
access_handle,
parent_context=parent_context and parent_context.compiled_object
)
result = _find_syntax_node_name(evaluator, access_handle) result = _find_syntax_node_name(evaluator, access_handle)
if result is None: if result is None:
return ContextSet([compiled_object]) return compiled_object
module_node, tree_node, file_io, code_lines = result module_node, tree_node, file_io, code_lines = result
if parent_context.tree_node.get_root_node() == module_node: if parent_context is None:
module_context = parent_context.get_root_context()
else:
# TODO this __name__ is probably wrong. # TODO this __name__ is probably wrong.
name = compiled_object.get_root_context().py__name__() name = compiled_object.get_root_context().py__name__()
string_names = tuple(name.split('.')) string_names = tuple(name.split('.'))
@@ -212,6 +222,9 @@ def _create(evaluator, access_handle, parent_context, *args):
) )
if name is not None: if name is not None:
evaluator.module_cache.add(string_names, ContextSet([module_context])) evaluator.module_cache.add(string_names, ContextSet([module_context]))
else:
assert parent_context.tree_node.get_root_node() == module_node
module_context = parent_context.get_root_context()
tree_context = module_context.create_context( tree_context = module_context.create_context(
tree_node, tree_node,
@@ -223,7 +236,4 @@ def _create(evaluator, access_handle, parent_context, *args):
# Is an instance, not a class. # Is an instance, not a class.
tree_context, = execute_evaluated(tree_context) tree_context, = execute_evaluated(tree_context)
return ContextSet({ return MixedObject(compiled_object, tree_context=tree_context)
MixedObject(compiled_object, tree_context=c)
for c in to_stub(tree_context) or [tree_context]
})
+3
View File
@@ -248,6 +248,9 @@ class CompiledInstance(AbstractInstanceContext):
return lazy_context.infer() return lazy_context.infer()
def is_stub(self):
return False
class TreeInstance(AbstractInstanceContext): class TreeInstance(AbstractInstanceContext):
def __init__(self, evaluator, parent_context, class_context, var_args): def __init__(self, evaluator, parent_context, class_context, var_args):