diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 1afa89b4..62c814ea 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -75,8 +75,19 @@ def apply_py__get__(context, base_context): class ClassName(TreeNameDefinition): + def __init__(self, parent_context, tree_name, name_context): + super(ClassName, self).__init__(parent_context, tree_name) + self._name_context = name_context + def infer(self): - for result_context in super(ClassName, self).infer(): + # TODO this _name_to_types might get refactored and be a part of the + # parent class. Once it is, we can probably just overwrite method to + # achieve this. + from jedi.evaluate.finder import _name_to_types + inferred = _name_to_types( + self.parent_context.evaluator, self._name_context, self.tree_name) + + for result_context in inferred: for c in apply_py__get__(result_context, self.parent_context): yield c @@ -84,6 +95,10 @@ class ClassName(TreeNameDefinition): class ClassFilter(ParserTreeFilter): name_class = ClassName + def _convert_names(self, names): + return [self.name_class(self.context, name, self._node_context) + for name in names] + class ClassContext(use_metaclass(CachedMetaClass, context.TreeContext)): """ @@ -162,13 +177,13 @@ class ClassContext(use_metaclass(CachedMetaClass, context.TreeContext)): origin_scope=origin_scope ) else: - for scope in self.py__mro__(): - if isinstance(scope, compiled.CompiledObject): - for filter in scope.get_filters(is_instance=is_instance): + for cls in self.py__mro__(): + if isinstance(cls, compiled.CompiledObject): + for filter in cls.get_filters(is_instance=is_instance): yield filter else: yield ClassFilter( - self.evaluator, self, node_context=scope, + self.evaluator, self, node_context=cls, origin_scope=origin_scope) def is_class(self): diff --git a/test/completion/classes.py b/test/completion/classes.py index c3062e13..03841628 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -493,3 +493,19 @@ B().a B.b #? int() B().b + + +# ----------------- +# With import +# ----------------- + +from import_tree.classes import Config2, BaseClass + +class Config(BaseClass): + """#884""" + +#? Config2() +Config.mode + +#? int() +Config.mode2 diff --git a/test/completion/on_import.py b/test/completion/on_import.py index dfaad45a..17abcf20 100644 --- a/test/completion/on_import.py +++ b/test/completion/on_import.py @@ -69,7 +69,7 @@ from import_tree.pkg.mod1 import not_existant, # whitespace before from import_tree.pkg.mod1 import not_existant, #? 22 ['mod1'] from import_tree.pkg. import mod1 -#? 17 ['mod1', 'mod2', 'random', 'pkg', 'rename1', 'rename2', 'recurse_class1', 'recurse_class2', 'invisible_pkg', 'flow_import'] +#? 17 ['mod1', 'mod2', 'random', 'pkg', 'rename1', 'rename2', 'classes', 'recurse_class1', 'recurse_class2', 'invisible_pkg', 'flow_import'] from import_tree. import pkg #? 18 ['pkg']