Fix parameter issues in functions that are defined on self.

This commit is contained in:
Dave Halter
2016-11-13 03:29:36 +01:00
parent cb86cdec68
commit cf00c83ed8
4 changed files with 35 additions and 44 deletions

View File

@@ -17,8 +17,6 @@ from jedi.evaluate import representation as er
from jedi.evaluate import iterable
from jedi.evaluate import imports
from jedi.evaluate import compiled
from jedi.evaluate.compiled import mixed
from jedi.api import keywords
from jedi.evaluate.finder import filter_definition_names
@@ -147,22 +145,10 @@ class BaseDefinition(object):
'function'
"""
stripped = self._definition
if isinstance(stripped, er.InstanceElement):
stripped = stripped.var
if isinstance(stripped, (compiled.CompiledObject, mixed.MixedObject)):
return stripped.api_type()
elif isinstance(stripped, iterable.ArrayLiteralContext):
return 'instance'
elif isinstance(stripped, tree.Import):
return 'import'
string = type(stripped).__name__.lower().replace('wrapper', '')
if string == 'exprstmt':
return 'statement'
else:
return string
try:
return self._name.parent_context.api_type
except AttributeError:
return ''
def _path(self):
"""The path to a module/class/function definition."""
@@ -576,8 +562,6 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)):
"""
d = self._definition
if isinstance(d, er.InstanceElement):
d = d.var
if isinstance(d, compiled.CompiledObject):
typ = d.api_type()

View File

@@ -108,6 +108,7 @@ class CompiledObject(Context):
return _parse_function_doc(self.doc)
@property
def api_type(self):
obj = self.obj
if inspect.isclass(obj):

View File

@@ -3,6 +3,7 @@ from jedi.common import unite
class Context(object):
type = None # TODO remove
api_type = ''
def __init__(self, evaluator, parent_context=None):
self.evaluator = evaluator

View File

@@ -16,6 +16,8 @@ class AbstractInstanceContext(Context):
"""
This class is used to evaluate instances.
"""
api_type = 'instance'
def __init__(self, evaluator, parent_context, class_context, var_args):
super(AbstractInstanceContext, self).__init__(evaluator, parent_context)
# Generated instances are classes that are just generated by self
@@ -237,8 +239,31 @@ class InstanceNameDefinition(filters.TreeNameDefinition):
yield context
class LazyInstanceName(filters.TreeNameDefinition):
"""
This name calculates the parent_context lazily.
"""
def __init__(self, instance, class_context, tree_name):
self._instance = instance
self._class_context = class_context
self.tree_name = tree_name
@property
def parent_context(self):
return self._instance.create_instance_context(self._class_context, self.tree_name)
class LazyInstanceClassName(LazyInstanceName):
def infer(self):
for v in super(LazyInstanceClassName, self).infer():
if isinstance(v, er.FunctionContext):
yield BoundMethod(self._instance, self._class_context, v)
else:
yield v
class InstanceClassFilter(filters.ParserTreeFilter):
name_class = InstanceNameDefinition
name_class = LazyInstanceClassName
def __init__(self, evaluator, context, class_context, origin_scope):
super(InstanceClassFilter, self).__init__(
@@ -269,10 +294,12 @@ class InstanceClassFilter(filters.ParserTreeFilter):
return names
def _convert_names(self, names):
return [LazyInstanceName(self._context, self._class_context, name) for name in names]
return [self.name_class(self._context, self._class_context, name) for name in names]
class SelfNameFilter(InstanceClassFilter):
name_class = LazyInstanceName
def _filter(self, names):
names = self._filter_self_names(names)
if isinstance(self._parser_scope, compiled.CompiledObject):
@@ -298,28 +325,6 @@ class SelfNameFilter(InstanceClassFilter):
yield name
class LazyInstanceName(filters.TreeNameDefinition):
"""
This name calculates the parent_context lazily.
"""
def __init__(self, instance, class_context, tree_name):
self._instance = instance
self._class_context = class_context
self.tree_name = tree_name
@property
def parent_context(self):
return self._instance.create_instance_context(self._class_context, self.tree_name)
def infer(self):
values = super(LazyInstanceName, self).infer()
for v in values:
if isinstance(v, er.FunctionContext):
yield BoundMethod(self._instance, self._class_context, v)
else:
yield v
class InstanceVarArgs(object):
def __init__(self, instance, funcdef, var_args):
self._instance = instance