diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 4ce92be8..a91f95af 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -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() diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index e0d9273b..9320c4e1 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -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): diff --git a/jedi/evaluate/context.py b/jedi/evaluate/context.py index 938ec2d5..bc30cd06 100644 --- a/jedi/evaluate/context.py +++ b/jedi/evaluate/context.py @@ -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 diff --git a/jedi/evaluate/instance.py b/jedi/evaluate/instance.py index 2584026c..e49988bc 100644 --- a/jedi/evaluate/instance.py +++ b/jedi/evaluate/instance.py @@ -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