forked from VimPlug/jedi
Fix parameter issues in functions that are defined on self.
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user