From 144c20579bedd3ab61c65cccb24ebd83871ad551 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 8 Jan 2015 17:53:20 +0100 Subject: [PATCH] Get rid of get_defined_names in compiled modules. --- jedi/evaluate/compiled/__init__.py | 43 ++++++++++++------------------ jedi/evaluate/iterable.py | 13 ++++----- jedi/evaluate/representation.py | 9 ++++--- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index 33ce1ac3..a1f8b2c6 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -6,7 +6,6 @@ import re import sys import os from functools import partial -from itertools import chain from jedi._compatibility import builtins as _builtins, unicode from jedi import debug @@ -137,30 +136,21 @@ class CompiledObject(Base): return CompiledObject(c, self.parent) return self - def get_defined_names(self): - return list(chain.from_iterable(self.names_dict.values())) - - # TODO still used? - if inspect.ismodule(self.obj): - return self.instance_names() - else: - return type_names + self.instance_names() - @property - @underscore_memoization def names_dict(self): - return LazyNamesDict(self._cls()) + # For compatibility with `representation.Class`. + return self.names_dicts(False)[0] - def names_dicts(self, search_global): - yield self.names_dict + def names_dicts(self, search_global, is_instance=False): + return self._names_dict_ensure_one_dict(is_instance) - @underscore_memoization - def instance_names(self): - names = [] - cls = self._cls() - for name in dir(cls.obj): - names.append(CompiledName(cls, name)) - return names + @memoize_method + def _names_dict_ensure_one_dict(self, is_instance): + """ + search_global shouldn't change the fact that there's one dict, this way + there's only one `object`. + """ + return [LazyNamesDict(self._cls(), is_instance)] def get_subscope_by_name(self, name): if name in dir(self._cls().obj): @@ -250,8 +240,9 @@ class LazyNamesDict(object): """ A names_dict instance for compiled objects, resembles the parser.tree. """ - def __init__(self, compiled_obj): + def __init__(self, compiled_obj, is_instance): self._compiled_obj = compiled_obj + self._is_instance = is_instance def __iter__(self): return (v[0].value for v in self.values()) @@ -275,8 +266,9 @@ class LazyNamesDict(object): # The dir function can be wrong. pass - if not inspect.ismodule(obj): - values.append(type_names) + # dir doesn't include the type names. + if not inspect.ismodule(obj) and obj != type and not self._is_instance: + values += _type_names_dict.values() return values @@ -486,8 +478,7 @@ def _create_from_name(module, parent, name): builtin = Builtin(_builtins) magic_function_class = CompiledObject(type(load_module), parent=builtin) generator_obj = CompiledObject(_a_generator(1.0)) -type_names = [] # Need this, because its part of the result of get_defined_names. -type_names = builtin.get_by_name('type').get_defined_names() +_type_names_dict = builtin.get_by_name('type').names_dict none_obj = builtin.get_by_name('None') false_obj = builtin.get_by_name('False') true_obj = builtin.get_by_name('True') diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index e464bfd8..29816cd4 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -48,12 +48,13 @@ class GeneratorMixin(object): def names_dicts(self, search_global=False): # is always False dct = {} executes_generator = '__next__', 'send', 'next' - for name in compiled.generator_obj.get_defined_names(): - if name.value in executes_generator: - parent = GeneratorMethod(self, name.parent) - dct[name.value] = [helpers.FakeName(name.name, parent, is_definition=True)] - else: - dct[name.value] = [name] + for names in compiled.generator_obj.names_dict.values(): + for name in names: + if name.value in executes_generator: + parent = GeneratorMethod(self, name.parent) + dct[name.value] = [helpers.FakeName(name.name, parent, is_definition=True)] + else: + dct[name.value] = [name] yield dct def get_index_types(self, evaluator, index_array): diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 7ebe7721..d202117b 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -248,7 +248,7 @@ class Instance(use_metaclass(CachedMetaClass, Executed)): for inst in self._evaluator.execute(s): yield inst._self_names_dict(add_mro=False) - for names_dict in self.base.names_dicts(search_global=False): + for names_dict in self.base.names_dicts(search_global=False, is_instance=True): yield LazyInstanceDict(self._evaluator, self, names_dict) def get_index_types(self, evaluator, index_array): @@ -475,12 +475,15 @@ class Class(use_metaclass(CachedMetaClass, Wrapper)): def params(self): return self.get_subscope_by_name('__init__').params - def names_dicts(self, search_global): + def names_dicts(self, search_global, is_instance=False): if search_global: yield self.names_dict else: for scope in self.py__mro__(self._evaluator): - yield scope.names_dict + if isinstance(scope, compiled.CompiledObject): + yield scope.names_dicts(False, is_instance)[0] + else: + yield scope.names_dict def is_class(self): return True