diff --git a/jedi/api.py b/jedi/api.py index 85c74acc..a6f3dd3f 100644 --- a/jedi/api.py +++ b/jedi/api.py @@ -136,7 +136,8 @@ class Script(object): bs = builtin.Builtin.scope completions = get_completions(user_stmt, bs) - if not dot: # named params have no dots + if not dot: + # add named params for call_def in self.call_signatures(): if not call_def.module.is_builtin(): for p in call_def.params: diff --git a/jedi/builtin.py b/jedi/builtin.py index 0e74c07c..01f8b3f2 100644 --- a/jedi/builtin.py +++ b/jedi/builtin.py @@ -253,9 +253,9 @@ def _generate_code(scope, mixin_funcs={}, depth=0): code += get_doc(scope) + # Remove some magic vars, (TODO why?) names = set(dir(scope)) - set(['__file__', '__name__', '__doc__', - '__path__', '__package__']) \ - | set(['mro']) + '__path__', '__package__']) classes, funcs, stmts, members = get_scope_objects(names) diff --git a/jedi/evaluate_representation.py b/jedi/evaluate_representation.py index 3b1b4508..17697da3 100644 --- a/jedi/evaluate_representation.py +++ b/jedi/evaluate_representation.py @@ -151,7 +151,7 @@ class Instance(use_metaclass(cache.CachedMetaClass, Executable)): """ names = self._get_self_attributes() - class_names = self.base.get_defined_names() + class_names = self.base.instance_names() for var in class_names: names.append(InstanceElement(self, var, True)) return names @@ -164,7 +164,7 @@ class Instance(use_metaclass(cache.CachedMetaClass, Executable)): yield self, self._get_self_attributes() names = [] - class_names = self.base.get_defined_names() + class_names = self.base.instance_names() for var in class_names: names.append(InstanceElement(self, var, True)) yield self, names @@ -270,7 +270,7 @@ class Class(use_metaclass(cache.CachedMetaClass, pr.IsScope)): return supers @cache.memoize_default(default=()) - def get_defined_names(self): + def instance_names(self): def in_iterable(name, iterable): """ checks if the name is in the variable 'iterable'. """ for i in iterable: @@ -285,12 +285,18 @@ class Class(use_metaclass(cache.CachedMetaClass, pr.IsScope)): # TODO mro! for cls in self.get_super_classes(): # Get the inherited names. - for i in cls.get_defined_names(): + for i in cls.instance_names(): if not in_iterable(i, result): super_result.append(i) result += super_result return result + @cache.memoize_default(default=()) + def get_defined_names(self): + result = self.instance_names() + type_cls = evaluate.find_name(builtin.Builtin.scope, 'type')[0] + return result + type_cls.base.get_defined_names() + def get_subscope_by_name(self, name): for sub in reversed(self.subscopes): if sub.name.get_code() == name: diff --git a/jedi/mixin/builtins.pym b/jedi/mixin/builtins.pym index 0de2ea99..19004012 100644 --- a/jedi/mixin/builtins.pym +++ b/jedi/mixin/builtins.pym @@ -222,8 +222,7 @@ class str(): def __init__(self, obj): pass -class object(): + +class type(): def mro(): - """ mro() -> list - return a type's method resolution order """ return [object] diff --git a/test/completion/classes.py b/test/completion/classes.py index 4a546539..44967f6a 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -397,3 +397,15 @@ class TestX(object): var = self.conditional_method() #? int() var + +# ----------------- +# mro method +# ----------------- + +class A(object): + pass + +#? ['mro'] +A.mro +#? [] +A().mro