diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 526bae33..df7eecb2 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -78,6 +78,7 @@ from jedi.evaluate import precedence from jedi.evaluate import param from jedi.evaluate import helpers from jedi.evaluate.context import Context +from jedi.evaluate.instance import AnonymousInstance class Evaluator(object): @@ -528,13 +529,12 @@ class Evaluator(object): elif is_funcdef: return er.AnonymousFunctionExecution(self, parent_context, scope_node) elif scope_node.type == 'classdef': + class_context = er.ClassContext(self, scope_node, parent_context) if child_is_funcdef: # anonymous instance - raise NotImplementedError + return AnonymousInstance(self, parent_context, class_context) else: - return er.ClassContext(self, scope_node, parent_context) - raise DeprecationWarning - return self.wrap(scope, parent_context=parent_context) + return class_context if node.is_scope(): scope_node = node diff --git a/jedi/evaluate/instance.py b/jedi/evaluate/instance.py index dc5d9ab7..7ca87fe3 100644 --- a/jedi/evaluate/instance.py +++ b/jedi/evaluate/instance.py @@ -1,12 +1,14 @@ from abc import abstractproperty -from jedi.common import unite, to_list +from jedi.common import unite from jedi import debug from jedi.evaluate import compiled from jedi.evaluate.filters import ParserTreeFilter, ContextName, TreeNameDefinition from jedi.evaluate.context import Context, LazyKnownContext from jedi.evaluate.cache import memoize_default +from jedi.cache import memoize_method from jedi.evaluate import representation as er +from jedi.evaluate.dynamic import search_params class AbstractInstanceContext(Context): @@ -181,6 +183,16 @@ class TreeInstance(AbstractInstanceContext): return class_context +class AnonymousInstance(TreeInstance): + def __init__(self, evaluator, parent_context, class_context): + super(AnonymousInstance, self).__init__( + evaluator, + parent_context, + class_context, + var_args=None + ) + + class CompiledInstanceClassFilter(compiled.CompiledObjectFilter): def __init__(self, evaluator, instance, compiled_object): super(CompiledInstanceClassFilter, self).__init__( @@ -313,13 +325,19 @@ class InstanceVarArgs(object): self._instance = instance self._var_args = var_args + @memoize_method + def get_var_args(self): + if self._var_args is None: + return search_params(self.evaluator, self.parent_context, self.funcdef) + return self._var_args + def unpack(self, func=None): yield None, LazyKnownContext(self._instance) - for values in self._var_args.unpack(func): + for values in self._get_var_args.unpack(func): yield values def get_calling_var_args(self): - return self._var_args.get_calling_var_args() + return self._get_var_args().get_calling_var_args() class InstanceFunctionExecution(er.FunctionExecutionContext):