From 2a56323c163b64644a2e2bc65b6bc560a6dcf70c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 13 Feb 2018 20:47:43 +0100 Subject: [PATCH] Try to avoid CachedMetaClass for modules --- jedi/api/__init__.py | 3 ++- jedi/evaluate/context/module.py | 5 ++--- jedi/evaluate/imports.py | 12 ++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 92d0b43e..6354de3c 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -286,9 +286,10 @@ class Script(object): def _analysis(self): self._evaluator.is_analysis = True self._evaluator.analysis_modules = [self._module_node] + module = self._get_module() try: for node in get_executable_nodes(self._module_node): - context = self._get_module().create_context(node) + context = module.create_context(node) if node.type in ('funcdef', 'classdef'): # Resolve the decorators. tree_name_to_contexts(self._evaluator, context, node.children[1]) diff --git a/jedi/evaluate/context/module.py b/jedi/evaluate/context/module.py index ad12b9ef..56d9d93c 100644 --- a/jedi/evaluate/context/module.py +++ b/jedi/evaluate/context/module.py @@ -5,8 +5,7 @@ import os from parso import python_bytes_to_unicode -from jedi._compatibility import use_metaclass -from jedi.evaluate.cache import CachedMetaClass, evaluator_method_cache +from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.filters import GlobalNameFilter, ContextNameMixin, \ AbstractNameDefinition, ParserTreeFilter, DictFilter from jedi.evaluate import compiled @@ -41,7 +40,7 @@ class ModuleName(ContextNameMixin, AbstractNameDefinition): return self._name -class ModuleContext(use_metaclass(CachedMetaClass, TreeContext)): +class ModuleContext(TreeContext): api_type = u'module' parent_context = None diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index d0a50ac7..dfa88e01 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -46,6 +46,9 @@ class ModuleCache(object): def get(self, name): return self._name_cache[name] + def get_from_path(self, path): + return self._path_cache[path] + # This memoization is needed, because otherwise we will infinitely loop on # certain imports. @@ -468,6 +471,15 @@ class Importer(object): def _load_module(evaluator, path=None, code=None, sys_path=None, parent_module=None, module_name=None, safe_module_name=False): + try: + return evaluator.module_cache.get(module_name) + except KeyError: + pass + try: + return evaluator.module_cache.get_from_path(path) + except KeyError: + pass + if isinstance(path, ImplicitNSInfo): from jedi.evaluate.context.namespace import ImplicitNamespaceContext module = ImplicitNamespaceContext(