1
0
forked from VimPlug/jedi

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 iterable
from jedi.evaluate import imports from jedi.evaluate import imports
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate.compiled import mixed
from jedi.api import keywords
from jedi.evaluate.finder import filter_definition_names from jedi.evaluate.finder import filter_definition_names
@@ -147,22 +145,10 @@ class BaseDefinition(object):
'function' 'function'
""" """
stripped = self._definition try:
if isinstance(stripped, er.InstanceElement): return self._name.parent_context.api_type
stripped = stripped.var except AttributeError:
return ''
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
def _path(self): def _path(self):
"""The path to a module/class/function definition.""" """The path to a module/class/function definition."""
@@ -576,8 +562,6 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)):
""" """
d = self._definition d = self._definition
if isinstance(d, er.InstanceElement):
d = d.var
if isinstance(d, compiled.CompiledObject): if isinstance(d, compiled.CompiledObject):
typ = d.api_type() typ = d.api_type()

View File

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

View File

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

View File

@@ -16,6 +16,8 @@ class AbstractInstanceContext(Context):
""" """
This class is used to evaluate instances. This class is used to evaluate instances.
""" """
api_type = 'instance'
def __init__(self, evaluator, parent_context, class_context, var_args): def __init__(self, evaluator, parent_context, class_context, var_args):
super(AbstractInstanceContext, self).__init__(evaluator, parent_context) super(AbstractInstanceContext, self).__init__(evaluator, parent_context)
# Generated instances are classes that are just generated by self # Generated instances are classes that are just generated by self
@@ -237,8 +239,31 @@ class InstanceNameDefinition(filters.TreeNameDefinition):
yield context 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): class InstanceClassFilter(filters.ParserTreeFilter):
name_class = InstanceNameDefinition name_class = LazyInstanceClassName
def __init__(self, evaluator, context, class_context, origin_scope): def __init__(self, evaluator, context, class_context, origin_scope):
super(InstanceClassFilter, self).__init__( super(InstanceClassFilter, self).__init__(
@@ -269,10 +294,12 @@ class InstanceClassFilter(filters.ParserTreeFilter):
return names return names
def _convert_names(self, 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): class SelfNameFilter(InstanceClassFilter):
name_class = LazyInstanceName
def _filter(self, names): def _filter(self, names):
names = self._filter_self_names(names) names = self._filter_self_names(names)
if isinstance(self._parser_scope, compiled.CompiledObject): if isinstance(self._parser_scope, compiled.CompiledObject):
@@ -298,28 +325,6 @@ class SelfNameFilter(InstanceClassFilter):
yield name 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): class InstanceVarArgs(object):
def __init__(self, instance, funcdef, var_args): def __init__(self, instance, funcdef, var_args):
self._instance = instance self._instance = instance